pax_global_header00006660000000000000000000000064122332751340014514gustar00rootroot0000000000000052 comment=ca8587893d7bf78b03f396f9136042727299393b clementine-1.2.0+dfsg/000077500000000000000000000000001223327513400145565ustar00rootroot00000000000000clementine-1.2.0+dfsg/.tx/000077500000000000000000000000001223327513400152675ustar00rootroot00000000000000clementine-1.2.0+dfsg/.tx/config000066400000000000000000000002471223327513400164620ustar00rootroot00000000000000[main] host = https://www.transifex.net [clementine.clementineplayer] file_filter = src/translations/.po source_file = src/translations/en.po source_lang = en clementine-1.2.0+dfsg/3rdparty/000077500000000000000000000000001223327513400163265ustar00rootroot00000000000000clementine-1.2.0+dfsg/3rdparty/gmock/000077500000000000000000000000001223327513400174265ustar00rootroot00000000000000clementine-1.2.0+dfsg/3rdparty/gmock/CHANGES000066400000000000000000000055251223327513400204300ustar00rootroot00000000000000Changes 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.0+dfsg/3rdparty/gmock/CONTRIBUTORS000066400000000000000000000025311223327513400213070ustar00rootroot00000000000000# 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.0+dfsg/3rdparty/gmock/COPYING000066400000000000000000000027031223327513400204630ustar00rootroot00000000000000Copyright 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.0+dfsg/3rdparty/gmock/README000066400000000000000000000322661223327513400203170ustar00rootroot00000000000000Google 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.0+dfsg/3rdparty/gmock/gtest/000077500000000000000000000000001223327513400205545ustar00rootroot00000000000000clementine-1.2.0+dfsg/3rdparty/gmock/gtest/CHANGES000066400000000000000000000073001223327513400215470ustar00rootroot00000000000000Changes 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.0+dfsg/3rdparty/gmock/gtest/CONTRIBUTORS000066400000000000000000000024461223327513400224420ustar00rootroot00000000000000# 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.0+dfsg/3rdparty/gmock/gtest/COPYING000066400000000000000000000027031223327513400216110ustar00rootroot00000000000000Copyright 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.0+dfsg/3rdparty/gmock/gtest/README000066400000000000000000000352671223327513400214510ustar00rootroot00000000000000Google 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.0+dfsg/3rdparty/gmock/gtest/codegear/000077500000000000000000000000001223327513400223255ustar00rootroot00000000000000clementine-1.2.0+dfsg/3rdparty/gmock/gtest/codegear/gtest.cbproj000066400000000000000000000245771223327513400246730ustar00rootroot00000000000000 {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.0+dfsg/3rdparty/gmock/gtest/codegear/gtest.groupproj000066400000000000000000000040151223327513400254240ustar00rootroot00000000000000 {c1d923e0-6cba-4332-9b6f-3420acbf5091} Default.Personality clementine-1.2.0+dfsg/3rdparty/gmock/gtest/codegear/gtest_all.cc000066400000000000000000000035571223327513400246240ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/gtest/codegear/gtest_link.cc000066400000000000000000000037611223327513400250060ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/gtest/codegear/gtest_main.cbproj000066400000000000000000000207261223327513400256670ustar00rootroot00000000000000 {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.0+dfsg/3rdparty/gmock/gtest/codegear/gtest_unittest.cbproj000066400000000000000000000211121223327513400266100ustar00rootroot00000000000000 {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.0+dfsg/3rdparty/gmock/gtest/include/000077500000000000000000000000001223327513400221775ustar00rootroot00000000000000clementine-1.2.0+dfsg/3rdparty/gmock/gtest/include/gtest/000077500000000000000000000000001223327513400233255ustar00rootroot00000000000000clementine-1.2.0+dfsg/3rdparty/gmock/gtest/include/gtest/gtest-death-test.h000066400000000000000000000255101223327513400266670ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/gtest/include/gtest/gtest-message.h000066400000000000000000000202521223327513400262470ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/gtest/include/gtest/gtest-param-test.h000066400000000000000000002217741223327513400267140ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/gtest/include/gtest/gtest-param-test.h.pump000066400000000000000000000421061223327513400276620ustar00rootroot00000000000000$$ -*- 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.0+dfsg/3rdparty/gmock/gtest/include/gtest/gtest-spi.h000066400000000000000000000233351223327513400254230ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/gtest/include/gtest/gtest-test-part.h000066400000000000000000000145051223327513400265520ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/gtest/include/gtest/gtest-typed-test.h000066400000000000000000000236601223327513400267330ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/gtest/include/gtest/gtest.h000066400000000000000000002300241223327513400246250ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/gtest/include/gtest/gtest_pred_impl.h000066400000000000000000000344141223327513400266650ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/gtest/include/gtest/gtest_prod.h000066400000000000000000000044241223327513400256540ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/gtest/include/gtest/internal/000077500000000000000000000000001223327513400251415ustar00rootroot00000000000000clementine-1.2.0+dfsg/3rdparty/gmock/gtest/include/gtest/internal/gtest-death-test-internal.h000066400000000000000000000270361223327513400323220ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/gtest/include/gtest/internal/gtest-filepath.h000066400000000000000000000227411223327513400302400ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/gtest/include/gtest/internal/gtest-internal.h000066400000000000000000001053141223327513400302560ustar00rootroot00000000000000// 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_ clementine-1.2.0+dfsg/3rdparty/gmock/gtest/include/gtest/internal/gtest-linked_ptr.h000066400000000000000000000201621223327513400305720ustar00rootroot00000000000000// 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_ clementine-1.2.0+dfsg/3rdparty/gmock/gtest/include/gtest/internal/gtest-param-util-generated.h000066400000000000000000005123221223327513400324520ustar00rootroot00000000000000// 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_ clementine-1.2.0+dfsg/3rdparty/gmock/gtest/include/gtest/internal/gtest-param-util-generated.h.pump000066400000000000000000000222641223327513400334330ustar00rootroot00000000000000$$ -*- 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_ clementine-1.2.0+dfsg/3rdparty/gmock/gtest/include/gtest/internal/gtest-param-util.h000066400000000000000000000574451223327513400305300ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/gtest/include/gtest/internal/gtest-port.h000066400000000000000000001452441223327513400274340ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/gtest/include/gtest/internal/gtest-string.h000066400000000000000000000324111223327513400277450ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/gtest/include/gtest/internal/gtest-tuple.h000066400000000000000000000667311223327513400276040ustar00rootroot00000000000000// 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_ clementine-1.2.0+dfsg/3rdparty/gmock/gtest/include/gtest/internal/gtest-tuple.h.pump000066400000000000000000000220051223327513400305460ustar00rootroot00000000000000$$ -*- 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.0+dfsg/3rdparty/gmock/gtest/include/gtest/internal/gtest-type-util.h000066400000000000000000005520241223327513400304020ustar00rootroot00000000000000// 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_ clementine-1.2.0+dfsg/3rdparty/gmock/gtest/include/gtest/internal/gtest-type-util.h.pump000066400000000000000000000214671223327513400313640ustar00rootroot00000000000000$$ -*- 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.0+dfsg/3rdparty/gmock/gtest/src/000077500000000000000000000000001223327513400213435ustar00rootroot00000000000000clementine-1.2.0+dfsg/3rdparty/gmock/gtest/src/gtest-all.cc000066400000000000000000000041201223327513400235430ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/gtest/src/gtest-death-test.cc000066400000000000000000001265231223327513400250510ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/gtest/src/gtest-filepath.cc000066400000000000000000000336071223327513400246030ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/gtest/src/gtest-internal-inl.h000066400000000000000000001216601223327513400252420ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/gtest/src/gtest-port.cc000066400000000000000000000567251223327513400240010ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/gtest/src/gtest-test-part.cc000066400000000000000000000101451223327513400247220ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/gtest/src/gtest-typed-test.cc000066400000000000000000000072431223327513400251060ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/gtest/src/gtest.cc000066400000000000000000005155331223327513400230140ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/gtest/src/gtest_main.cc000066400000000000000000000033411223327513400240050ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/include/000077500000000000000000000000001223327513400210515ustar00rootroot00000000000000clementine-1.2.0+dfsg/3rdparty/gmock/include/gmock/000077500000000000000000000000001223327513400221515ustar00rootroot00000000000000clementine-1.2.0+dfsg/3rdparty/gmock/include/gmock/gmock-actions.h000066400000000000000000001053211223327513400250620ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/include/gmock/gmock-cardinalities.h000066400000000000000000000131711223327513400262360ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/include/gmock/gmock-generated-actions.h000066400000000000000000003154431223327513400270260ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/include/gmock/gmock-generated-actions.h.pump000066400000000000000000000657351223327513400300140ustar00rootroot00000000000000$$ -*- 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_ clementine-1.2.0+dfsg/3rdparty/gmock/include/gmock/gmock-generated-function-mockers.h000066400000000000000000001170201223327513400306430ustar00rootroot00000000000000// 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_ clementine-1.2.0+dfsg/3rdparty/gmock/include/gmock/gmock-generated-function-mockers.h.pump000066400000000000000000000176421223327513400316340ustar00rootroot00000000000000$$ -*- 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.0+dfsg/3rdparty/gmock/include/gmock/gmock-generated-matchers.h000066400000000000000000002160341223327513400271700ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/include/gmock/gmock-generated-matchers.h.pump000066400000000000000000000476441223327513400301610ustar00rootroot00000000000000$$ -*- 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.0+dfsg/3rdparty/gmock/include/gmock/gmock-generated-nice-strict.h000066400000000000000000000260661223327513400276120ustar00rootroot00000000000000// 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_ clementine-1.2.0+dfsg/3rdparty/gmock/include/gmock/gmock-generated-nice-strict.h.pump000066400000000000000000000133211223327513400305600ustar00rootroot00000000000000$$ -*- 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.0+dfsg/3rdparty/gmock/include/gmock/gmock-matchers.h000066400000000000000000003141221223327513400252310ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/include/gmock/gmock-more-actions.h000066400000000000000000000176141223327513400260310ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/include/gmock/gmock-printers.h000066400000000000000000000651551223327513400253020ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/include/gmock/gmock-spec-builders.h000066400000000000000000002045431223327513400261710ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/include/gmock/gmock.h000066400000000000000000000070331223327513400234250ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/include/gmock/internal/000077500000000000000000000000001223327513400237655ustar00rootroot00000000000000clementine-1.2.0+dfsg/3rdparty/gmock/include/gmock/internal/gmock-generated-internal-utils.h000066400000000000000000000261371223327513400321530ustar00rootroot00000000000000// 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_ clementine-1.2.0+dfsg/3rdparty/gmock/include/gmock/internal/gmock-generated-internal-utils.h.pump000066400000000000000000000114271223327513400331270ustar00rootroot00000000000000$$ -*- 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.0+dfsg/3rdparty/gmock/include/gmock/internal/gmock-internal-utils.h000066400000000000000000000714501223327513400302150ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/include/gmock/internal/gmock-port.h000066400000000000000000000206661223327513400262320ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/src/000077500000000000000000000000001223327513400202155ustar00rootroot00000000000000clementine-1.2.0+dfsg/3rdparty/gmock/src/gmock-all.cc000066400000000000000000000042071223327513400223750ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/src/gmock-cardinalities.cc000066400000000000000000000122021223327513400244320ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/src/gmock-internal-utils.cc000066400000000000000000000147621223327513400246060ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/src/gmock-matchers.cc000066400000000000000000000157521223327513400234420ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/src/gmock-printers.cc000066400000000000000000000245721223327513400235020ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/src/gmock-spec-builders.cc000066400000000000000000000403741223327513400243730ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/src/gmock.cc000066400000000000000000000154211223327513400216270ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/gmock/src/gmock_main.cc000066400000000000000000000050121223327513400226260ustar00rootroot00000000000000// 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.0+dfsg/3rdparty/libmygpo-qt/000077500000000000000000000000001223327513400205725ustar00rootroot00000000000000clementine-1.2.0+dfsg/3rdparty/libmygpo-qt/AddRemoveResult.cpp000066400000000000000000000104471223327513400243510ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/AddRemoveResult.h000066400000000000000000000054361223327513400240200ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/AddRemoveResult_p.h000066400000000000000000000046021223327513400243310ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/ApiRequest.cpp000066400000000000000000000547451223327513400233770ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/ApiRequest.h000066400000000000000000000426571223327513400230430ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/ApiRequest_p.h000066400000000000000000000130361223327513400233470ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/CMakeLists.txt000066400000000000000000000042741223327513400233410ustar00rootroot00000000000000# 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.0+dfsg/3rdparty/libmygpo-qt/Config.cpp000066400000000000000000000072471223327513400225150ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/Config.h000066400000000000000000000043521223327513400221540ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/Config_p.h000066400000000000000000000041131223327513400224660ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/Device.cpp000066400000000000000000000065731223327513400225100ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/Device.h000066400000000000000000000050141223327513400221420ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/DeviceList.cpp000066400000000000000000000071741223327513400233420ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/DeviceList.h000066400000000000000000000051141223327513400227770ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/DeviceList_p.h000066400000000000000000000044251223327513400233220ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/DeviceSyncResult.cpp000066400000000000000000000110221223327513400245250ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/DeviceSyncResult.h000066400000000000000000000052431223327513400242020ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/DeviceSyncResult_p.h000066400000000000000000000044301223327513400245160ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/DeviceUpdates.cpp000066400000000000000000000121231223327513400240220ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/DeviceUpdates.h000066400000000000000000000056231223327513400234760ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/DeviceUpdates_p.h000066400000000000000000000047651223327513400240230ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/Device_p.h000066400000000000000000000040671223327513400224700ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/Episode.cpp000066400000000000000000000155021223327513400226710ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/Episode.h000066400000000000000000000065661223327513400223500ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/EpisodeAction.cpp000066400000000000000000000201671223327513400240320ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/EpisodeAction.h000066400000000000000000000072111223327513400234720ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/EpisodeActionList.cpp000066400000000000000000000113511223327513400246610ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/EpisodeActionList.h000066400000000000000000000054071223327513400243330ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/EpisodeActionList_p.h000066400000000000000000000046031223327513400246470ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/EpisodeAction_p.h000066400000000000000000000054701223327513400240160ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/EpisodeList.cpp000066400000000000000000000074121223327513400235260ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/EpisodeList.h000066400000000000000000000050751223327513400231760ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/EpisodeList_p.h000066400000000000000000000043661223327513400235170ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/Episode_p.h000066400000000000000000000052751223327513400226630ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/JsonCreator.cpp000066400000000000000000000203201223327513400235240ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/JsonCreator.h000066400000000000000000000053741223327513400232050ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/Podcast.cpp000066400000000000000000000130531223327513400226750ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/Podcast.h000066400000000000000000000063621223327513400223470ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/PodcastList.cpp000066400000000000000000000074531223327513400235400ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/PodcastList.h000066400000000000000000000050711223327513400231770ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/PodcastList_p.h000066400000000000000000000044071223327513400235200ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/Podcast_p.h000066400000000000000000000051311223327513400226570ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/RequestHandler.cpp000066400000000000000000000063231223327513400242300ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/RequestHandler.h000066400000000000000000000072111223327513400236720ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/Settings.cpp000066400000000000000000000061321223327513400231000ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/Settings.h000066400000000000000000000047451223327513400225550ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/Settings_p.h000066400000000000000000000042761223327513400230730ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/Tag.cpp000066400000000000000000000051021223327513400220070ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/Tag.h000066400000000000000000000043351223327513400214630ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/TagList.cpp000066400000000000000000000072161223327513400226530ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/TagList.h000066400000000000000000000050341223327513400223140ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/TagList_p.h000066400000000000000000000043131223327513400226320ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/Tag_p.h000066400000000000000000000037131223327513400220010ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/UrlBuilder.cpp000066400000000000000000000213451223327513400233540ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/UrlBuilder.h000066400000000000000000000137231223327513400230220ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/Version.h.in000066400000000000000000000033001223327513400227710ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/libmygpo-qt/mygpo_export.h000066400000000000000000000036141223327513400235030ustar00rootroot00000000000000/*************************************************************************** * 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.0+dfsg/3rdparty/qocoa/000077500000000000000000000000001223327513400174305ustar00rootroot00000000000000clementine-1.2.0+dfsg/3rdparty/qocoa/CMakeLists.txt000066400000000000000000000012301223327513400221640ustar00rootroot00000000000000set(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.0+dfsg/3rdparty/qocoa/LICENSE.txt000066400000000000000000000020431223327513400212520ustar00rootroot00000000000000Copyright (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.0+dfsg/3rdparty/qocoa/Qocoa.pro000066400000000000000000000010751223327513400212170ustar00rootroot00000000000000SOURCES += 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.0+dfsg/3rdparty/qocoa/README.md000066400000000000000000000032461223327513400207140ustar00rootroot00000000000000# 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.0+dfsg/3rdparty/qocoa/TODO.md000066400000000000000000000004021223327513400205130ustar00rootroot00000000000000Widgets 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.0+dfsg/3rdparty/qocoa/gallery.cpp000066400000000000000000000047771223327513400216120ustar00rootroot00000000000000#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.0+dfsg/3rdparty/qocoa/gallery.h000066400000000000000000000002621223327513400212400ustar00rootroot00000000000000#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.0+dfsg/3rdparty/qocoa/gallery.png000066400000000000000000001223231223327513400216000ustar00rootroot00000000000000PNG  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.0+dfsg/3rdparty/qocoa/main.cpp000066400000000000000000000003151223327513400210570ustar00rootroot00000000000000#include #include "gallery.h" int main(int argc, char *argv[]) { QApplication application(argc, argv); Gallery gallery; gallery.show(); return application.exec(); } clementine-1.2.0+dfsg/3rdparty/qocoa/qbutton.h000066400000000000000000000020521223327513400212740ustar00rootroot00000000000000#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.0+dfsg/3rdparty/qocoa/qbutton_mac.mm000066400000000000000000000155541223327513400223110ustar00rootroot00000000000000/* 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.0+dfsg/3rdparty/qocoa/qbutton_nonmac.cpp000066400000000000000000000047541223327513400231750ustar00rootroot00000000000000/* 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.0+dfsg/3rdparty/qocoa/qocoa_mac.h000066400000000000000000000036771223327513400215400ustar00rootroot00000000000000/* 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.0+dfsg/3rdparty/qocoa/qprogressindicatorspinning.h000066400000000000000000000013261223327513400252730ustar00rootroot00000000000000#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.0+dfsg/3rdparty/qocoa/qprogressindicatorspinning_mac.mm000066400000000000000000000045441223327513400263020ustar00rootroot00000000000000/* 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.0+dfsg/3rdparty/qocoa/qprogressindicatorspinning_nonmac.cpp000066400000000000000000000045241223327513400271640ustar00rootroot00000000000000/* 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.0+dfsg/3rdparty/qocoa/qprogressindicatorspinning_nonmac.gif000066400000000000000000000062101223327513400271410ustar00rootroot00000000000000GIF89a Ƅ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.0+dfsg/3rdparty/qocoa/qprogressindicatorspinning_nonmac.qrc000066400000000000000000000001711223327513400271610ustar00rootroot00000000000000 qprogressindicatorspinning_nonmac.gif clementine-1.2.0+dfsg/3rdparty/qocoa/qsearchfield.h000066400000000000000000000015751223327513400222430ustar00rootroot00000000000000#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.0+dfsg/3rdparty/qocoa/qsearchfield_mac.mm000066400000000000000000000143261223327513400232430ustar00rootroot00000000000000/* 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 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(); } 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])); } -(void)controlTextDidEndEditing:(NSNotification*)notification { // No Q_ASSERT here as it is called on destruction. if (pimpl) pimpl->textDidEndEditing(); if ([[[notification userInfo] objectForKey:@"NSTextMovement"] intValue] == NSReturnTextMovement) pimpl->returnPressed(); } @end namespace { static const unsigned short kKeycodeA = 0; static const unsigned short kKeycodeX = 7; static const unsigned short kKeycodeC = 8; static const unsigned short kKeycodeV = 9; } // namespace @interface QocoaSearchField : NSSearchField -(BOOL)performKeyEquivalent:(NSEvent*)event; @end @implementation QocoaSearchField -(BOOL)performKeyEquivalent:(NSEvent*)event { if ([event type] == NSKeyDown && [event modifierFlags] & NSCommandKeyMask) { const unsigned short keyCode = [event keyCode]; if (keyCode == kKeycodeA) // Cmd+a { [self performSelector:@selector(selectText:)]; return YES; } else if (keyCode == kKeycodeC) // Cmd+c { QClipboard* clipboard = QApplication::clipboard(); clipboard->setText(toQString([self stringValue])); return YES; } else if (keyCode == kKeycodeV) // Cmd+v { QClipboard* clipboard = QApplication::clipboard(); [self setStringValue:fromQString(clipboard->text())]; return YES; } else if (keyCode == kKeycodeX) // 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)]; [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) { 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.0+dfsg/3rdparty/qocoa/qsearchfield_nonmac.cpp000066400000000000000000000132161223327513400241240ustar00rootroot00000000000000/* 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.0+dfsg/3rdparty/qtiocompressor/000077500000000000000000000000001223327513400214175ustar00rootroot00000000000000clementine-1.2.0+dfsg/3rdparty/qtiocompressor/CMakeLists.txt000066400000000000000000000004611223327513400241600ustar00rootroot00000000000000cmake_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.0+dfsg/3rdparty/qtiocompressor/LGPL_EXCEPTION.txt000066400000000000000000000021661223327513400243410ustar00rootroot00000000000000Nokia 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.0+dfsg/3rdparty/qtiocompressor/LICENSE.GPL3000066400000000000000000001045131223327513400231340ustar00rootroot00000000000000 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.0+dfsg/3rdparty/qtiocompressor/QtIOCompressor000066400000000000000000000000341223327513400242300ustar00rootroot00000000000000#include "qtiocompressor.h" clementine-1.2.0+dfsg/3rdparty/qtiocompressor/qtiocompressor.cpp000066400000000000000000000507041223327513400252220ustar00rootroot00000000000000/**************************************************************************** ** ** 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.0+dfsg/3rdparty/qtiocompressor/qtiocompressor.h000066400000000000000000000071631223327513400246700ustar00rootroot00000000000000/**************************************************************************** ** ** 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.0+dfsg/3rdparty/qtsingleapplication/000077500000000000000000000000001223327513400224005ustar00rootroot00000000000000clementine-1.2.0+dfsg/3rdparty/qtsingleapplication/CMakeLists.txt000066400000000000000000000011241223327513400251360ustar00rootroot00000000000000cmake_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.0+dfsg/3rdparty/qtsingleapplication/LICENSE.LGPL000066400000000000000000000635041223327513400241520ustar00rootroot00000000000000 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.0+dfsg/3rdparty/qtsingleapplication/QtLockedFile000066400000000000000000000000321223327513400246240ustar00rootroot00000000000000#include "qtlockedfile.h" clementine-1.2.0+dfsg/3rdparty/qtsingleapplication/QtSingleApplication000066400000000000000000000000411223327513400262300ustar00rootroot00000000000000#include "qtsingleapplication.h" clementine-1.2.0+dfsg/3rdparty/qtsingleapplication/qtlocalpeer.cpp000066400000000000000000000155071223327513400254270ustar00rootroot00000000000000/**************************************************************************** ** ** 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); 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)); } clementine-1.2.0+dfsg/3rdparty/qtsingleapplication/qtlocalpeer.h000066400000000000000000000060431223327513400250670ustar00rootroot00000000000000/**************************************************************************** ** ** 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()); 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; }; clementine-1.2.0+dfsg/3rdparty/qtsingleapplication/qtlockedfile.cpp000066400000000000000000000143361223327513400255610ustar00rootroot00000000000000/**************************************************************************** ** ** 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.0+dfsg/3rdparty/qtsingleapplication/qtlockedfile.h000066400000000000000000000066661223327513400252350ustar00rootroot00000000000000/**************************************************************************** ** ** 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.0+dfsg/3rdparty/qtsingleapplication/qtlockedfile_unix.cpp000066400000000000000000000072101223327513400266150ustar00rootroot00000000000000/**************************************************************************** ** ** 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.0+dfsg/3rdparty/qtsingleapplication/qtlockedfile_win.cpp000066400000000000000000000151541223327513400264350ustar00rootroot00000000000000/**************************************************************************** ** ** 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.0+dfsg/3rdparty/qtsingleapplication/qtsingleapplication.cpp000066400000000000000000000304371223327513400271650ustar00rootroot00000000000000/**************************************************************************** ** ** 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.0+dfsg/3rdparty/qtsingleapplication/qtsingleapplication.h000066400000000000000000000103221223327513400266210ustar00rootroot00000000000000/**************************************************************************** ** ** 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.0+dfsg/3rdparty/qtsingleapplication/qtsingleapplication.patch000066400000000000000000000204061223327513400274750ustar00rootroot00000000000000diff -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.0+dfsg/3rdparty/qtsingleapplication/qtsinglecoreapplication.cpp000066400000000000000000000142051223327513400300310ustar00rootroot00000000000000/**************************************************************************** ** ** 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.0+dfsg/3rdparty/qtsingleapplication/qtsinglecoreapplication.h000066400000000000000000000056271223327513400275060ustar00rootroot00000000000000/**************************************************************************** ** ** 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.0+dfsg/3rdparty/sha2/000077500000000000000000000000001223327513400171635ustar00rootroot00000000000000clementine-1.2.0+dfsg/3rdparty/sha2/CMakeLists.txt000066400000000000000000000001051223327513400217170ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.6) add_library(sha2 STATIC sha2.c) clementine-1.2.0+dfsg/3rdparty/sha2/sha2.c000066400000000000000000000765001223327513400201740ustar00rootroot00000000000000/* * 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 /* * 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) #define SHA384_SHORT_BLOCK_LENGTH (SHA384_BLOCK_LENGTH - 16) #define SHA512_SHORT_BLOCK_LENGTH (SHA512_BLOCK_LENGTH - 16) /*** 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)))) /* 64-bit Rotate-right (used in SHA-384 and SHA-512): */ #define S64(b,x) (((x) >> (b)) | ((x) << (64 - (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))) /* Four of six logical functions used in SHA-384 and SHA-512: */ #define Sigma0_512(x) (S64(28, (x)) ^ S64(34, (x)) ^ S64(39, (x))) #define Sigma1_512(x) (S64(14, (x)) ^ S64(18, (x)) ^ S64(41, (x))) #define sigma0_512(x) (S64( 1, (x)) ^ S64( 8, (x)) ^ R( 7, (x))) #define sigma1_512(x) (S64(19, (x)) ^ S64(61, (x)) ^ R( 6, (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 SHA512_Last(SHA512_CTX*); void SHA256_Transform(SHA256_CTX*, const sha2_word32*); void SHA512_Transform(SHA512_CTX*, const sha2_word64*); /*** 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 }; /* Hash constant words K for SHA-384 and SHA-512: */ const static sha2_word64 K512[80] = { 0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL, 0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL, 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL, 0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL, 0xd807aa98a3030242ULL, 0x12835b0145706fbeULL, 0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL, 0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL, 0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL, 0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL, 0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL, 0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL, 0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL, 0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL, 0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL, 0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL, 0x06ca6351e003826fULL, 0x142929670a0e6e70ULL, 0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL, 0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL, 0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL, 0x81c2c92e47edaee6ULL, 0x92722c851482353bULL, 0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL, 0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL, 0xd192e819d6ef5218ULL, 0xd69906245565a910ULL, 0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL, 0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL, 0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL, 0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL, 0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL, 0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL, 0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL, 0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL, 0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL, 0xca273eceea26619cULL, 0xd186b8c721c0c207ULL, 0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL, 0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL, 0x113f9804bef90daeULL, 0x1b710b35131c471bULL, 0x28db77f523047d84ULL, 0x32caab7b40c72493ULL, 0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL, 0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL, 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL }; /* Initial hash value H for SHA-384 */ const static sha2_word64 sha384_initial_hash_value[8] = { 0xcbbb9d5dc1059ed8ULL, 0x629a292a367cd507ULL, 0x9159015a3070dd17ULL, 0x152fecd8f70e5939ULL, 0x67332667ffc00b31ULL, 0x8eb44a8768581511ULL, 0xdb0c2e0d64f98fa7ULL, 0x47b5481dbefa4fa4ULL }; /* Initial hash value H for SHA-512 */ const static sha2_word64 sha512_initial_hash_value[8] = { 0x6a09e667f3bcc908ULL, 0xbb67ae8584caa73bULL, 0x3c6ef372fe94f82bULL, 0xa54ff53a5f1d36f1ULL, 0x510e527fade682d1ULL, 0x9b05688c2b3e6c1fULL, 0x1f83d9abfb41bd6bULL, 0x5be0cd19137e2179ULL }; /* * 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); } /*** SHA-512: *********************************************************/ void SHA512_Init(SHA512_CTX* context) { if (context == (SHA512_CTX*)0) { return; } MEMCPY_BCOPY(context->state, sha512_initial_hash_value, SHA512_DIGEST_LENGTH); MEMSET_BZERO(context->buffer, SHA512_BLOCK_LENGTH); context->bitcount[0] = context->bitcount[1] = 0; } #ifdef SHA2_UNROLL_TRANSFORM /* Unrolled SHA-512 round macros: */ #if BYTE_ORDER == LITTLE_ENDIAN #define ROUND512_0_TO_15(a,b,c,d,e,f,g,h) \ REVERSE64(*data++, W512[j]); \ T1 = (h) + Sigma1_512(e) + Ch((e), (f), (g)) + \ K512[j] + W512[j]; \ (d) += T1, \ (h) = T1 + Sigma0_512(a) + Maj((a), (b), (c)), \ j++ #else /* BYTE_ORDER == LITTLE_ENDIAN */ #define ROUND512_0_TO_15(a,b,c,d,e,f,g,h) \ T1 = (h) + Sigma1_512(e) + Ch((e), (f), (g)) + \ K512[j] + (W512[j] = *data++); \ (d) += T1; \ (h) = T1 + Sigma0_512(a) + Maj((a), (b), (c)); \ j++ #endif /* BYTE_ORDER == LITTLE_ENDIAN */ #define ROUND512(a,b,c,d,e,f,g,h) \ s0 = W512[(j+1)&0x0f]; \ s0 = sigma0_512(s0); \ s1 = W512[(j+14)&0x0f]; \ s1 = sigma1_512(s1); \ T1 = (h) + Sigma1_512(e) + Ch((e), (f), (g)) + K512[j] + \ (W512[j&0x0f] += s1 + W512[(j+9)&0x0f] + s0); \ (d) += T1; \ (h) = T1 + Sigma0_512(a) + Maj((a), (b), (c)); \ j++ void SHA512_Transform(SHA512_CTX* context, const sha2_word64* data) { sha2_word64 a, b, c, d, e, f, g, h, s0, s1; sha2_word64 T1, *W512 = (sha2_word64*)context->buffer; int j; /* 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 { ROUND512_0_TO_15(a,b,c,d,e,f,g,h); ROUND512_0_TO_15(h,a,b,c,d,e,f,g); ROUND512_0_TO_15(g,h,a,b,c,d,e,f); ROUND512_0_TO_15(f,g,h,a,b,c,d,e); ROUND512_0_TO_15(e,f,g,h,a,b,c,d); ROUND512_0_TO_15(d,e,f,g,h,a,b,c); ROUND512_0_TO_15(c,d,e,f,g,h,a,b); ROUND512_0_TO_15(b,c,d,e,f,g,h,a); } while (j < 16); /* Now for the remaining rounds up to 79: */ do { ROUND512(a,b,c,d,e,f,g,h); ROUND512(h,a,b,c,d,e,f,g); ROUND512(g,h,a,b,c,d,e,f); ROUND512(f,g,h,a,b,c,d,e); ROUND512(e,f,g,h,a,b,c,d); ROUND512(d,e,f,g,h,a,b,c); ROUND512(c,d,e,f,g,h,a,b); ROUND512(b,c,d,e,f,g,h,a); } while (j < 80); /* 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 SHA512_Transform(SHA512_CTX* context, const sha2_word64* data) { sha2_word64 a, b, c, d, e, f, g, h, s0, s1; sha2_word64 T1, T2, *W512 = (sha2_word64*)context->buffer; int j; /* 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 /* Convert TO host byte order */ REVERSE64(*data++, W512[j]); /* Apply the SHA-512 compression function to update a..h */ T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] + W512[j]; #else /* BYTE_ORDER == LITTLE_ENDIAN */ /* Apply the SHA-512 compression function to update a..h with copy */ T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] + (W512[j] = *data++); #endif /* BYTE_ORDER == LITTLE_ENDIAN */ T2 = Sigma0_512(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 = W512[(j+1)&0x0f]; s0 = sigma0_512(s0); s1 = W512[(j+14)&0x0f]; s1 = sigma1_512(s1); /* Apply the SHA-512 compression function to update a..h */ T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] + (W512[j&0x0f] += s1 + W512[(j+9)&0x0f] + s0); T2 = Sigma0_512(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 < 80); /* 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 SHA512_Update(SHA512_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 != (SHA512_CTX*)0 && data != (sha2_byte*)0); usedspace = (context->bitcount[0] >> 3) % SHA512_BLOCK_LENGTH; if (usedspace > 0) { /* Calculate how much free space is available in the buffer */ freespace = SHA512_BLOCK_LENGTH - usedspace; if (len >= freespace) { /* Fill the buffer completely and process it */ MEMCPY_BCOPY(&context->buffer[usedspace], data, freespace); ADDINC128(context->bitcount, freespace << 3); len -= freespace; data += freespace; SHA512_Transform(context, (sha2_word64*)context->buffer); } else { /* The buffer is not yet full */ MEMCPY_BCOPY(&context->buffer[usedspace], data, len); ADDINC128(context->bitcount, len << 3); /* Clean up: */ usedspace = freespace = 0; return; } } while (len >= SHA512_BLOCK_LENGTH) { /* Process as many complete blocks as we can */ SHA512_Transform(context, (sha2_word64*)data); ADDINC128(context->bitcount, SHA512_BLOCK_LENGTH << 3); len -= SHA512_BLOCK_LENGTH; data += SHA512_BLOCK_LENGTH; } if (len > 0) { /* There's left-overs, so save 'em */ MEMCPY_BCOPY(context->buffer, data, len); ADDINC128(context->bitcount, len << 3); } /* Clean up: */ usedspace = freespace = 0; } void SHA512_Last(SHA512_CTX* context) { unsigned int usedspace; usedspace = (context->bitcount[0] >> 3) % SHA512_BLOCK_LENGTH; #if BYTE_ORDER == LITTLE_ENDIAN /* Convert FROM host byte order */ REVERSE64(context->bitcount[0],context->bitcount[0]); REVERSE64(context->bitcount[1],context->bitcount[1]); #endif if (usedspace > 0) { /* Begin padding with a 1 bit: */ context->buffer[usedspace++] = 0x80; if (usedspace <= SHA512_SHORT_BLOCK_LENGTH) { /* Set-up for the last transform: */ MEMSET_BZERO(&context->buffer[usedspace], SHA512_SHORT_BLOCK_LENGTH - usedspace); } else { if (usedspace < SHA512_BLOCK_LENGTH) { MEMSET_BZERO(&context->buffer[usedspace], SHA512_BLOCK_LENGTH - usedspace); } /* Do second-to-last transform: */ SHA512_Transform(context, (sha2_word64*)context->buffer); /* And set-up for the last transform: */ MEMSET_BZERO(context->buffer, SHA512_BLOCK_LENGTH - 2); } } else { /* Prepare for final transform: */ MEMSET_BZERO(context->buffer, SHA512_SHORT_BLOCK_LENGTH); /* Begin padding with a 1 bit: */ *context->buffer = 0x80; } /* Store the length of input data (in bits): */ *(sha2_word64*)&context->buffer[SHA512_SHORT_BLOCK_LENGTH] = context->bitcount[1]; *(sha2_word64*)&context->buffer[SHA512_SHORT_BLOCK_LENGTH+8] = context->bitcount[0]; /* Final transform: */ SHA512_Transform(context, (sha2_word64*)context->buffer); } void SHA512_Final(sha2_byte digest[], SHA512_CTX* context) { sha2_word64 *d = (sha2_word64*)digest; /* Sanity check: */ assert(context != (SHA512_CTX*)0); /* If no digest buffer is passed, we don't bother doing this: */ if (digest != (sha2_byte*)0) { SHA512_Last(context); /* Save the hash data for output: */ #if BYTE_ORDER == LITTLE_ENDIAN { /* Convert TO host byte order */ int j; for (j = 0; j < 8; j++) { REVERSE64(context->state[j],context->state[j]); *d++ = context->state[j]; } } #else MEMCPY_BCOPY(d, context->state, SHA512_DIGEST_LENGTH); #endif } /* Zero out state data */ MEMSET_BZERO(context, sizeof(SHA512_CTX)); } char *SHA512_End(SHA512_CTX* context, char buffer[]) { sha2_byte digest[SHA512_DIGEST_LENGTH], *d = digest; int i; /* Sanity check: */ assert(context != (SHA512_CTX*)0); if (buffer != (char*)0) { SHA512_Final(digest, context); for (i = 0; i < SHA512_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(SHA512_CTX)); } MEMSET_BZERO(digest, SHA512_DIGEST_LENGTH); return buffer; } char* SHA512_Data(const sha2_byte* data, size_t len, char digest[SHA512_DIGEST_STRING_LENGTH]) { SHA512_CTX context; SHA512_Init(&context); SHA512_Update(&context, data, len); return SHA512_End(&context, digest); } /*** SHA-384: *********************************************************/ void SHA384_Init(SHA384_CTX* context) { if (context == (SHA384_CTX*)0) { return; } MEMCPY_BCOPY(context->state, sha384_initial_hash_value, SHA512_DIGEST_LENGTH); MEMSET_BZERO(context->buffer, SHA384_BLOCK_LENGTH); context->bitcount[0] = context->bitcount[1] = 0; } void SHA384_Update(SHA384_CTX* context, const sha2_byte* data, size_t len) { SHA512_Update((SHA512_CTX*)context, data, len); } void SHA384_Final(sha2_byte digest[], SHA384_CTX* context) { sha2_word64 *d = (sha2_word64*)digest; /* Sanity check: */ assert(context != (SHA384_CTX*)0); /* If no digest buffer is passed, we don't bother doing this: */ if (digest != (sha2_byte*)0) { SHA512_Last((SHA512_CTX*)context); /* Save the hash data for output: */ #if BYTE_ORDER == LITTLE_ENDIAN { /* Convert TO host byte order */ int j; for (j = 0; j < 6; j++) { REVERSE64(context->state[j],context->state[j]); *d++ = context->state[j]; } } #else MEMCPY_BCOPY(d, context->state, SHA384_DIGEST_LENGTH); #endif } /* Zero out state data */ MEMSET_BZERO(context, sizeof(SHA384_CTX)); } char *SHA384_End(SHA384_CTX* context, char buffer[]) { sha2_byte digest[SHA384_DIGEST_LENGTH], *d = digest; int i; /* Sanity check: */ assert(context != (SHA384_CTX*)0); if (buffer != (char*)0) { SHA384_Final(digest, context); for (i = 0; i < SHA384_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(SHA384_CTX)); } MEMSET_BZERO(digest, SHA384_DIGEST_LENGTH); return buffer; } char* SHA384_Data(const sha2_byte* data, size_t len, char digest[SHA384_DIGEST_STRING_LENGTH]) { SHA384_CTX context; SHA384_Init(&context); SHA384_Update(&context, data, len); return SHA384_End(&context, digest); } clementine-1.2.0+dfsg/3rdparty/sha2/sha2.h000066400000000000000000000144351223327513400202000ustar00rootroot00000000000000/* * 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 __SHA2_H__ #define __SHA2_H__ #ifdef __cplusplus extern "C" { #endif /* * 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 #ifdef SHA2_USE_INTTYPES_H #include #endif /* SHA2_USE_INTTYPES_H */ /*** SHA-256/384/512 Various Length Definitions ***********************/ #define SHA256_BLOCK_LENGTH 64 #define SHA256_DIGEST_LENGTH 32 #define SHA256_DIGEST_STRING_LENGTH (SHA256_DIGEST_LENGTH * 2 + 1) #define SHA384_BLOCK_LENGTH 128 #define SHA384_DIGEST_LENGTH 48 #define SHA384_DIGEST_STRING_LENGTH (SHA384_DIGEST_LENGTH * 2 + 1) #define SHA512_BLOCK_LENGTH 128 #define SHA512_DIGEST_LENGTH 64 #define SHA512_DIGEST_STRING_LENGTH (SHA512_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 /* * Most BSD systems already define u_intXX_t types, as does Linux. * Some systems, however, like Compaq's Tru64 Unix instead can use * uintXX_t types defined by very recent ANSI C standards and included * in the file: * * #include * * If you choose to use then please define: * * #define SHA2_USE_INTTYPES_H * * Or on the command line during compile: * * cc -DSHA2_USE_INTTYPES_H ... */ #ifdef SHA2_USE_INTTYPES_H typedef struct _SHA256_CTX { uint32_t state[8]; uint64_t bitcount; uint8_t buffer[SHA256_BLOCK_LENGTH]; } SHA256_CTX; typedef struct _SHA512_CTX { uint64_t state[8]; uint64_t bitcount[2]; uint8_t buffer[SHA512_BLOCK_LENGTH]; } SHA512_CTX; #else /* SHA2_USE_INTTYPES_H */ typedef struct _SHA256_CTX { u_int32_t state[8]; u_int64_t bitcount; u_int8_t buffer[SHA256_BLOCK_LENGTH]; } SHA256_CTX; typedef struct _SHA512_CTX { u_int64_t state[8]; u_int64_t bitcount[2]; u_int8_t buffer[SHA512_BLOCK_LENGTH]; } SHA512_CTX; #endif /* SHA2_USE_INTTYPES_H */ typedef SHA512_CTX SHA384_CTX; /*** SHA-256/384/512 Function Prototypes ******************************/ #ifndef NOPROTO #ifdef SHA2_USE_INTTYPES_H void SHA256_Init(SHA256_CTX *); void SHA256_Update(SHA256_CTX*, const uint8_t*, size_t); void SHA256_Final(uint8_t[SHA256_DIGEST_LENGTH], SHA256_CTX*); char* SHA256_End(SHA256_CTX*, char[SHA256_DIGEST_STRING_LENGTH]); char* SHA256_Data(const uint8_t*, size_t, char[SHA256_DIGEST_STRING_LENGTH]); void SHA384_Init(SHA384_CTX*); void SHA384_Update(SHA384_CTX*, const uint8_t*, size_t); void SHA384_Final(uint8_t[SHA384_DIGEST_LENGTH], SHA384_CTX*); char* SHA384_End(SHA384_CTX*, char[SHA384_DIGEST_STRING_LENGTH]); char* SHA384_Data(const uint8_t*, size_t, char[SHA384_DIGEST_STRING_LENGTH]); void SHA512_Init(SHA512_CTX*); void SHA512_Update(SHA512_CTX*, const uint8_t*, size_t); void SHA512_Final(uint8_t[SHA512_DIGEST_LENGTH], SHA512_CTX*); char* SHA512_End(SHA512_CTX*, char[SHA512_DIGEST_STRING_LENGTH]); char* SHA512_Data(const uint8_t*, size_t, char[SHA512_DIGEST_STRING_LENGTH]); #else /* SHA2_USE_INTTYPES_H */ 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]); void SHA384_Init(SHA384_CTX*); void SHA384_Update(SHA384_CTX*, const u_int8_t*, size_t); void SHA384_Final(u_int8_t[SHA384_DIGEST_LENGTH], SHA384_CTX*); char* SHA384_End(SHA384_CTX*, char[SHA384_DIGEST_STRING_LENGTH]); char* SHA384_Data(const u_int8_t*, size_t, char[SHA384_DIGEST_STRING_LENGTH]); void SHA512_Init(SHA512_CTX*); void SHA512_Update(SHA512_CTX*, const u_int8_t*, size_t); void SHA512_Final(u_int8_t[SHA512_DIGEST_LENGTH], SHA512_CTX*); char* SHA512_End(SHA512_CTX*, char[SHA512_DIGEST_STRING_LENGTH]); char* SHA512_Data(const u_int8_t*, size_t, char[SHA512_DIGEST_STRING_LENGTH]); #endif /* SHA2_USE_INTTYPES_H */ #else /* NOPROTO */ void SHA256_Init(); void SHA256_Update(); void SHA256_Final(); char* SHA256_End(); char* SHA256_Data(); void SHA384_Init(); void SHA384_Update(); void SHA384_Final(); char* SHA384_End(); char* SHA384_Data(); void SHA512_Init(); void SHA512_Update(); void SHA512_Final(); char* SHA512_End(); char* SHA512_Data(); #endif /* NOPROTO */ #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __SHA2_H__ */ clementine-1.2.0+dfsg/CMakeLists.txt000066400000000000000000000400351223327513400173200ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.6) cmake_policy(SET CMP0011 OLD) include(CheckCXXCompilerFlag) include(FindPkgConfig) include(cmake/Summary.cmake) include(cmake/Version.cmake) include(cmake/Deb.cmake) include(cmake/Rpm.cmake) include(cmake/SpotifyVersion.cmake) include(cmake/OptionalSource.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 () set(CMAKE_REQUIRED_FLAGS "-std=c++0x") check_cxx_source_compiles( "#include int main() { std::unordered_map m; return 0; } " USE_STD_UNORDERED_MAP) check_cxx_source_compiles( "int main() { [](){}(); } " HAVE_LAMBDAS) unset(CMAKE_REQUIRED_FLAGS) 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 libchromaprint) pkg_check_modules(GIO gio-2.0) pkg_check_modules(GLIB glib-2.0) pkg_check_modules(GOBJECT gobject-2.0) pkg_check_modules(GSTREAMER gstreamer-0.10) pkg_check_modules(GSTREAMER_APP gstreamer-app-0.10) pkg_check_modules(GSTREAMER_BASE gstreamer-base-0.10) pkg_check_modules(GSTREAMER_CDDA gstreamer-cdda-0.10) pkg_check_modules(GSTREAMER_TAG gstreamer-tag-0.10) pkg_check_modules(INDICATEQT indicate-qt) 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(LIBXML libxml-2.0) pkg_check_modules(QCA qca2) 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 for Google Drive support, compile our builtin version instead" ON) if (USE_BUILTIN_TAGLIB AND (NOT "${ENABLE_GOOGLE_DRIVE}" STREQUAL "OFF") AND SPARSEHASH_INCLUDE_DIRS AND TAGLIB_VERSION VERSION_LESS 1.8) set(TAGLIB_VERSION 1.8) 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(GROWL Growl) 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(${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(UBUNTU_ONE ON "Ubuntu One file 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(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(SOUNDMENU ON "Gnome sound menu integration" DEPENDS "indicate-qt" INDICATEQT_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(VISUALISATIONS ON "Visualisations") if(NOT HAVE_SPOTIFY_BLOB AND NOT QCA_FOUND) message(FATAL_ERROR "Either QCA must be available or the non-GPL Spotify " "code must be compiled in") elif(QCA_FOUND) set(HAVE_SPOTIFY_DOWNLOADER ON) endif() # Find DBus if it's enabled if (HAVE_DBUS) find_package(Qt4 REQUIRED QtDbus) endif () # 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) # We compile our own qsqlite3 by default now, because in Qt 4.7 the symbols we # need from it are private. option(STATIC_SQLITE "Compile and use a static sqlite3 library" ON) set(HAVE_STATIC_SQLITE ${STATIC_SQLITE}) if(STATIC_SQLITE) message(STATUS "Building static qsqlite plugin") add_subdirectory(3rdparty/qsqlite) include_directories("3rdparty/qsqlite") else() if (NOT I_HATE_MY_USERS) message(FATAL_ERROR "No, really, Clementine needs sqlite to be linked " "statically. If it's not, Clementine won't be able to resolve the " "functions it needs to register full text search support. Search will " "be really slow and users will be unhappy. If you're packaging " "Clementine for a distribution and you really hate your users and want " "them to have a bad time please rerun cmake with -DI_HATE_MY_USERS=ON") else() if (NOT MY_USERS_WILL_SUFFER_BECAUSE_OF_ME) message(FATAL_ERROR "So you really hate your users and you want to " "create a crippled package that doesn't work properly? Please send " "an email to the devs and help us understand why.") endif() endif() endif(STATIC_SQLITE) # 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) # Use system libechonest if it's available find_path(ECHONEST_INCLUDE_DIRS echonest/echonest_export.h) find_library(ECHONEST_LIBRARIES echonest) if(NOT ECHONEST_INCLUDE_DIRS OR NOT ECHONEST_LIBRARIES) add_subdirectory(3rdparty/libechonest) set(ECHONEST_INCLUDE_DIRS ${CMAKE_BINARY_DIR}/3rdparty/libechonest) set(ECHONEST_LIBRARIES echonest) endif(NOT ECHONEST_INCLUDE_DIRS OR NOT ECHONEST_LIBRARIES) # 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 system sha2 if it's available find_path(SHA2_INCLUDE_DIRS sha2.h) find_library(SHA2_LIBRARIES sha2) if(NOT SHA2_INCLUDE_DIRS OR NOT SHA2_LIBRARIES) add_subdirectory(3rdparty/sha2) set(SHA2_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/sha2) set(SHA2_LIBRARIES sha2) endif(NOT SHA2_INCLUDE_DIRS OR NOT SHA2_LIBRARIES) # Use our 3rdparty chromaprint if a system one wasn't found if(NOT CHROMAPRINT_FOUND) add_subdirectory(3rdparty/chromaprint) set(CHROMAPRINT_LIBRARIES chromaprint_p) set(CHROMAPRINT_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/3rdparty/chromaprint/src) if(WIN32) add_definitions(-DCHROMAPRINT_NODLL) endif(WIN32) endif(NOT CHROMAPRINT_FOUND) # 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.0+dfsg/COPYING000066400000000000000000001045131223327513400156150ustar00rootroot00000000000000 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.0+dfsg/Changelog000066400000000000000000001235051223327513400163760ustar00rootroot00000000000000Version 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.0+dfsg/cmake/000077500000000000000000000000001223327513400156365ustar00rootroot00000000000000clementine-1.2.0+dfsg/cmake/Deb.cmake000066400000000000000000000007601223327513400173350ustar00rootroot00000000000000set(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.0+dfsg/cmake/FindFFTW3.cmake000066400000000000000000000061651223327513400203020ustar00rootroot00000000000000# # 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.0+dfsg/cmake/OptionalSource.cmake000066400000000000000000000013071223327513400216070ustar00rootroot00000000000000macro(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.0+dfsg/cmake/ParseArguments.cmake000066400000000000000000000021371223327513400216030ustar00rootroot00000000000000# 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.0+dfsg/cmake/Rpm.cmake000066400000000000000000000021751223327513400174030ustar00rootroot00000000000000set(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.0+dfsg/cmake/SpotifyVersion.cmake000066400000000000000000000002301223327513400216360ustar00rootroot00000000000000# 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 14) clementine-1.2.0+dfsg/cmake/Summary.cmake000066400000000000000000000046411223327513400203020ustar00rootroot00000000000000cmake_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) 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.0+dfsg/cmake/Translations.cmake000066400000000000000000000052641223327513400213300ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.6) set (XGETTEXT_OPTIONS --qt --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 --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.0+dfsg/cmake/Version.cmake000066400000000000000000000144501223327513400202710ustar00rootroot00000000000000# Change this file when releasing a new version. # Version numbers. set(CLEMENTINE_VERSION_MAJOR 1) set(CLEMENTINE_VERSION_MINOR 2) set(CLEMENTINE_VERSION_PATCH 0) # 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.0+dfsg/cmake_uninstall.cmake.in000066400000000000000000000015561223327513400213450ustar00rootroot00000000000000IF(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.0+dfsg/data/000077500000000000000000000000001223327513400154675ustar00rootroot00000000000000clementine-1.2.0+dfsg/data/allthethings.png000066400000000000000000000311341223327513400206650ustar00rootroot00000000000000PNG  IHDR XvpsRGBbKGD pHYs  tIME/%۬ IDATx;GF;`;3qsw i i1-c@@f4bfU>{.GGdVf*2Hh_!By4Ҿ-qƒC<V@(~S6y U "N0 bc>!>,L(/Dx @p`!@0;880k 1X!A5r:}UQ!>\l=E,>%3# 8Qa P!Bp2iϱγ3rhUcL@Е }?ŇQh)> B@x7e1Lx`>09KV@p΅"0,I2A ['y?V@p0gƇ B@xdû]8תA XsL x8p@8qq6&E{]Ԃ Ή&V81[ ^-NsФ&?d!@'AHooo?8X ޏb0x-@ 'OF>L@@ᓈmd2nB) IIAcb/U + ]@ݻoc|~@1qozppr\pa\@&_#ckY= Pdk$Uxz:I,p2& uL0Ɩ£pyaAD o)p>>! ߻D7>kk<+ g8cr+m`܍%L NNa= t]$@ 8oМ p_qrjh!~m66KIwZ޾g7 3e3p~J V8p|߃P1g(Ium `ga|ј8#@klkMRzp1QE| `W'허8,W~_,ytE&(N&; @ixN&&x#!ıYx8"@!bB58b++׻8y~~~]'YlԭcbgF12^a~s,pDŽR։%XW|m;ㆈ&'O۾)> @Ɂ$@&H JpӘy`C};6!`&l/ @p `mlm)yc`27ش;Z@|\Pccl3Ɵy3`ml9 8bV= B4.Ѿ7~sl04.']O>]| @mb< abܖqGtC"<@|Am"< 'lmF-88cm\o @L #<Ax@&V? @1&ƒ2Wc0SAbCV?  vE<Zzcp@|P>;JK>iH|7eo!@;8n}1">p<?_Ib#kg0Pu}A?`{ϿG ,F=q cop Cr^zǬ~;+ c#Uo5Њ/_/ChBp- { @ d q^*"B3c1!D\\EcOqϭ1^NȍO+{/=WY`V@DGVDF^ Y܋^X@1jtaՐq "$r&~0`1->~>1bCljǒM?Վ2JHVBڬ8tc"ǶG~ @M1ǭX9PK&z*!16B=!R, 7+ htw,&B&­No.r)s cH@M |">DK\(D.ـN"dD!.ςab*.dlsX:"M$Iע_thHӧq V{E@}Y2ri8޽{QC[kAcOHD %5f-X޽xuhf(D|i8Bcm"^޽ &s!"F`!B iFH3BD/919]"b2ԫq9_rDK><$|\Lj""dyp @DȆq0s"Bz9ӫ1I#BVCttƧAt!! ߶7|YVwO`5*NT@!%Br:0 @!H{CRƞh-N<5 d"}nS?!1=<L }썎[VHVXx VDwI֥5+#[Cd @"DܮǏn Ծ= @L^4=!s7/@ /__?Z2moC؄G“&Q{djߏ*< }!|tw~&@!&S)OXBɆ&DG~`=7WFY3 bBxmDQm8x +"N:ԋ%!>X3.wYr<@ h h?wXޮ K~"jh[>!BJo[!LJ!筰]{I4 @܄DGۨd܊hɭJ.Vl^S~[+!//A^x"BcI 9ޭӾd" C|0jȒgoF4IZDuXltnv}5co>??t`1˗/yzzhg2zL6W-DGm?RQ;xiYilD׊#J|sͶڳR+c_ $=[iSX&$mt܋%7so{K" QV@AyXi|ӄ׊G'my']xWRl%+-*}+ L{+ۃiHDȒIXDuۥ?+ L{Z s:oPOB(BzZDug|d-_/򓟶Gomi̹l  "D@ W _X:mq>4['&_;&sߣl+K*0Z[:BK|!K| ZK"q"2>zk2},hx]5/h힐ԓ_k\;Zq1D( _`ߢ}Paۻ Cd""#=Y[cbT0'<Bo\D8i80qkRW{"[zroWO0sCH>.gy6=~9 @0^"."*dՃ׆~VG 8Ȗ߆YQ ?  "ü}NIXG:'%8c>ޗT5SNhQ*Ds^.9Z;_{:FSOoD,9GWrqQ=HDG=' 1q8o1֧V߭{W|$/_?==ӦK˥AyBd*F5zkȈ<ds,  "z8Q;>m?2ly)@Η[]ª˰!C!$0Ǥ~Mt˰9.gyxMTb;4.\PL}NXbb)Ze5HP^!C(`ˀ| !$~ϔⲫi=@ N0!@BSD.=~ǭ#>ƯQGGs/d}^#d&ؒ+!ctIx8a0Jt#ED+n\-e%X!.uZpsK`p9W|T_Pdoѱw{op;4z0~o~^(q~sDž뭗"53i_p_qYX!svnߛ\Ax>yaZ{@I WC@0x ԏsBםQѱ'>mt+ʪL1 >9!:N?NDChWoXcu~b9_c& WEHd+! "IW/9!WtD?ϱRWna8/  )<?)msocsj"JsB~]J`rnl떶y7/`hD_!\ 1_| IV !lK E! urv3\"r~ ?㒉3Bd&B\p=Nr^F#B` /$"L6/v:270:mRzT/ i_y[! YL`'N/5EaGܐ~r,W'[2,7hoa{ !eN*_ls@Mk!SÇǏ` O od0Nvn BIzix j LDk=,;J5̭jsb$c9aq#gPB\jErb6"qyStlۦCiĥX(!Ka .*KaVA&rMO!Hr k%B쿣]ZO9Ilĵ0< ښ:? ږ/PH? xp9snxVss.*'a@PAx Q'@@AXIgj۷?/ֹ2=OOOl M=DAƌ'}=\Xz|+BE ms/=rYUseXA^|Ps@z R<~  RV˗yQ܏%7B,P!֬z6i}jkHZp7}y}gWBbVB!<.EQN)BxIͧ`T{>Ě0ogwUǹŠ;64|꿍;7!S|gGQV.oK4Q>L?+|'b{9>޿ϟ6!._psO74!i1r/B|Y"B#*Ȗڟk }ߧ]zy:@i&Djr/_:)w?Hd|$^IN?s@Aor"#dI8+"Bw݌ފnՄנ4v| u٭qX'l,Q:>\?)bdpՙ˰m~0I_F )BH5'C-Z VAb( sj+܉NK87m kܝB!WDА"0H-OlZz,X`>4!ژ$?#BFKd <&_86 Ry<ظc"g|X]7!\U.BDOJor,qA8LJb$A[ԍOrfIIpkL{d 7o0Q.B| @XpN!r|<f>g@` O*kAӓuVOI?>|I| >hfHI'c1Rxxea>!AFm>45##j~D6"s.j\EpUǏdCօǽrª@Ar>\x! ɵ6.A@CP夾,OƢ3%/,hhr"> $[|؟܆s5!2J>BF:ΈYBD < BDx!1dYCͅԤ &K?vy"kԈmHa1DxH!!XD=FD @DH14!OSO{!@"B4 - =0!"BxI7D|O\,_|<@BSՊ\B_q+>`4dX?q#:Ę{>X"m2D㯩Astgwl嗶鋄6~4~D?U>l+!+ueVBO< 82@H%k#$0R9x$/.*H 9U+>Ms!Ǟ9d( "r+)syyEHp;F@9@ `"vxd/nljPk vǒ9CaK\nyXo]Err+({l&e!kCx ?r#:^ qvX7͒`Xr|"$1z0dOr8&P~~kGO GשI#`)!W~OX< ܷ !r+k܋ 63ޤ# R$B2,u0↳!Uw`>0~HpbX7S$Dt`͖o<(:O@Fϟv}! U7ݿs!B!@`U, [lx 8i#6߿y}skҡލD aFQ тp=!V5&-DRqr-"B5a$iܒ=!B<@0 ~ "2,Z:/!: w,A~nA"Ļ^PeXVA!@BIKEGuxLEHKDy@t!wH}s :R(B@x FFt܎kD'c/: P4B@DNmڋ&@,7@4< #!@D"_Dȍ iH.^FAGDl,EHja$ ^,FMnJ,< E@x$B@x7!@Dd,JDH9 #B3 mGHj`0'BqS:x@Ca$ ^Fm"OF,O"*BQ!+@ BDHq?܌DHQh'c <@d,Pb@x @@d/,/v B) < #$5@XUx2QH @!d,6BfN."a(9@x @!܌Dp\Q@X!! }d,DB'c B@F B X!A뎁eH"F8BR!`{"dP Us!b eDlo B tD(:,"G"!Qx2"(O B"'c:DD&.ŢEO!⟬B܀"A B@@O@ @H*H_< AX!"ĥXDf?U"B'`A B!8W"dIM B lx2"BhVAX"\u0ұ"B,!fDD/xwB4IENDB`clementine-1.2.0+dfsg/data/blank.ttf000066400000000000000000000240741223327513400173040ustar00rootroot00000000000000 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.0+dfsg/data/clementine-spotify-public.pem000066400000000000000000000007031223327513400232640ustar00rootroot00000000000000-----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.0+dfsg/data/clementine_remote_qr.png000066400000000000000000000007651223327513400224050ustar00rootroot00000000000000PNG  IHDR3IDATX헽0 iPIXb&T󂤥DSA%8䇾-"`L~?ϼ9LrxIJf IR[Bpn,aC nocover.png clementine-1.2.0+dfsg/data/currenttrack_bar_left.png000066400000000000000000000016721223327513400225500ustar00rootroot00000000000000PNG  IHDR)&IbKGD pHYs  tIME !eˆGIDATXýOoEϼvi8W-pAJ*%GD# q7 UpF [H\( pĩb+=J;yygwv˨Q...<>v,3#5b>=Oj.EH"h nO b;VVVH$DX0| | gff)˔en>=ڟvU"t Jdrz>Ҕe,[[iㄿ~ziJ$N!E9FAŻc;؅SsgzΤbPJ?4dى9{ x"#OՄvV&?^-8~{/y99s\I#`(R(_} 1gr3w9*B! ~l !7TX(r9:{6Z2IBF%g]Pф[ZK?8@QY]7Zѓ,H(ڂRj:Y_EQ2+IIӱր_?+A vgT_CC)ݨLDׅ&4IENDB`clementine-1.2.0+dfsg/data/currenttrack_pause.png000066400000000000000000000002771223327513400221070ustar00rootroot00000000000000PNG  IHDR |lsBITUFtEXtSoftwarewww.inkscape.org<SIDAT} ! 1#xˣ JWIl cz`10fcfǟXR1'E(W˸e%סvIENDB`clementine-1.2.0+dfsg/data/currenttrack_play.png000066400000000000000000000003451223327513400217330ustar00rootroot00000000000000PNG  IHDR |lsRGBbKGD̿ pHYs  tIME 1-[ӼiIDATc``__020_a*L }0uyu C'l iI ;b}H#$3g 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 grooveshark-valicert-ca.pem hypnotoad.gif icon_large_grey.png icon_large.png icon.png icons/22x22/application-exit.png icons/22x22/applications-internet.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/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/input-keyboard.png icons/22x22/ipodtouchicon.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/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/input-keyboard.png icons/32x32/ipodtouchicon.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/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/input-keyboard.png icons/48x48/ipodtouchicon.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/ban.png last.fm/icon_radio.png last.fm/icon_tag.png last.fm/icon_user.png last.fm/lastfm.png last.fm/loved_radio.png last.fm/love.png last.fm/my_friends.png last.fm/my_neighbours.png last.fm/neighbour_radio.png last.fm/personal_radio.png last.fm/recommended_radio.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/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/grooveshark.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/radiogfm.png providers/rockradio.png providers/skydrive.png providers/skyfm.png providers/somafm.png providers/songkick.png providers/soundcloud.png providers/subsonic-32.png providers/subsonic.png providers/ubuntuone.png providers/wikipedia.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-4.sql schema/schema-5.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 spinner.gif spotify-attribution.png star-off.png star-on.png tiny-pause.png tiny-start.png twitter.css volumeslider-gradient.png volumeslider-handle_glow.png volumeslider-handle.png volumeslider-inset.png clementine-1.2.0+dfsg/data/globalsearch.css000066400000000000000000000011171223327513400206270ustar00rootroot00000000000000#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.0+dfsg/data/grooveshark-valicert-ca.pem000066400000000000000000000020531223327513400227140ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG 9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd -----END CERTIFICATE----- clementine-1.2.0+dfsg/data/icon.png000066400000000000000000000075541223327513400171400ustar00rootroot00000000000000PNG  IHDR@@iqsRGBbKGD pHYs[[]~tIME0%JIDATx[k]uyާ@y:PPIEQ(BBHT}AJҪ&`@I* A4ڴ1y1c͜9lǘk⑶9{go[kNgzЛMU?6~G/~_a?aL>O\ܴ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.0+dfsg/data/icon.svg000066400000000000000000001663531223327513400171560ustar00rootroot00000000000000 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.0+dfsg/data/icon_large.png000066400000000000000000001742631223327513400203140ustar00rootroot00000000000000PNG  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.0+dfsg/data/icon_large_grey.png000066400000000000000000001200771223327513400213340ustar00rootroot00000000000000PNG  IHDRxsRGBbKGD pHYs^+tIME0)( IDATxi\Wu.NUOjͲ,ɲ%KF0$_ 2KBnBI IHrBZd[_m,yZjGT]Ug?-aώԮ]~ܹs8Τ+O}𥮮 r@ \<99[|CCC߿/p/5%WD BRٳgoR靥R-cؽ{7LOOjH𩮮aB@ .3CCC?399!ԏE9:-WM B<088Oq8T*R 矿L3\A@  `xxxŋT*T*AT3z=%E௺ @###sT*:ti>U+,!( х ~yzzzzqî]`ffqaWWr @^m?ɓ'̙3z_?B@ (#3P(xxxyȇK\.r `)7|9Jg2G7i_ DhjŨ=CCC?8?Å MUwrQcccK7qsRP(;v Yk\@ ipܹo&_\.(GPbxŸO$x|+<@0{tKk.\R t~ݻA)5H@wuuQ?:00eRVp̙ˆ?fM\n<@ !000###;R ]u,"r;!ub=}LLL0cKuh۹\]AsԼT*76B?33sE_ggQ\?<.@ @1::zݹsK1\雼YܝbhhR7cQJ9l+[\.&@  },:.}:`Rf~zsyl@@Uqv`xxeg7ryt@@U000qxP( "d2/!$pok,G ӧOp1$`Ëi#$BR;933i?cz;r:y@@PܹsnGFF649XsB%@ ]L fEK MLVD'@ kߧܹs!C`zz Z(4Xr7#%BX zr###/1&Y$<x(˽U+@ @5?~?I[<|,hp2rW-@ Boo+mmmޞ*3U4\.Ny@_z5044tWNǦ &?X@.ڔs粿C"_N-^4ɿЀ:x4Lzzz{EbzK*PK TNm*I:ekkH ËYHzzz^ >sI$ɟ$ Vo3i.2U$\M=@ Ew>|hk_OvR@q, 0 A @~ 6r<~@P;TkGz  JFd$޿.>@a-k1n;$~ .#(Md]c4 RIIPQ n.{y @OOXx"blq6zxWl])\.~y  @oooKEO`?]Jm]1."`S\T?Ƙ 5&@Є@)R"0lZ[[Ycp yg)l!zI )""@\saq6X" `_SK f!۶m Sa SD@GtƟK6oT"|s\.VK@ h`q;::`, $IM%`Ȁ'XEQowwT F$ Q(szzE"8iα"ln"p`Swww$@ 4퍔R_lˉLy/2a#lK@B;J p[Twx A[5M`E\ `|)DE/IQ@ h9۶@6%o tyD@g}ȀI Hp|oڴ1W~p6LmK\re"@ LR ؖ4dz7mڴLU@ SۡiSSSAӵO% !Th"@B 9X oڴIZ A@AK($mS'>̘+rn6yN#+ulݺuRo|Հb=uRu2`R0@G~͛q@ cQ@Q15@}7o~<@~Aoo|ԘvmHP@iؽ{w^{ag\)C%:VȦBGɎk:?w<@PC@)+B6*(}X5Ae+.{t*T` nٲE A<G}(_g(q8JBv1 RQSC [`˖-[\@ po/W;*HyبYLFW~52 LǕh0e8H~g, Atxmum%–]J K0Xq>e˖_X Hz{{yVB7f9pJe۵4ǟFX~/;`Q>w<@P%"χP L'$ t)mSN* T~=zE8 A T_)?'-F9z.Md ؊jW)җ$A@+0T_yvcjk7ݶeci O>v h+%l D\/c-))(X-)?/?ʁh) mA.Y2w}Z R !^,1vX `k>AҠ#I%붷$+ޯN҂XOn_ȣ- @jbz _h:J8EH9@k>A(:K(8cc)BH5Kt- K U'Xo@ DBf@Y"1/76 d=u|c'R| ADQbؖ5 -3.`1`SMEQX,>}m<@Azzz: `xR*'e8]l!.(dSa0)&Ew^{8 @Ͼ:HJeZ0ԗ NmǙlc\[l g*_6ݻW>y@W,|C+~8j=  yHV ).ަXzZyHmۖߨ@  SiuD@G8iHTb`ZHoDL@BoN A'&d+ 7vtgyJ925YI8~EUvb#z Cg2yx 1q}ղ"K,9yc=kJLaZxS5v@=Z+_ɻu-\e+m0TÜ/jTndd4@@0H96 07rĮ?Gۤ'nR0Ӗ})\|PX(S@ 5R,j$ kdēenڡpȄnIDGl(Jw<#)Y[XY=+ei܃ݺ&aVI,Ә%MۘJ$ΧܸݮzTRA(Q-  0Aڷ+=Id]ąza1S!((~;N{ cT[9yBA(,Tj1[3HqjΝTJZE2efNŪK287&`K&8iAWʞY](Vغu<JSZ04i;|6umLkjk٫3ئ璉6-R&+122z ʴ!Neq5&TnI6U,:_,lC1Γi; 鹄yMOO/iC 4*60iY@g15kKLLXg1is6Jۿo #J`)xTגr޹DBVc[r}z 0ϾI)!- 'јzn}bւ؊PhO}L[aS߮5yq&?K"6!:/V|W^}2Wm+,M r˸y n[ pSv[sDsIEpSSbz%5P 4Py`ɀN>7a9lUF=BAE{LLLΝ;,! ߬pus1|U}E(R<ۖ*3gׅ )E 4ضm[ ֻ@%# R~`8垱 ̵'qrΝ@@PX,iH&yH6fLMex+0b+Rlł0i&"55""cǎTJedj A(j'~XYY/s3n~Cl f|XrAX:vm2F!WW{eO1dFg) myC`U' 6Ѧ\ȑ2X#ntmZ2xB |OA\Ξ={sv-_~Ay^b `XDyƶ`@H1!t^(TAMpٖ0U{R()H Ԍ(jix IDATr c0υH1Č%I^U΄ЭS;Mc230El)؆P&%affyꩧ@)ϒ(jF`a1mii1F bLTm2r"` ټrk׀JL W#ѿ?r7A@ͺ C:p*qOI4_wR(1i:9f]*C[?/fd*U'Q-U @O=4®ys!~lz+uS1~a⚝;wR=Qt$\]B!4lw|A#@PUZVq RI۹/mkkz,k:4b ]8v.Ex pϜ9s{+W<"S@ hY^\`;6g2LP0q C1 㸖MK95 }ԂQ6@)5J7eYI US:j9B cׄ2ln?%c^,TL~]os [Oy/ yg>I U!^f_"MtoXE(XپK켨;r%1(qȀw/Ç'dj m@52u$Z@CjB1eO6 mفNOOoܵkׯ2E QhoowW1z| Į{SΫnWaJ jN D__ߓ]w~/ttt !ڶ ]Zs0]SW10`ASbX uV5#G|9h{{EAhdK,&)TRpb )FepEě u=1b&LNNoK zecXi9*إE,\yX1Ԣ8i)0H1;wϟr…d \x= H̙C5Z{!4S46n\XC[?ois8*=رc_(J?f2 Puƫ B( It\k.;`Kc +=m ,](^o߾?iL :CBxi˼oQi{Mʌb)|D5@"Jz4̛7/ ŢAI>-vcTtzp]@a .Ehll?ݵk>*S@ p(륫]5R''>mSj1e(ǎ]3OnZJH`9ݲh```+ꪓ2 0XO @ftJ0tx0Ń\*.f]FpOSx /mff mmm2 #!iX5Ovަ؈Ntߏ t"1}IyՁ>z_E%` ql5i)ic `+; tC!SlџP~Fjo>|i[9@CT,#͞hr\u tltmwM'% +D0?KѴͰb T,UyxxSgϞC9@U8L(r硳3֖z!%Z|y&~n3hK*\p8RmN͛7Lw 2Uh @b TM>8!8A2`w1ҜsD!pJ@P*V9rR߲4%d*>{,YcRd2,$ɇP(wii}tUJedTDd2@Q0cDlTU`FiMK;5x1Pv||5~j1/٩S2 ̝wީnHLj5^,dm?qA6y6oGsw\ت۟k}rm/I|e[خa34!q|͑#G6JV YDQ_OK/.`Ksy(?'b0^6F-)j}]r;Fp5+H]mF<-+|>|TC`*qםX8_n7YNqHR%8~<<`^|w?k{.0͏t}&*߻x]'O|L,T2X=*iV ՠ$\m(j&g;ToPg:nM>e ݼdɒ~YDRzX>Rl'e;@GG P5RLcq8~+hYw~\TJ|?` }_'Nli$d6nz\* X9dJi#cU^+<@䵲{$X,Q*i@0[K>:$I-\ΝoΝ]9l]CoSz`ZB)R y}-зQy|7>|YG`(w)iT7]j\/_]e!t鍾ߩ1jsK>tׅ p˿ѣw(p 5rwf!SC<Ot5~K>.se+O<*"A"jU0ǵ!iIƈcsܔK* 5 {o?~LAzx*… b )Fy [RAf)^%b=2666_J f ! 4Q fj=irUtFCLcJ;|>/f%Lf811ШqB (jCl jski6QAT}}mttT @P h@ktq: HDI9 _RG5DMFw(T@hRԻqS /հ("d;MN:gϞΝ;\If ИFK(B!ΡD2>9hqԩN82B&!J %}Zvm^|4~k?~%2 M@`_=q/FcDCAqulNf^:eC&BwTgЉ]v\8UM[8)iz6c5X=X4: ;vlo] hPEhEZB*X`dY3Z;}`ɀ龱Pqog~dY@ h4q"iA @(Z:`l;V5&eSs!0FzqUz@Ν;oLAKxʉH55?E~we2&I.BxV>d6\NXӧOGJʠ@ zlq-_Ϫ@c͋]>~\$¥&`9dPQh"gGT<38^\ z,5: X/1!*%cLcud)^;V9n{XeR9|[{yH$ӯ@P[h zD9R3 0==]#\:\p<{bMcU lf{8}a zmϥ{޿kX S@P @6=_-JUIF&Km+ֳwyܵqoRp-)`v^;8P=(Df/}9rD2*C;t@=`ٲep5~$J)( ޽8NmBwyhu֖1=}P::*iA ׻Sc$0*'OΑ\ u===nKwpȑԊޤM?lYmelXe&6Jk{iz ];UQ,dkk]K.naXvRz8'ꁆ)籞W³x s@PypNiܘgS!qv?SO}r߾}.0 @Eaffvt@DhM*yIN -85sKqveh)^7`؎;6 Jv0d8S;vݻoi^ WO;۝F3bDuZ;SGg茔56EeOB`86 Jߞccc?x'|~g<$ ֭͛#mS(Hٳga``{ì/Q!Įc']l,1 ԵnLbJ)޴M[:זR8[[[?dɒ{ׯ_?*ӿ@>`T,K|Qz+dY6R JpA16`3\_vF9Xcۓ&M?] ]ev#T@]pl;wnᆽW ===_Xj,Yo$ؿ?*klcCxsRVȦ) KS5qsM5.IH˗o$f\kb=~###d#) 8Y&!5@ _7u-m|mkޘr#n)a[Vv-R2 HN枢y^z_xwݻw E SSSo>Dc3.6/20XWq7wJ3ߖ&p76>µ.*=&|NkbxVZ+b&RXR*ś6vzҫ5y\6EmMǫ<ʿM4xK6 P\ߐD/O5XP~trr|'|߾}TfpI| ,kגf>}N>MR(^&V H#h˴뺧[xŘ"1TO)ۮ7ǘaT%q/ AQL$mwY٥Kb:M\W ǯX7MCꪫ^=1+zqTE1\DwL1s^,!*c|?r((6LLL|g޽z=zt^g䭯azl9^5|pw0eŔ囩k)(K+ gO:5o}볻vyrrRZ w֭(:RpBXf i2?~mLyTFU8WZ&?RȕW~׹ts헒"cw}742}ndsR{_GG_^wuZ*/fE4M)U7u&[oSJ((1!H@|b޼yf͚˖-TBA}:}Ej)sxC#ɢG9FuM\A{b)Az1"6 Ըl?U(866={ <\F IDATo߾@ hDhݳL^Wu@);wt*ؒ!Yzv.nXOTLt-qPVn%Ic.a Ld2_7oGn] .TBA0D]!}ĉ2}ѩ0d sX#2x.r件Z3;[$-KpI!JEc HWSf^d3g\ruM5D.z? NQbH#099 ?v p:?Tt [0c$"LfDؠ?av ׵N'CZ-O5ߗ~X`㎺ϴ4(F8/BHN ʖ#:Ep. K1>DmȸluL^#gk1rt(~ jm}qӏ7sǎp61Kz$[နR0<)MBjkKS+333{gϞ=}رgŌ BR;"\x1UE,[۵5O%_3m2xW{d1>wZyW\HcI}!\2C%17Cmccc_w;cC-zR7h8N@jM|bmc̦ҐH's;}l0-Ӂɻ:߀@[J&Wsr)\1Z[[_p]~? \B"9*@[[,^*޼˨mٌհc~L>֓m]^˸rHp2fCĨ`=W]^7N]4 $fZF(* x…>;v 拉& "7X|wRjyL0"XcCs&svu  iۥR醱}ٳ=ؿ:tzT}F[.hQnF6Ԛw ޽ic'k6x16you.lߧ&{Ay, QJǡ4 PòZ[[`_> :馛4Pk={^x/ocXQ;;xa!=Ssl;-mUJ@F4&uGnML|f:;;?~/-[lTLF9~rhhz|XmlK~*e:Y+^ӥ%(Xy?~r^}N ƀ`7ՑPg] 5~"-%ק;::>uUW}n닢H)F:qil+V޻$$om<)ԲԶuwxuul>*y12sO׉S"we= r{<s>]cjj}}}'~O>k x`q&jaʕm8]v]Ps2O[N|ul"jj ]v/hK-k}ɁqPjqj.s=h:wܙ=ONNJl$JF; . `ѢE}lFNH/TF1>Z6HAw)0>eh$q[j)&{2{T*ŋ{>o8@ԍ7mfffHcǎ<3jݵO\V״4#m'Hs -gɈb1MM9]V!Ug -D0ie_[[oᆯ]V6;Dz`C#ŋaդm)Q}.nZV̱T~A>qa =Rx،A @a{61 U9Jy1$EP65k|ouk7mMMR .]ZI6i6IG4 I8NpT7vmO5LBUfǨ3̒Vqql}K]R(><}vA*`|ʕpWV,J~rgcc'm3^b(}>>ʊ-DԨ0HVg, q %3"MzR1\6ԉ(g+Yɥ}B&%K>׿^5D͍tmmmpʹ!q "miy nZnZ vzs_z?cD1J)`e 틻mkc2IcGVh`#XC0Vmo\Rl67#h|ff.^H;YyXdsrTHr Us}eQ mwuUXz/XMFZȢ2i{*fRSѐR+FP5V%LTၞ{o~&Pnݺ$F; ڵkIp> ӤftQ\IeW-EJ: ÔN1T38]i]’+jB=⩙.Y4Fy5Sʿ(o}[9nPsnh"曡SphhN>M2v2g@!\-G]%~s~͆p.2 yz-JWe7خ#2Ab{Enkk7/^XU !+8cR iEp/L&9}r=`l(R0#H5|[a&ć|1OYGn3DHoN;sm6ܱm{E1d[Ҵd]]WM?>==k?yTl0jhr i9s.\6hR}xBα^5!|jn&SA6*y!C?r 0%g慖Yn÷~{ &ǕRk$\h"6ԔBC 6*LrI=\gĤ*p 26V I3>βFw`MD\|*;;xbݺu4PKF< eCkk+,Y%9+> |0ސ~e%L( EfxaBx0a=Zqv@>A)Cl [Ԫb3<_ɮc_mē0>>~E~.ܴ;1F-TU>giiY>pVQQhdWLl3./D}?0G-~-y`Ȁm2P"ǩPn-;lٲQLw.v".] ^KvXб8~O oNj=wFYOUqNkj%٧vEkݡl醘:Eb$ҩOI*s.SA%RI%!Nz ۲<-f~&sj`kͬm̩60oW:v{P|ul D`α3}/KQd7ݳ9py8͛7yb҉NW_+d̙3^'jaIسgy?!(~J#1Θ(Q>>"L5XiY*ڌpVE26`K ue `7VrdF怉YS dQE{{YHOLNNtvvŋQ^7P*b0k;.ϟc|\9-R6va3\zpU.>OvƿcXRo\ϜXr Lcs-a٥(izzz1!_hrN Q](Qܵzl4:;b$vu{9Ⱥè\r>hKUFRd 1JF n h0RK5qv4H8Kǜ+ѷݿ)3p*br \.M"ذa4|QUz_# wbc :SӤLT& [#S;caHp 8d5BQuM輸Qtlc >=mF\sl'sDin|r'qVro'Dw5߱I.iuS^a k=q nej@]KV.U\J gGE9td.?6muS%o{bhК.\R d`dÏɧHk6%crFReP 民&%Sp Y6&]&Fg5kLQ| cf Le+q|!=ܓYjGӨ'*ҥKaܹ^1SWW=1eU?cXn3:C6F8 G-D)v/qqW _[Vrfy"d2}ݯ  NzzzFXR[@!l'R's ``Æ QORXAv--ӎXbJ&$Sj=ӯ2>m+cc!c&\j)Un\]]d!8= ۽z\Qp)zsp-r_r F>QRu]M Ĥz@ECH=XGI=΍$P.OaV i}dqJPƙPXQz\ &ƠRwHJeL {~Yjd Zp{Pol6 k֬1Ny }Tq엍{s P^IQty,`?zyCl|S|&>J@81c[ck&["vS)L?ذaC)nu dXd댹ț0\oSh"`4(U4"eMe'M #R[>"=s~t`u Ry(f@H(Nrs=5g%uMJݍLRpA׬Ys9cmF?T)JDG1"%e~]WM-/V6NwNS`IG!qL"̵)j'>d'P#Q o lmm@̇VK2c O uId !xcO 4i=˕Ĝp%(Qǎ Ũ<n|@xRj ˽A [ӧOjNZҥKa…N_3ebM <K5yݦqW6uL7r}K!fCHpL jϽHIqꚷOhR].9Pj (@)u$˭[E]g␀6ky:;^6.§}ho҆R%omLO*з0EjvJP$)BRON^ IDATZb5/lEPWmp2˽kEW v ΍l2;w6 1E(#?b #<ʚ `g )d*1\2_"mSbR0Wl<!V2FkL >d 6L)I v@իW_le\ޞOu=n WDÏ-Mvvl&՛ѴnK$:XϖSD(SwdB!&Guf@ww F'qC?YK|rYSm5]#-C}W13cB-Bi) U||$*FSJ=cɘkglTB!Х،//>6 3NLƌmߦs۠*@X*@(chpKVzIq!c"m(VR4}B] i&RmOIJ4{(C=ה|v2X2Wjm)m1]K-}f1D5pg5G V@r@Vy>$kX7y>9r.6 [8R 1\kndKG+!#U%qTdUA}^Roڴfv;,FQ͠KK, 'ʿmE \Z$wDQ ҘcZe0 5K간)u"Tbg+}m R+r9QԧJ%cm] kɬ9.ҷ.xPrmY7&fMXq`[vx>k>d7 ;2@(5p5lܸ< $`ll FFFX g) U.co*A_o$w?yX/Z%wP!$1R4'Ubt]d]]C]¤g;/uJGQt2˽vVKϡIpi(Kś+VR$BWD\/s&1Ji-طamwL% D_O%v. JglM( 1X@),5(nxaCz_@! w]d`8gU ξK/ k ӱ<ܐ`H0gZ! qwww{Sd]7*fQFFF`lg2 Z Z[[Y_6HHb'~Jfªzڼ* hc 9vʽyߧ* 5-j!'6b;TT:N  ¶-[j3rQm&B__YPYܘl֬YC~lc%\ҟOUzڔ;&P(H%)crִ9.%N#By~9͏t?~UR,o޼9ʁuCqbBPArJTzKxY[,UTe]6a<(W>W ped RČJʰ Odj'K3K JXLdJ7onI3uvL*s6 Xl,\ZLt6^gd]b踍~0ފK6v\X"4Ea,!1>:s%e.ٞ o(JOm޼ &©SXKLDMڵkWw}V&ۂ\׏U$ |8R?UuCS"񶱍glFz|'S d!]^C JsMK.6E2fffٳm[ZZ/{˂NiVz=zرsB04ru^zZE0RVS2Ǹ&QU%R{C)uG6lؐWJ}R N8Z X|9,[,C]Ǿf31 Ӵ[6pW P4r1 \,5k)dol J0`( xRM6ygd(T8y$Wa\Wn3Sw{ SZI3Qc 0^o?2hFDh3|3_9o{Ut6lD("Sc.%ظq4QJ`x(odS>ΏMN`?L^mrtMd<6',AqBUmsc7Lq[0S\LjK\G=gS%S7x<ڌ$`xxYrjXreUHI=eb@(lޅn :n1bR0kD!*ĭdGQPTt]_1U2Olϒ.?Eg*RDb+Ꭶ!{Ф|>_uzjXxq$ &߫T8־36J$2U3'r̘m($ixuB@qUmJEK0jaE@ {qCt38^`snF F0Z<}NWu9lCwM>UCt 5QݱecS]^wi^k] gUㅻxRU j= mel~W3)kV`zzC2 tMA{` wM9I [0sfRՓl$U0^k.IWHКm!J`sܵMC6nܸv5+ !fYAŵF f"qlrѢvĪ ؀:K!LJ>p=\ZFa/16 rîy^k@͛7; C( M>am0o<6 p ,vy|I#ͩ(CRdnW0(Q&qH@O 9څOԌ =TL)EU0@XnqƝf%RpByS<}j[^ן4e2`u Ÿ'&'- j͖cX,'*eTl%Bb[w>qi~>ޱϤUTm\Yی-/2fܔz>)nB1M4C:`)ƍL}2.] k׮%?.￲O2ж{޼çU湤2q(ƒZb5Č"g4"ᓾU41ַ|({ccclo·,[ zxXcuU(.r&\|7uj9%]n%n;jJ ^kbX6ok͛74x>@)'Ni>\s Z -akMn$6Y;b=[:u /JvJNsYjVt2:=[ "2Q"UE-86B$OE2nCTq{Ut &"pۧ>#]#"WUe'EǏ#N+ ߪ_t=\6,k;7/S(:f8 `s,P6CvݖDHDn(Eicѭ1;Ml^A0~2`zj .HǏG6UȦ}eSn e#?^~iR 8UA^bkHj-3pMH;/}s۶#9#<P**J/^"(mok(|=V4MW^ݟbEu)pP;nUOieӺky6rr[L\.s"y;-tqЭIt;mv8]w:c:e̜ DDrj!Nn|N˒ZdĻ*P7^?<_axZBbzlUE8wR`%^]UO940RSps.nG̉hBU6{"6NJd*{kPe .9nvl x+@OxDŋVfqȑ:_5-~ik;ݔet/CZBf'=2Kφƿu{pujb}s8K7I&XDj$VJ%c .`cc"ǎC$qZtlSq:vkq^WѠ꠬ISzR:G&/NuF*b)+`wpij١R*ץN[mQ + wHwsry{zUT*T*)DQ7 2vc:{Ϋ a;a#r#ՕP(cѱˢI$KvU^ߪ@U`,,)u1!ٶ=]-&jΟ?-O"kD"Ǐ#H(Eo^#}Ptڛl]Q prX"MDEGj0Ds6"ŀN D9-2XFp.釰! AT2z]?;;cfA^.xY##۞umE5%^"d|۞Agz`U\NАi>; C@<'D " ́9uXUw e-AU΋.tbx<ړ ca*Ξ=MODh4)LNNj{N]:)*Zfws(F^.K23dW[^r^3nىg-~~Fm)u[8YP|{{Zsammͳ:a:u \.pإuύP{i"$lf{Nlwc#MTڽ/vmQu"ŪNY?E,HQD =eXVVV<=:XśH$p LNN* G[ 8M}嗹=-ZeT8̼>߭' :Z3)FEýs^:lk=GϱXLk~xxs~ IDATFFFLUZSBP(|,NH|~wիWqemѻ9 :uL}͝2*\MIemg*EφBnedh^;x)*F׫[#酡) t:W򕟱'ps4 >W2.^QY:T wq=X$v3q*Ѯㆨ%v^u(TQQ`]WU;7Qq2~-Po++FFI0Jɓ588H0==]p*Yq}Ymdttw}B2N=e+öo=HKW,_7TU{O4 !Numhzm PK61d'Ok X{j"Ԝ b^2$I[T-rU:{٢"1)Q%+-;Q$:"ғ9/ѬydD3@v@g&KO$ B b"q;{lllgc ԩShYw D"U~4Q@;2nQHH%<<1rmJO}x駱9uo>Tccc8uFGGakz֩@0b@$8Yi*Y7vNn;MMYNqFgәfDEϼH$,x<|>B4M\|.\I~e(>;7aa'29E^l2}OQ:L-l~=@qx訟q/ZA%R9D";ÚS(Hpi{ dcuugΜlΝևѣD__lY?Pc*S.UMņ2ĀJDŴv닊:.)@__PT*xM߱ .ҥK7m+t HӘ9Rn' :;5V9?h;i Ы RebDLLϒ΋e]8x Q(nz~NMݫwk EF;tMs_dDyq^:lMam[\.ghvGGGFMzDc3dlooٳzUoh4H)uQ.Q R's*v12ѭe2"*E5ٝn AFodrHHR*|,gy;;;ZE^000 A?NK;ovvnrla] =ulM7 rʲ:s<xllknF@58s­KAOLLo쀮(:Hb~Y&S4'`U;![|':REqY(E&wyFO &+5"i~r9LLLhMDV9UU,..bii9@7}co~~Q{"crtlCdUܮh?YsjadއcnHTZuSǵagC7aigCƱcnzn06O ]9(2==]3 |0&''\OdE?edi>$YÙ|>Ci9GVӶX\\L8Oщhd5R4ne5 ) "ߏV%luJzb?Y$ѣG,Svmo:rKޙOqQ3hB>Ekqma2qpQP7|\R-aNLu9& :-U9]_;L&&M; 6077 q;trU]`Ƌ/+WRthjbwܭ=цDМi|OD˵& k?ki`abbbh4Zr/|R<i9 51 eZ;U+WƍX*r d"tQ2x˿,[D"JP$|`~~,YC!RD<=r 7#RGgi)x-Եo>ME,$fLD*8t׌D"0 aX,:H(2G@!N4|(`mm W\K/Ԗ(윏S=%.8`q`n:'t-8cF(֠s, ؘave\~]'nNCD 2U {Kd bT*Q ;i@,ñ_D"Z+/~7@ B؛JK/ᥗ^ʊqtP (8N * *r rs47fŴ h8 7b~TgA;Lʾ V])^W@3`{,w0J7:)% _hc(lt~a}}7n [vYzAn!cwA/@0NPqVUϏ"J=@f=` o"\h%kkkX[[ *2uv7?dC@N__cyxxt: !k)yi@+qb 5lll&Ưsj;cfxWu8S'H$l6|>E*|U\I.ϣ>4 &k0 y i09666PT #UXDLS ?"Y?hS0 H$L&l6l6۲/n_?HDn",,,L #k( ǃ`x”h%VPTEMO 8A=  zaa !͢ro97{(5( H$ۀ֬JJ_;cjؗº/`&ߏt:{ur|\.@B'Y?!` XŀuT*2B9sOw:Ssqdb߿𣉘_VH'BqCK8ʊQRޘjZ bׇT*kP9{,?lb-BD(*CNљ)yȶ7V5@Vqq$A{i~uͶeCnLL&BEM Vu_-a2@(dZkH>H LHoklg@g2Y#RF՝V3 + EvwwI!dL10 qb({- {OD@75#bppCCCm15f:yZmAZiAX u&7 ?Uud2Dvo{]looZ KT- "Fnr0;n!~;45w5dI&Z$AlFA`=,PVEΥve7:u+Boy78v;YzC:Nw&=XV}mlHdy B$Q-zg~z4:jvBF;1oyF"}GmQhDS㡳:>#@>2 G6O9>/5a&X,D"ka_ĺ)9?FͭoyvxN{ }3d/ 16ˮ c~D"/5:m$Rԟa^2>~FFd2rd2Z0~NtOD4ĩ0ƶ;=˴#|@?Y30 fHH&=q͂2u~/d~{hhݎ|=i{"ktfvtЯAcրD>؛~/fÌ]aN 5:H$/t ;`կ@qdǟ =/ ػ9@AׇT*5L3;M<񽝃]DSSS 1Co+Q#ddr_$I$Ir𱾾ulllrO&Ao3$~g-  k!;ފ쭇oH$ӧOvmH"cxYh ]vvv՘Ɨ_vJp?H LC</0L&$ |]VuL1R%EȰ`[F0 xjcgg_sW,g.;B1aH$<" 0Mso|c싆a^8'ka0DA#Lz0Z>:NΡzj^.0>1==ݳH~ Go"k}OBDP4N14Mߍ3Osym?0C bOOOd D@2 aAgff%S ' xY x[4fZ!@aA1W*$6M4Y <-rk>Ed1PTK2 C={/w5Æa,,,ꃇ~@,BD9 d DcZ*jA<+[*#͍11d-84 #RJ @ 4c9'(Y ?U2 Gs^?M!as!dalc NAt$g _)˻d!0c!8J!P<CrA,Byoٙ 2 {9?U"PV</RZ $!`B |0NOOt>fggcx 2&/]0tLB :ze• =9 '@]!2N8 -&*`1v$뙟p N1o Ybj933J&!@=‚a>c4G:D}WJ%jC 7As_+xe bx1W 8;==MwH+SPՆ 89-d"`jQw_3 iI`09E ~;'P.M2 B& 8yح8p?#&"<0ƞb] `K$ e8_g}sRTȞ @=( aob,T7osΟi> $43ث312^FdR< rLMvAG1cEao9zL(Ȑp1vs_/x2|mff A2`gcy#CxY]4Huf2k.xz~1v rL} A4#7 #9OH2ꂡeHsγr)K`YUXސ  &|1pέfmsέک?ءsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 2^7IENDB`clementine-1.2.0+dfsg/data/icon_outline.xcf000066400000000000000000007553171223327513400207020ustar00rootroot00000000000000gimp 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.0+dfsg/data/icons/000077500000000000000000000000001223327513400166025ustar00rootroot00000000000000clementine-1.2.0+dfsg/data/icons/22x22/000077500000000000000000000000001223327513400173615ustar00rootroot00000000000000clementine-1.2.0+dfsg/data/icons/22x22/application-exit.png000066400000000000000000000021561223327513400233450ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/22x22/applications-internet.png000066400000000000000000000025131223327513400244040ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/22x22/configure.png000066400000000000000000000021151223327513400220470ustar00rootroot00000000000000PNG  IHDRĴl;sRGBbKGD pHYs^tIME2-IDATxڝkLgm)ҕDJiUp ##cv3#\0[6/! .ې6YQܲR41&QT>́&Xd֮J3=?yr?<eZ&1339q4P(xp:z-@ǒH$Bff[B/o}ێQw+/ $o,ŖHkQ4M7QBH.{)kKvLq0l(A_533`XJړh:`iQQQ aamk׭5Mdoox (iT*!#SZX-mll\߰d; Ç kî,Zy/C" hhN#F {%|b=Z6uv=-UUs\joE $+͖&"Gq.Q0nc9нBqn'"2W7_vUMMMa2HpQjxZl{{ E ,6>v;'[?_p'ھ?K p8O{+*6QN~#g4:0 i@"Dyyx^00KKȈʕ#E_jj4%⌫GF.\X i:rp$paIog>I /?IENDB`clementine-1.2.0+dfsg/data/icons/22x22/dialog-ok-apply.png000066400000000000000000000014321223327513400230600ustar00rootroot00000000000000PNG  IHDRj sBITO pHYsaa0UtEXtSoftwarewww.inkscape.org<PLTE@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}YIDATc`PeljDehhiiֆD 4zM}ee'( Yʋrj %E ̪iUF<>L鱑ƼP\<BLKyeT$y#K&"DŽrvfhPtJRj0f`0*)6C0#IŹ@IENDB`clementine-1.2.0+dfsg/data/icons/22x22/dialog-warning.png000066400000000000000000000015071223327513400227740ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/22x22/document-new.png000066400000000000000000000015511223327513400224760ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/22x22/document-open.png000066400000000000000000000014341223327513400226460ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/22x22/document-save.png000066400000000000000000000014361223327513400226450ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/22x22/drive-removable-media-usb-pendrive.png000066400000000000000000000014461223327513400266350ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/22x22/edit-clear-list.png000066400000000000000000000023471223327513400230570ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/22x22/edit-clear-locationbar-ltr.png000066400000000000000000000023531223327513400251750ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/22x22/edit-copy.png000066400000000000000000000010031223327513400217560ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/22x22/edit-delete.png000066400000000000000000000021411223327513400222520ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxڵkWǿw&3m6-ٙظhP]!B}1ITCPھXZBfڦ*(tk M4nD;e-e~s RUόՊ2}5^^*~G?Õoe2Qz:qp|!}F4P+h1z.>_fU=v]ifW+^ufIW*X/o%޸<էY&(@,؀360s S J%pb! JkdL{Ǐ;k7o1QBʜ\䤍'++67Lˆr钫XaTZ;gw%!(X=0}lPUɑLm{.| ԔmR[\k(#YT ?tt@g&&\][TO?ːԨM@?p]A(A DGZFk`djmk߂ԩ6jc5 c+]`hfWWpV|KЀŽG-sn:IF` Ah+Ptۑ#!ehMՅϕ]bcBWj"|:4Vh8VTCi^T ?_[: (#hC`ˈ^{2 \qva;q>6`19_/;ާ42LƖϞaƋ8$X'- n8L~S=}z![VxhXtNn)AFPrw gղ {{Q'-Top蓾^EЖFn<7reff܀҆Avi~ށGZX*]B2|FE}Ij코}Lz ^IENDB`clementine-1.2.0+dfsg/data/icons/22x22/edit-find.png000066400000000000000000000016561223327513400217420ustar00rootroot00000000000000PNG  IHDRj sBITO pHYs B(xtEXtSoftwarewww.inkscape.org<PLTE.../// ;;;,,,777777???111CCCTTTuuuSSRUTS<62KKKPPPWWW BBBJJJQ;)rrr{s   !!!"""#$&&&----0'!6 888>>>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.0+dfsg/data/icons/22x22/edit-redo.png000066400000000000000000000023351223327513400217460ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/22x22/folder-new.png000066400000000000000000000016331223327513400221340ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxڥMh\U=sL2N~Ei)BH)Eb`BnJ+wn `vFMҦI'ddkt6ژv~pሪ0dT,!kIugD߰/u6*,_K?5{vCChMA@|St6zmͯ9,?O߇vMF_ HnHCGe]z4#H'(oҟ淲{P>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.0+dfsg/data/icons/22x22/folder.png000066400000000000000000000010341223327513400213400ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/22x22/go-down.png000066400000000000000000000015741223327513400214500ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/22x22/go-home.png000066400000000000000000000016471223327513400214320ustar00rootroot00000000000000PNG  IHDRj sBITO pHYsvv}ՂtEXtSoftwarewww.inkscape.org<PLTE5<>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 ||#vvIDATc` 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.0+dfsg/data/icons/22x22/go-jump.png000066400000000000000000000010761223327513400214510ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYsaa0UtEXtSoftwarewww.inkscape.org<IDATxK[Ag6s A(B5[ HV$B#K (^#r(^r $F`!$}8wx dzBf/0HD7$EgbX]kҶַ_׫//i5H#h ?Z;Z w+adؚ$@ f2.Ƃ]9s-OIm1߹ 7LJ$~J2kP.N* 1Ľ)˖.gl*<.v7kg]sDCw~|=T*5d۰(9)SbcyL{ D:0}k(-:khzz*h4Z< AgG=FD\|yq 3m1-+{Wl?w8۾IENDB`clementine-1.2.0+dfsg/data/icons/22x22/go-next.png000066400000000000000000000016541223327513400214560ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/22x22/go-previous.png000066400000000000000000000016131223327513400223470ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/22x22/help-about.png000066400000000000000000000020211223327513400221220ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/22x22/help-hint.png000066400000000000000000000017461223327513400217670ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/22x22/input-keyboard.png000066400000000000000000000011621223327513400230240ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/22x22/ipodtouchicon.png000066400000000000000000000053341223327513400227430ustar00rootroot00000000000000PNG  IHDR$xbKGDC pHYsHHFk> vpAgX IDATHǵixg;{NvK%i *AZ[,J-ZT(VKZ5 UTТj%$$"8ww~t~3:Yw@J)EEfx3[u62WHr 4D퀮%@\bN.N%UV:5kߦsΩ[L vknJr.{#;l`_T9zXb?굾pibilU+w)m$^g1n@)Xw qA8iT(\]mx^d~SS-%IeChG2kuU'>P % hZoXф %dY a8m*6A~ü4s|   bwAӁy%ג }-@RR.)־`Wjt7"߲CI1SΏhȷ:0S>T[ =i"gI-E9We\$..Y =?xY6Av>s_;- y饊F`LIe%gV0a[.\@!X*I<7Ybc (2\;\oޓ̒vmx`22ncsE5ګr(qgaňWVq{ӿۭ6k?O_h8Ѱ !4(ؽۭrZ|mkE}{Ԟ6 ~SLS ÖvO6EОk@wS%7gvGdFhZs{A-/PF9~?6ڌ7Meyy'ӲzO)Y3WS_Y/-E>-u@֎}yAEq @Ȳz+++_zr]ƌ-탲)e;/ٱG7i9oK8^p%ӮfLz懓"vD1ǟa@ޏrwBQN{S eMn?GkQGOy=*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Ͽ3A+LX j?w{rsm[^jD2B!}V]e2,+g,><>L#!)WxJJr/lopb¶(^:Df3BDF1rJ'tS<5Fx@jpc7S4_,XT`d,p] CP@ܪD]{9:p5GΗg:_;N-nw Aъ8KIENDB`clementine-1.2.0+dfsg/data/icons/22x22/mail-message.png000066400000000000000000000010711223327513400224320ustar00rootroot00000000000000PNG  IHDRj sBITO pHYsvv}ՂtEXtSoftwarewww.inkscape.org<PLTEޭ-tRNS "#$+,36=?FIPRSUPIDATxڵGPEQ~%)($Q0K LU6H!@3"b=c[+U6W Ø; Y9L0Y=iSJc.mȘMs&#'Xa #` C頮`;Y /fNQ +I@:TSIENDB`clementine-1.2.0+dfsg/data/icons/22x22/media-eject.png000066400000000000000000000013651223327513400222430ustar00rootroot00000000000000PNG  IHDRnsBITUF pHYsaa0UtEXtSoftwarewww.inkscape.org<tIDAT?h\u޻;wj1%" $"Ep B4Dpɩ Ah*@* K^6.wp^ F,&"nzzdJWB5buOm>$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.0+dfsg/data/icons/22x22/media-playback-pause.png000066400000000000000000000013211223327513400240420ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/22x22/media-playback-start.png000066400000000000000000000013401223327513400240630ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/22x22/media-playback-stop.png000066400000000000000000000013401223327513400237130ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/22x22/media-playlist-repeat.png000066400000000000000000000013321223327513400242620ustar00rootroot00000000000000PNG  IHDRĴl;sRGBbKGD pHYs  tIME^ZIDAT8KAǿ;kFBJydbC)(X]ִmuSY(2$~(%d%wߙwf:krĊo7LC*y^y3 ykx&0By o߽ˑX7L'Ϝli ð@ h7W7ԽZ 33,Phs@t[۩@cC#ON\Jy>c!f쇹T2}a $O1RDDe[@)Ob8H)6ERRu'n)"'!= ZZ'"H!JwNٵ^g)DQkp(8y2PrresK+He"{#]{i pc ;۱Xs8,>ySkMMѦhj*Vbܓɺ}5,?|^1c#ˁc%zfٻKK p u>")=y7_[җ.,}J? Ҟq{cNeBPW6X1?(([uK DU?MoO+͸IENDB`clementine-1.2.0+dfsg/data/icons/22x22/media-playlist-shuffle.png000066400000000000000000000020051223327513400244340ustar00rootroot00000000000000PNG  IHDRĴl;sRGBbKGD pHYs  tIME0ZIDAT8U]LU~ޯ_Kf#1H1 Yta9pw$^x\NK+Ю-me[ ĘxgB0F–+ Mc3*8)!_s ŒCͼ19ϓ|KKӽ;1En=mu"81H;.] Qr:i5,/R@Dp4xt: TB✣XT15=Nfz+~L^Vtw3c B!2 'UX.H$PJۧHfteJAKd UP!RI,Zk/pj'9:2;-oYzP,cfgg䝓55tkk_+٠o0ݴi:w>s}CCCC}=$`-|d4ڪ8_䳹|w'WMX4oE4nB+sZ(}[*̅X'Ll&CC/;~? pdC7tXŝh?w$]tKa\6GvE9zX~z=':;=u//6Ξ4杢VxԞ~_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}pbiPBM$cmfStwН'VH]>='Lb'O"ē %RITdz{R"='+4& l68K΁X;<ؠ˲Q(%+%`E:oB.>~׭mOUcm>qCyhJkxyy9|iOMM9l\0 \|N=yuW1uqHd2\Ϧă,]e_/w y(Kz`2LQ[8]DVY )=dpY. .4~k pRi E|2mUҪ/&#ǀOX\^ˀB&!IENDB`clementine-1.2.0+dfsg/data/icons/22x22/multimedia-player-ipod-U2-monochrome.png000066400000000000000000000012471223327513400271000ustar00rootroot00000000000000PNG  IHDRĴl;bKGD pHYs B(xtIME  25>4IDAT8˝OkA?4*XiJET= "7دo`D*D+E<9xI4 %eSCNwwƃ /˼33;3tPť-?AgOg˥ث"?$,b=~Ա&OwƕTH>躦/1z]а^H|օA0B(nYR-PU*ī7WRI@""1st)%SxRXa0:\-e1)mo(9Pݏ /j(뒔Bt<Ӄ+;wUNg0, C<]`4WHחSzT;_:J7Ơ:=BO8$r#kFi3F61m1LM%o?FwhR)7`K 1N-,%!զ:9ض$ז\Lr)G BP,xx|2\r+MPRddA?|0q*XJ oָ0됚 B`k\\ly2+|-S hwBZ@^C+W!^= W_[3n)n_q`BJ?Z()XOpyi$_jlTo[cU`C\- L[ooͭɵՕp5,s*zo6~k௭ԇZdbO H@f;\`#vKamw8?'dnIENDB`clementine-1.2.0+dfsg/data/icons/22x22/multimedia-player-ipod-mini-gold.png000066400000000000000000000012761223327513400263270ustar00rootroot00000000000000PNG  IHDRĴl;bKGD pHYs B(xtIME  0KIDAT8˵KOQ'RAbĝ#aqWp~ݘ`+1nLDLqA+U[Zjd2gߓNէv Ne_|egG1)Tfoܹag08!S^=z ﹞g$Z1֙~ݺ {F|ı(e^ H!*JxXxpI"%1(.O$eh:EDiD4"C- ;$D "B't?m)P:4I :Fta QfE~mBhi9mPJa96z!߶.P/U'R-+(m7:[D龅uu%;Q&Nx"uj/^&WltxޯmvH#Rj1k_O; ؛?KƁI ݤ5@3en[߰6@'9#IENDB`clementine-1.2.0+dfsg/data/icons/22x22/multimedia-player-ipod-mini-green.png000066400000000000000000000012741223327513400265000ustar00rootroot00000000000000PNG  IHDRĴl;bKGD pHYs B(xtIME  1XIIDAT8˵MOQsﴥ@Z#ꆝƝ+7?tiL/p?pa&,$ Jmi3)iI&3sw&$*՝f]r|{جoED DppkucRfdVxo黶N=cЖŋGQ<,TE*$_jX\\cP ŋ0xul  kէ(߀ShMH' \Qv~,\B2""hundKטJQO,a&=MS4N+t<{ C.=O&15P@`8"rsB+Nϊ6E?#lF+ %7gWۢޣZpeFL۩]~D3;YtV՟{ّ{Mb:N6tտ{}ejeyն"g'r'6]r_RU{1+^{&7 k/`0 䁩PM" 8@hg^z{ paڏ+IENDB`clementine-1.2.0+dfsg/data/icons/22x22/multimedia-player-ipod-mini-pink.png000066400000000000000000000012561223327513400263410ustar00rootroot00000000000000PNG  IHDRĴl;bKGD pHYs B(xtIME  6;IDAT8˵MOSA33Ђhi- .2aE WK.غ? l jW Ơ$%lic\xA0[drsy;o̅MWKKOvv2B^OL|<in& kC Օfk,ӭzڧyVhybp=5VWo3xX.d)ӹ\ךP8Ƹ8H,F;8C^v ﮭ!J!"Ky2Z}|v`58ȁLJ1G];FQJ]e2(hU}EPBvM<%::zn)5J)"ZkNN(cБH`q74[MшѠ^*q]>BJ.fBVckiV*PJ,hB*3X_ RzN(?37\p"v`yPЙnbkjPH{8UM6E   D9 89p5;HnE ><?::uIENDB`clementine-1.2.0+dfsg/data/icons/22x22/multimedia-player-ipod-mini-silver.png000066400000000000000000000012171223327513400267010ustar00rootroot00000000000000PNG  IHDRĴl;bKGD pHYs B(xtIME  7$tH IDAT8˵ON@g1!!r gio)H.GH,Xy;])B[KzDQxhmEo9]4Zv!NY^JW`5xVV=::*Und:9֚:ﹺRM-Y vQi68HM8;p$q6Bn6c9G{G}ZRJc|c V4 RhBR8IӴVAcP)%ZkI.ƘRQ`!R9P)EVCc6tYIӔd3&_Yxט)77&v8gY#Q1 lT888FXkKUYpH?vnӂSy7+ښ-Zd<63>??qxk(gPH <.G,idz4|UoM"IENDB`clementine-1.2.0+dfsg/data/icons/22x22/multimedia-player-ipod-nano-black.png000066400000000000000000000010621223327513400264460ustar00rootroot00000000000000PNG  IHDRĴl;bKGD pHYs B(xtIME  1YP|IDAT8˵M0u~H[q48sv!Bu un'x 2MF>ɒ-}ׯ,S}bO^?`f]QU5[qZw#(p}` tm&di2P@1ˑ+(hҋoJ\2 @zlp-~'Q\ IENDB`clementine-1.2.0+dfsg/data/icons/22x22/multimedia-player-ipod-nano-green.png000066400000000000000000000043231223327513400264750ustar00rootroot00000000000000PNG  IHDR$xbKGDC pHYsHHFk> vpAgXIDATHǽ{TU~9$ jX V NhJX22c1q1Ό[f\y[*化IFj2xE˹p4ӪA<yomAkΨA>&/sDAw4]J%F6RR Dwws޻uw<|I)κ7S]UՋV$7Bo\O~49^$Z(ZYDX[Π NzTbVޚuٖ |!c?_Bs6oRyv85+6sOgi䵝6v}v=$]=׻O=n967fuД֮Co,Ia$kA0UC[TM%.ו{)a\( IQRJ`FY.%wB5_X/M͝5dȅXc@ƍoFjlkM0i6?{EtN.2x /zQ HMt `zyD1AM[Ofg;ʺm#q-05}y71@Wi5P AMݩ053➉3L&97#K4B0kU %2^.)}6zn=mw%53g\:Xi3 >D}7 W&!gAmZ\WcǕбa%-?1 H2}]7%eqf@/ -1WB Si@UJcѻEu=[gg6|#bůa>sj@w10C\v6}PyQఋmpu3 ǫ^9)Qϗ7ν eB ktNz=Svоix$걧A)VfZ+ߍ X^EP>bShrlφ y4sZo屨 XrD%K???X>o i)]~H~:,<3 cUG9t{"ta"89ıAgpeEeEedj֫___5ezgGXl>{&<{(0dzfȷ\c[T/@Uℝ./Z[p #3l8p‰'jduXV[Ga ̕ǘ ﴯ٪>_fMh%,"7 nl_r\)umy)VSb"6(bi}ڡˮZz޹a F7wA)_N h͙.&k"m}0/&vuع)O<."!_~nDmTmTWr Y9fH͐yE>zY)}gr9Mgw|a,CC 6*(B3e< ?V&r  џW< ?0_#1JH_/DCM9r>5=AA|PC ?  rV#vS,2o+dqstk>6oKռ}!E}y길C޽lcQ3ԔfcJik/-ii 8o\{FnٲhѺcžm-| "K\pvdC.tH+Q%Nr8W'fۓ kbuuG_?ٟOr;;ÛY2U Yuu{ҔbȬRJقFW%}6%tEXtdate:create2010-08-09T21:40:20+02:00ʮ%tEXtdate:modify2010-08-09T21:40:20+02:00UtjtEXtsvg:base-urifile:///home/john/code/clementine-player/data/icons/svg/multimedia-player-ipod-nano-green.svgS5/IENDB`clementine-1.2.0+dfsg/data/icons/22x22/multimedia-player-ipod-nano-white.png000066400000000000000000000011061223327513400265110ustar00rootroot00000000000000PNG  IHDRĴl;bKGD pHYs B(xtIME  3 # IDAT8Œ;QdgFdFLY2XHUdmD"i ,%i\;Mr2q}=99n>^<~j7p8TJZZ֙W*^yE׋gA0N߿g/ZZ~˸WRFZ˷}¶^`[LƷoTH~^*5qmoGql{}3ƽJL EVqs1gq@7tʥ2Ry3cL0D<kd`QGpi25^=7cRJL$)}X50D!Nof"2[VH%)&8 8>+%dIt<Ϲ> $')ܒes~c-Ee1S,E y!|ָq ey5߮贽 $?4twG{CO:yg$!seo(ձu?")esWx@U[j[&!|>g04fU.\t.iuM=~z a:~n]C~*ڤIENDB`clementine-1.2.0+dfsg/data/icons/22x22/multimedia-player-ipod-standard-color.png000066400000000000000000000013201223327513400273520ustar00rootroot00000000000000PNG  IHDRĴl;bKGD pHYs B(xtIME  0L]IDAT8˥;oP~Iݘ(jUƲd`CLL Tub;:AC$Hȍ:ecy4tsJ Ɲw\v[dn+7EGF^.y]Ų,/ÉY\tc.b]"ۃݝqxn.L__ޝSK Aw' \zoOj6@Eol4JeJf  ⵵ xo6v+^YYF|uDa" F,!&":P,Y,-"2Q!`0\OrYVMc MK8QRxئibl6}xgg'D IN6p"ĵZmh:F#P(<#%r4rS`,//: MX,x#NuX,j @>GSԁMLEW_>.vɬJ@8,) xhkEڋ4RjC9VPbz(sm͇IENDB`clementine-1.2.0+dfsg/data/icons/22x22/multimedia-player-ipod-standard-monochrome.png000066400000000000000000000011461223327513400304100ustar00rootroot00000000000000PNG  IHDRĴl;bKGD pHYs B(xtIME  r߫IDAT8˭nP?Ҥ #X:3ULE(R щ Q!y4[ )8/]M$8ґ={| jo_|93l5`0yl2f82 RnrcGGya%. KϿl>9y /~?}xtuZt &i}}&Mhõ"6š@)шtR !BI 5q7oCLS 5Ƚ4`6kqmx흸0Ƞ^/^[B!ĪFrq2]-!mUo.wHh!ZbYBPJo1p QeYkN ,`篫/.6sѧ,M `Ev#z;39E>T"DxW "/H@WEIENDB`clementine-1.2.0+dfsg/data/icons/22x22/network-server.png000066400000000000000000000013561223327513400230710ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYsaa0UtEXtSoftwarewww.inkscape.org<kIDATxڥU1o@~؍+J jE e tj i3!#CG((Q KmTM)ٽS$S;۟۶+Gv66ͭM$hZH$`4Źqn?|u0Mah`jG :>ZT6oהɓ䣧ԡF8sSzɩ?J3/`|3{ uWbl>x Ӂ6xOƫ5h,FR.;{m`IENDB`clementine-1.2.0+dfsg/data/icons/22x22/phone-google-nexus-one.png000066400000000000000000000070511223327513400243740ustar00rootroot00000000000000PNG  IHDRĴl; EiCCPICC profilexڝ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Ч5 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.0+dfsg/data/icons/22x22/phone-nokia-n900.png000066400000000000000000000015741223327513400227720ustar00rootroot00000000000000PNG  IHDRĴl;sRGBbKGDC pHYs B(xtIME 8-:IDAT8˵K+W?Τ&NM| ؂Unm W]=*ޢe7E <'tFe=99JD@#y2k^iVyfv f`"BG777_Ðyj0lrww7F4J8\.B@yNOO7tQ(S"t(J'Yk|m PJQ.~Zk=c lmmqqq01f>J~O^GD.@Lja1?YFO~PV$!MSzf5Z_rA^sX^yC$$I1*F-MSrRiq vVE|5Ƙ1ZRjX31Ku'iZnDQ4*ODT8V q[<#Fhc>R̰M&ADv@j>>GGGDQddeeE֢zo_ZZTR,wFT*oR,% 4 QJŎ8_OOO/EQD^' C&b`nnqZ; e}3z=ϓR$Z2Fwc!MorZ럕R餬o@]J)07'-EIENDB`clementine-1.2.0+dfsg/data/icons/22x22/phone-palm-pre.png000066400000000000000000000016531223327513400227200ustar00rootroot00000000000000PNG  IHDRĴl;sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<(IDAT8KoU3O.qW58if U_ĿAeEU !hA8T,ӄ*MI&7$x.gܤ4s;wFH):MLL==j{0 %Ά~9nm9]_~0WKpuWf' HB [?9HO_f F(-.Ɉ @–[ݬꩂ1  VTeT|h*'>EQʲ,Ξ:*>/coXH0✄(Rm펿Ưs[g/i@bYRUvvλiF_`p@RHVE*v}ɞ\ N(ATfA,]T@ēח%"܆a@K8Bч `4\.\겏Z BԱD[?PX^6#%fy<}%i92?~o^GUU>\2;OYif[zku@]x{}§0rImqĕJeoT?2j%-@Ht bd&wmb8ק@#@L%5p+-8"&I5>GJ _|Ix@OkD2xBd8iO&x&Y" HԖK*@o$YC9AC4IENDB`clementine-1.2.0+dfsg/data/icons/22x22/spotify.png000066400000000000000000000024261223327513400215700ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/22x22/user-away.png000066400000000000000000000064501223327513400220110ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/22x22/view-media-playlist.png000066400000000000000000000012001223327513400237460ustar00rootroot00000000000000PNG  IHDRj sRGB pHYsu85tIME0l,JK#PLTE!P!P$S*X+Z-\0^2a6d6d7e7f9c=iLyNzXpv~ܖޗߚ⛼朼㜼䠺ܠ確ڢܣ֤ެర踸ỻ㼼atRNS,-2bKGD`ŷ|IDATc` 0b L,-13@F Pd/PxpB|BB,jJk)h*h(kʨՌDU,,UmM􍭕$RB"<\|""CCZdfog84 a # 3b>IENDB`clementine-1.2.0+dfsg/data/icons/22x22/view-media-visualization.png000066400000000000000000000026451223327513400250240ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/22x22/view-refresh.png000066400000000000000000000024031223327513400224740ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/22x22/weather-showers-scattered.png000066400000000000000000000021141223327513400251700ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/22x22/x-clementine-album.png000066400000000000000000000020521223327513400235540ustar00rootroot00000000000000PNG  IHDR(-SsRGB pHYsu85tIME++4PLTEƲջ឵}ᒏ񔐘ﴷㆈ諮ʿѓќù»Ž»ìɱ˺չĿ׾%tWtRNSFFGIJLMNjklmopqr bKGDV  IDATMKAYw]g(*J`н.c %.FJ:ή;nσRhMf5㛕/ﯯ,$*gOR^i4<`6IiD^qMo4PϋsfWclzߞ}M9-]wؙ({(>+2Y4lՠٍVҼ! W'qm,QHڬhH؅j2z+ؼ$ɞ1Zje{)ݸTl;@ ls}wgDIENDB`clementine-1.2.0+dfsg/data/icons/22x22/x-clementine-albums.png000066400000000000000000000022041223327513400237360ustar00rootroot00000000000000PNG  IHDRrP6sRGBbKGD pHYsu85tIME ^֐IDAT8}]hgo曙fg7lkm5QzQ֛ze BЋ^4? P PZmEQOl&ݙ"Ծpx9,uг^R!1y@n޺mMss"4y>$PG l1wpbl$ JUF߳{[@pJd΁U+7oC#FÀZ˒+e/ם:Ӆٔ\Xfз|ɬ>$!Jm ._+9}?wunT)ݒ_,[A±%%qkmKޑ#G  oԸ 1֮)0Ķg@mb-dJwÆ_xEش::31NH[}G@Z3˲gә@J(׻$9SdMj dbMkzVi0ԤiJ։:Xp뀐RJ,$AbgaqLRۣcgzEXME^oWWnFQm[$IJ>" BZ&SIym$Z.q7#ˣF0I8 31i3˶-D6&4Q*"U9FC8JPB%""ɐXdNSK~垨rtu-i@S(/$BJOp]ѥ=5-:;:0 X$IBT\*u sZM]naӖWSN>ԚB.lK)ZGHSyl;D!j:%?ǔw+s3OW~%K4YXB@u!Z3jX=vdbνɩ{ǎnkoFbKut#._'ߩM6WgΔ/_~S-8F됊8#W|~Ǟm=Oog듄8xdhۇk_᷒IENDB`clementine-1.2.0+dfsg/data/icons/22x22/x-clementine-artist.png000066400000000000000000000011741223327513400237660ustar00rootroot00000000000000PNG  IHDRasBIT|d pHYs:tEXtSoftwarewww.inkscape.org<IDATxڍMkAǟyٗ즻FR+mJ@Aւ~=ybBA{F jh ؤl*M< <y?R0(! d <}tf8d0ʗ5pgԹp H `/yĴ_A2ȹE@Ng[c,J0@U aL;hps;0 JI&Zc f~ (%JRnAl|\gCL O OcO$;[h_!>Vjw?Ҋԇ2J "l1p.̟nbL9.4}@]2M@0dlOU}öL@( F`G|}>#K-)p+ªY%RoaJ1W*`,0bR4w`ee fJK r}Z*JTYC k9hXIENDB`clementine-1.2.0+dfsg/data/icons/22x22/x-clementine-shuffle.png000066400000000000000000000012601223327513400241100ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/22x22/zoom-in.png000066400000000000000000000022471223327513400214640ustar00rootroot00000000000000PNG  IHDRĴl;bKGD pHYs cytIME ({O4IDATxڵ_L[U0n-mdtpfMfH&dfK|$A3 &S7l#۔ ʟB<{0!|_N_=s^GFFl-H ALW_0ǒٳSHʂ $:VZp ޜ._&]7yW,[j^R$&wU ⍳ \278 x7gM8Jyzą*"8hN2̪㨡Ϡ}|xÁ8#LrfDI'(T1DZ"$P^5yCYFq.p/ IH̐$"(Oms>fZ.S|';l \KCc=gT#-J91P((հ|AUG H.G\^4 `FX$Z YA}ǧFwV{G￝d^9f @匒*do^YIGi>R e2X1 ~"i{]v2J|AZ ues䉓#eY\XX( Q|>;5R^L5ۖ<]/g~ʧD"W <n::dYYӹ=.]kj(*Bt:---7 Xs@MQzx7㿞*@)1qؼrLpiXm2~r{rrrHD"mAן UN{r->,?h4 ;pjS)3qܦH69@``q0 _D"QBvFնz?%_a2  nIENDB`clementine-1.2.0+dfsg/data/icons/32x32/000077500000000000000000000000001223327513400173635ustar00rootroot00000000000000clementine-1.2.0+dfsg/data/icons/32x32/application-exit.png000066400000000000000000000033401223327513400233430ustar00rootroot00000000000000PNG  IHDR szz pHYs^tIME kbKGDmIDATxW[lTU]ޙR>JUbĆ"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.0+dfsg/data/icons/32x32/applications-internet.png000066400000000000000000000051731223327513400244130ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/32x32/configure.png000066400000000000000000000026521223327513400220570ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/32x32/document-open-folder.png000066400000000000000000000020651223327513400241220ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/32x32/document-open-remote.png000066400000000000000000000041541223327513400241430ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/32x32/document-open.png000066400000000000000000000021001223327513400226370ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/32x32/document-save.png000066400000000000000000000023571223327513400226520ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/32x32/download.png000066400000000000000000000046151223327513400217060ustar00rootroot00000000000000PNG  IHDR szzsRGBbKGD pHYs B(xtIME )! IDATxڽW pT}޽L6!!O0!`Hӂ/u:δ۱3vvhh-3 j"UV@$’B&n{UgBs瞳.--D snyl^m]uu/ڒV#ôFƦJgO~phh둃|/y\C MmʫZT͋pl`M03oڈf, iA=+Xxw_&>\ |wǢſZu=kִv.nB = %F^pAG-R dEbnKVo ?oXNEEOwm˟<˰Qp&QA&hy}cw/?=о!p=K~<̱9̂ cZ=a^k9I4q pe0& FI ׆H\'Wr ۆKWZ[vuղKΘXue;*7-.;0 k{RYciA9HY t|:'#+V|cYpȃa!Ä .l>DY1A<A@IЃXX^al~[KM!9\/Y%ES.CKk%&yXA0EFI#p!щ8L=F8G:uQH$[n2q 6w^2yF Hp؆, (-aZ>JidB iڐKS|0E V^ 5 7pV(^k @iL 1NH0M{"CyK Y@#S$dLnZBVT6LM@;UMOX,a)Ul2%npJz82F `5hTTFIOFͷz`MV^w#i|*,I)a\d*E8 =84TGt(`Kᖅ_h56c,}}}ٍћg],`X]e>IOd$#) |/S3!R Pqi! KnZۆ@Ne 7rYX'$]7\0ȩ$NeO0E=E*1C&OdSui#OQp3{!U9;–06l)}Q$Nc}, (*43QbSb&`=NKLYP+,,gsl(c- %d?"q\^n:[T;5 %J,ò gHEgH"$9<4z341g ['iˉLKm C  |-yOfX:ǏCILNz7,F!o@Wvesj A&U$ȌA/.rK4|dT6@ulXSh #PLiRH̼Mx57ܲʎEGy[\4:=%9ġ.`y!*`7hdƂ(yk+ҹA77?n&G";.3h˖8/ RY| ί_ZE g𥁩,[;eY 7K!:~ C|J1@5Ά!JOQIENDB`clementine-1.2.0+dfsg/data/icons/32x32/drive-removable-media-usb-pendrive.png000066400000000000000000000023051223327513400266320ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/32x32/edit-clear-list.png000066400000000000000000000040551223327513400230570ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/32x32/edit-clear-locationbar-ltr.png000066400000000000000000000035561223327513400252050ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/32x32/edit-find.png000066400000000000000000000032511223327513400217350ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/32x32/edit-rename.png000066400000000000000000000007601223327513400222660ustar00rootroot00000000000000PNG  IHDR DsBITO pHYsvv}ՂtEXtSoftwarewww.inkscape.org<PLTEbd`tvsz{x+S-(tRNS !$%&')+,-1369<>BDFI_dFQIDATx1@ oP;?xHpŗ"Jʍ#[Z)gt3dӯ,zȘ'R&X[n6f~ {ZT\*P{jeIS3[7_l!!WIENDB`clementine-1.2.0+dfsg/data/icons/32x32/edit-undo.png000066400000000000000000000037441223327513400217710ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/32x32/folder-new.png000066400000000000000000000025311223327513400221340ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/32x32/folder-sound.png000066400000000000000000000022371223327513400224760ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/32x32/folder.png000066400000000000000000000020221223327513400213400ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/32x32/go-down.png000066400000000000000000000026351223327513400214510ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/32x32/go-home.png000066400000000000000000000024641223327513400214320ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDATxWoLu~?JEC )[0MLř kݾ`\4s4Hಈ/Sa2BޝR:⓼y}}5w` ׉u=!PSW#@Ai5VqΌ,Xo䑐68X󳳂*+Çױ,?xO QTS:aTC` {i+@? .rao.TTU;hs3-dQDkK Ҋt:JBf +*ąc9ijǢ/{|N~u\Ncq%r@#(ۿ_t/-挷 }qq1!x)駟z=j¯7oF`_y(BϣUD^rrp?s4~v"'`.)=$g{{"D dgf.ɳc}"Y(!1!c=lw8qW EҒ^w ; vbXf(y$!#5=]۵ [ݎh82 AP{Z4<;6::|-i5wGy<+j}Kh2@`kYƝ9l%W[r/H;GM/!. 54SP}WǐeY:~T sI8"U:YBLtw8],`G `@"P9b.M&Ed%NSV)[\n dt:)8 k&dkG@,!yZ~ ,e` -]S Ѩ 2(U1/k 7!B`)V{_qYAWđf^Z1ԎZz. H>A<ϭMS .m|u@dBB|X U'Bnt pK,5FV;끼۷y^V Sc$P}j)RSeffas{ n7K5. 2~arbj& @#h8<1+L (t4 -T8J"iP?)\IENDB`clementine-1.2.0+dfsg/data/icons/32x32/go-jump.png000066400000000000000000000013361223327513400214520ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/32x32/go-next.png000066400000000000000000000027011223327513400214520ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/32x32/go-up.png000066400000000000000000000027551223327513400211310ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/32x32/help-about.png000066400000000000000000000027231223327513400221350ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/32x32/help-hint.png000066400000000000000000000031511223327513400217610ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/32x32/input-keyboard.png000066400000000000000000000020741223327513400230310ustar00rootroot00000000000000PNG  IHDR DsBITO pHYsvv}ՂtEXtSoftwarewww.inkscape.org<PLTEzz|xxzĒwx3tRNS  *+vn3 IDAT8c`000sq<\ 쑕IJJ*jZںRnAa q53BGdꍘ^0#xRn3Z+88;meܥ,e=$L4䜤| [98{z- uaB˜9ӳw-WpNQg:PAKHx`(KxTZg3k֌޾ 9B} |u vpAg 3IDAThřg|UUOMIB$ I@$$4i4)D&EA)@)RĀ4 "ĘZRIϩ9}?\\7u|O}PEQX3g<|t\ΝֲK8̹1Lnx*ϩtVHUl!Ri,T|<^.RI[b3.1Lb]ש[scXխ@gi*^ 9=*MrJq="׽ B|=_ R˩W6~SicgO41'fPsYiinAe \<(KtaC6Y,o/cf`G)ōXPUG߮^Q[zsGk\Z^jYsqz~1ͯ:N%U[9ky2CC6l[ `ЂԀ-?!< B b(@(=v(S2&f&g5Jrߔ\6\v`1m@]v@>R׽il2\e?AxBx S2., 1?!sy )8ޙzT5M\ [5&/.pt?nW3@Y.vtm-Z59n zfPԴŖ NW0(5{AS9.z6G9pwRւUsu1@ol[GpbQ ;?7YH􈤕T }!3Ab,qNXWUg|X= lPy&Z Mِ 1F4=Bft[oӕkpE xh3\~YY9lU+v8Q~_J(8zje'àpX&y,ZhO q̓]:YQp?]l~W̳.>H[ZT31,@!F~**AL; NyNZh\4D-|huMz ':?;OyLGO6xKi{ q)߂CBB[-~]+U<.w2DA9&A$uUb`oAxu:4'UD+xU|8 X#M G'X&[V|e LzVh(<4~ `K"!!~ze%r8~j4h~_QbAJbxW b8̎:n(-ܬ[Z: BFƒR W$u3u6J^X>TU]TAT Myz҄@UTePC#z8 l}p:OX+֊l 1JǖT/,* u8qw~U*\ @G02 ~cPZ n"IOh& o [Jk-o.$?3:(PEOK'kcȺrf:Ngо_\y&mx9MN[k߃ n怒Rk`ԄS:wUW4WAњ=8ay: C]ƀaOA2X=S4ޫ Q"68!Pe?GgXXuyJUBfڣ^ ^aocM7AH#g0 + =辍,;݄+a|Uv[IUTyM ^8z9RtlѱѺ3&?q]Xt_D=q5llBu!DAwIt\w"ˏAá;᩵pw`k.)yz q4$ XVs\nM[評_.?1_gg~2ur-t9}j6M*ӫ9Мo~SmWbUJ ޛN&wڐ 5"55fp%;G9-\RV8*y RRzkWj{y项mQ-6 ܾV[؇mvʸw=xtׄS 5 g^\q&O9& 9fԡWJѩEj]o` uӝ}B1~Iptc֎.*ӵkRM,>:-&+M: > QCJd_?;gG?\DOVTwE=)$ҋ)RERÌ}b7AdR+IRE5w@&f]j*_(y@[mu_y (G܎|σa}0YU`4 8*{7[C#Y'OofvkU]YKK>.48T/wý`ЮZmނkw^E e>?n~!?_WEi9Z<< Xm"m"Rp\u8l9=/-Mڂ-EI5,!@H9iA-`Ɏ!Ӥ0ArH*DK:sڇMl"o.X_k7v4VVR33+Ied iuؐ?1Y3R0D>3Mη6dJov{=^=jYHЛAKO9Վj_EèwW\HI8ɱ>H+NZ|Ol>e?::]Z(~Ӻƶ9gKɁ9btF:ReRsiHЎіiՠfgۺ߳N ե=ml_~]2HicWXTP\tOz.^Z%xsz7GšiG}9 ֺ7C*C?Qg۰h inMVUY}z|uպRRT`K9$/A^d%tEXtdate:create2010-08-09T22:11:05+02:00n%tEXtdate:modify2010-08-09T22:11:05+02:00RtEXtsvg:base-urifile:///home/john/code/clementine-player/data/icons/Ipodtouchicon.svgLIENDB`clementine-1.2.0+dfsg/data/icons/32x32/list-add.png000066400000000000000000000027171223327513400216010ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/32x32/mail-message.png000066400000000000000000000011351223327513400224350ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/32x32/media-eject.png000066400000000000000000000022551223327513400222440ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/32x32/media-playback-pause.png000066400000000000000000000021711223327513400240500ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/32x32/media-playback-stop.png000066400000000000000000000022151223327513400237170ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/32x32/media-playlist-repeat.png000066400000000000000000000022571223327513400242730ustar00rootroot00000000000000PNG  IHDR szzsRGBbKGD pHYs B(xtIME ,/IDATXWKh\UN&GڨH}-vUA"Z\tR& ȠvNZkW]ը  EK+M[tbk3sIƤd!{s 4#ԧ}7D]uK3͛ &rSn[_~%D`LfnB@kcc3Y h/J23PJt!c;wjDG@;Rb15.N9]3RTٲyk^uH%`V2M)_KYG$ps;Lͮ.alVMݮiCYkADdy| t+ KzD@@(@LX xae@Z fqc v7 YXcJ K <n vK % "`"]9\?  vȮ)=`aB/K d>cf2΄d 4|Z,26e=CCC=w,bQ'Giƶŏ?j{J`R $1v䇓'[x܉D"˜J)U^s}1jW'ށe-YTJ{0^"!!&Zqj||`3Hztu< vJɯ%>ggOxXtdrO:i{w`ÿnJ##û-Ge+ rQ1:GqYNIENDB`clementine-1.2.0+dfsg/data/icons/32x32/media-playlist-shuffle.png000066400000000000000000000034731223327513400244500ustar00rootroot00000000000000PNG  IHDR szzsRGBbKGD pHYs B(xtIME IIDATXW[lT]{gQetbxNE Jժ~MTU.ge8w$RA<R.t8JL&V"Jz) j U/&|oSZ^ޱڧZ]c&o5 elA4M  =NkW]]Q@:9e様J7l22>yl`h| B9|7䏼J?2 KRzŌqH큞O잛G@DEIFD˶L()(GQ|IM cز`Y`ώ/@}_OFH&@"./l`&13n$S D@"@`'`p0:;g U?zgNRJLML&Rӷov [BɩBΙD:a Po-z[`Y&\5.;v&n0<!A, ff!ꕫRޟčAfWȁ%B DN3 pwWm>yZ E$3׻N~EC6eIENDB`clementine-1.2.0+dfsg/data/icons/32x32/media-skip-backward.png000066400000000000000000000022731223327513400236740ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/32x32/multimedia-player-ipod-U2-color.png000066400000000000000000000030131223327513400260430ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/32x32/multimedia-player-ipod-mini-blue.png000066400000000000000000000030161223327513400263250ustar00rootroot00000000000000PNG  IHDR szzsRGBbKGD pHYs ntIME 8DfIDATXío\W;s3c؞& PATlP%`XEJDB -hՐD1];i۩3=_ǞMnht9WzWrrx"fXa C!@ h5JTJ*[+O?(8sㇺ$ڛ-רsѯxjhͯrؼO2n#%BIJ)],1R 5i4= N;tW୿8;bOW ܃VYm|7#[ݞ! ɃFPJw Ѐi  "{(ùǘem 3@NvXޞVDh50j]y.T)˱$jgnOlxr&ɔK|16mFpqYήln ~r)ۃхhU׿\hoA)^.a[Fd (] ?ѳc0u]y|:9Zӛ¶D;iq,¶mRqgyRNH-J_,n]T=P)(.saR%+BBZճ,`uۏatwpmq/ܸqjJi@PwwRyJ)RTgnJS,/MNNJpe\GxMkM7N txaS!͛DBXeRZ Q >ccc`fdd_n2:t-_rAVĻrb1]aYCCCm,..fR33s=8}J"ėşeb؎Ry=!jÇQ'sc&f'L#&4gJ)wvjqq]w'="ߙ̐LDCz/v@hb,uA^x %PmHȰn hj- \} 8kR;/n3(>̯QԹ|iN/nBipm%V9e`t}umϽf SA^N ʻPlޣP!RО#cjC-sD-9 ]Zwp "ZTbҢ)R'Egck *kN-2:{p /e Mg`$Pz}*-~BE`}|_Z@ˆ*pʼfMp]qzcØcjk$L"FnYc&wuRs\5OK]PhfRDqdڼHR )+}U!١xmNӧ"SKoA#|Rb##Tn| -e>͞r wvPJՋbH)< ,ϨW@cSSSgWWWI$XE0T] ("LH$0-_'E7b|.vh6ݥ7ukkkӇI=}r̽o> 54MxbcC([$y{ >LOg,A42 b!+rf333ܼyk׮IV"/Hf*Cgd$GZXr}۶akH$o1jn[l6Z\\8.=~>MZu<"DDJia&}RAmoߍWN`yytL'v,(TMP,`u] J㸛} _g'>@iMDPJh D8SӤeE,ˢjy,{{u_وl鴱ΝcsgD V\Q.;4*zǹ?`h'<v$JdIENDB`clementine-1.2.0+dfsg/data/icons/32x32/multimedia-player-ipod-mini-green.png000066400000000000000000000030361223327513400265000ustar00rootroot00000000000000PNG  IHDR szzsRGBbKGD pHYs ntIME 4WIDATXíKl[{/KҢ%2)YЯV6*`$ deѢAE7iWF]$被( h&J#H٭T 5-9iQ$%q_3)Z4 NtKrΜ'/~stzd"m˖BH)@"c01H)l޽rOo]x5?v,Ej4`igA?@{xo_UvWq   ' ΐ!# 0TkI72sS4T*w^ _?d|duWƗj+uW> g{'m=bw\f߸0XNO)CG9?w[w8ՙ0ZT2/P6ZV8r4c[̀<e~i؎ӗ`{E(Q5XB~v_FO#;+3mi>]],p;ZziCь cg;00}!Ҡ"4!p esў&nlHUhڸB{Vϡpo:Vq Y_ge2:2ϱQyZAwAE$ESeȞ lLW|O!ƨȥMgayO%3 T&J])EDJyxs,GiފHVH$,X,R.c q6_Ub0_΀Ҕ}6h1tA)moB@/b8H$.r2 Q>¢(PJaYQn=wo4Ou455"lm1FO+Z>d,aXLLLJ*u]l2yeqZ0P.Y^',w.od2IRj_:N—8k!"05rcLO|bjJߍ04iZy 0,\/15S,2@']B93VV,fii7nPɝɀ% ASRkQ"m[%hgΜy0 ?7o Ϟ=GԚNu0Cf(8ܾ}5RJlv,TO:=RJM bQ,//sq܉Ř/ (zXaIENDB`clementine-1.2.0+dfsg/data/icons/32x32/multimedia-player-ipod-mini-silver.png000066400000000000000000000027501223327513400267060ustar00rootroot00000000000000PNG  IHDR szzsRGBbKGD pHYs ntIME zhIDATXíMo; )QE˦(*a 4@؅ U -PE h .lR+[D; Jc,Zջ9s{yϹg/l6e:N&L@M!PvmURQJ9n7E>B,oϜ;wP\)J0 ydׯ#!7Ǐ?RHh8m11O!8F?{Wgiw|Z-bp"i'Xߨ)?+N͜'Q&#A&^ml;nߚ3st}eGw~|Ѿ ?D74 !HCHWxZ!a/S1P%$z#Izoh*n6bMv}9tAw(n5ӯdyBë@5..䁑`z50)L[egq2"t~oeaH> (2s`=eavh62Ѯ:) 0L@@ ]dFϞacsfq҃Hclak`nfT,+ Scc{&4{-3 8ix;0J QnAEhFض8=c(J|tj2uw@{aHuncT*&?rJ˗^dzv0 cQa`wcWmQ(޾}5J7Zḝβ,(}q9q/߆Rilbb⃥%߫Ouν2g,,ijJED҃|*.NѮask3UJ!(2 S!wuoiq͛}Et8=e< y,u]4M#чe߼={ l?EgߕŃU]72SSSܻwwR~Z&71LϏ Xjq鞕%Νd2) u]#Td  y}P(/\]94u2;;H14M=z 07&iz@ .]|T* +­oo]i&0J)W`芝0Rfd5IENDB`clementine-1.2.0+dfsg/data/icons/32x32/multimedia-player-ipod-nano-black.png000066400000000000000000000025151223327513400264540ustar00rootroot00000000000000PNG  IHDR szzsRGBbKGD pHYs ǠtIME 3#IDATXŗkU?3;;{ɦ! !.qRml} EJ M'/>YA,> mIARL! es${F^ri_8p!Hd OA7Ρ#G4m,K+L@`H4#(? $5D2 Ggqq@`#Fؖt{P^4jT*&&nlVF  Z U\بMG0$QcuuY\4XXu 0f7w۷ TBeBS,p !2NJ4 hA(q?{4_!K6.]FGIZiq3-uߚehj0Mu_ @`:BT*eYe o ޽{YXX ϓVp}vK[OOz}Kpd(-ۚD~\eii ۶8î]8x $m_, EQe!( |EQ}躞v[cccch ITU88ΖS&n?,q1 4}*x""dk$ hÇ 8C&ݽ'oݺE$! $$ILOODömL c&i[`4eee˲T*-NB`ax"ǎ%yJyϞ=ɦTUMڶM2dbbRyJ%fgg[:;w'OGh4xG__Gd뺿 ! @122x.@{{ZF*¶m\t]_eSCQB5 ˞ ,Kyt={x&"(H:n 1>>r<ip\.G|7 BB8Bxr.7\A]V졙v'W.X,hiw!W.Wlqq; >W$I#_itt4vXB@,h8mi6Sm)y D }777J~Xo޼z?MGEu= Og/5U(4IENDB`clementine-1.2.0+dfsg/data/icons/32x32/multimedia-player-ipod-nano-green.png000066400000000000000000000070141223327513400264770ustar00rootroot00000000000000PNG  IHDR #ꦷbKGDC pHYsHHFk> vpAg IDATh՘kTUk"Cm+4G;nKxiIv=d4Pf[3KP KQD@s5mc,ƩÜyo< UMA#g/eŶD=WĉF3@kC߫N_a~wd6} T3zsIڻGۻ[΅ߣw-~e._CTxtъRfzf- Hmmݞ5!x=Qrx| xKB0spdF4%GZ~k3.n[8-="njяH2XKEt*`Zi2JYl)6;:kغ dwS+ɠ7U, +]` [ih>f܅-MMpZۣع"Ά3c6C+²SP?xЎh%O"zo X< bߒfjΕpLH!Lf{cM4K\ӭ-P*7рty40B|#:@]<O+hg;9 79k@(aPaIqN"]Fiy0ٍZ2tXgX.Tʓeƶ;@K={ylȋG@CQRɏK';T9@K+ P}_j ?Aj>"Hi?Ac@reb?KL1 팷tieM@fu|p-;*t^z\EyДX|bLddP ")A &IA\bHNP YQ)z7@&'%BV@fh ?./$ZJePP>k< ԗ|dAJr"RM mTx^DCWiuǪbQ~V@{>R 4O?yz5Bb<_W:_.aP70ݤsCEp1/b2;r ~H>}Xt 53ob_>g<OAO}>7SAFt T~Npl ҧAq `yZP-:l_MuW4I`&m *`N Dn$X#bu3.CL@p~Oކ@/!zj`f)G+Ceo s^0#Ck!|Se<\f =zւfCw E%ov=OO+B] plH6\l ¶gCB!lwݠ|,Uૉ猨a灈"iQ0u >#h3-j @^_ݢP77x\yTVVJsP8ee]\uD_*: }\a& N;  ';c4CT^y/SO.}x@sesesM&{GdggU3iڱERx17eƩAm;\Rj%| 6vr,5[[nkޖAw#!܍{[n3{^f{mnnӏM?6mEcIcI `^ dw0S؆5cmT펛HLjo k3ŀo'Gle 8 dɨHTs֤5iڵ5(/]lы^BZ)P{w?Mлۓ@廔yg'|q;zU!&'j/T\LN Wz@=Wǁ/{zg¥~]˲e/n|Y,߃Mr$'(%՚jp%݃X A +ctr=@9:|.IPB;!d; I].χOe,|n@Gv.wzm{\ssZ_o7;2Mt`]i]iI~J" ~!qC6{Ep~Zs bĊQdٱLQmmUQ03כ>""AV`:i*xo F 9դi'JwyyyN|rgӸ=,---E[.22'ٶsp~tv;JΎ+DiQJ~4YfOӵ/0)޳,ٯn//W@r\\\p:Qȫר jz|AC{Zkң%Q\|#򍈻n&*V;\yOUԜBјpY\gМ# ]Vaaam7Ǜ}%[)T Z:J6*J]xvzvz333¡Up]o|StTl\j_NMM| Ö[>lyYp$ȉ%tEXtdate:create2010-08-09T21:40:20+02:00ʮ%tEXtdate:modify2010-08-09T21:40:20+02:00UtjtEXtsvg:base-urifile:///home/john/code/clementine-player/data/icons/svg/multimedia-player-ipod-nano-green.svgS5/IENDB`clementine-1.2.0+dfsg/data/icons/32x32/multimedia-player-ipod-nano-white.png000066400000000000000000000024201223327513400265130ustar00rootroot00000000000000PNG  IHDR szzsRGBbKGD pHYs ǠtIME 93V IDATXõoW3w^@"tYEZntɢnlM!!0BI;8؞ǝEN4̝3g4>e z^o47A9Ν;URi .LڶeY6F38sfϞfq/'HRh>cfVPtT:C*!/=ϓ3 cPGo\ {$ 0$W{T^nl{:B؜M{+:K24# 4HDޤVo0Ԇ$ȤgtZ_%:5<x{0͍5~B~S2 7n\ωR\6wdMԀRᵓ@?ߵ64jx0 i4t] ,ĉ1mdww]ױ, )%ZVBO/OZ%"0ntzZ6\ FL,ctt z:a):qz3m$ $BFFF2/^0==aZ-L3B/߿O0^0?}Z~eV6c=zիW>2V(ӧGÇx<뺮 #e$u]}vvwf Q\.B@RA)+7ӏO"1aDQ$@̌a+\7IJ5^ .^xT*b1,JKL涮gu]=FF1NCV|~~ڪ۫JۥRA7N5k ܹM&ׁ%b(_M4}EIENDB`clementine-1.2.0+dfsg/data/icons/32x32/multimedia-player-ipod-shuffle.png000066400000000000000000000021271223327513400261020ustar00rootroot00000000000000PNG  IHDR szzsRGBbKGD pHYs  >tIME 7N{ IDATXýWN#G=U~ئۏ3c !ʢGB?YdO ?M> 첈)l$QnwuUWe+Dc;wY{{`;88P(|i@=+5f1MhXNJ1߉Q.=c&}.;ΕR <^)n~0`Yt]88(5(B0 R8ug @)F)%"AEhߢӹad2ca1 q !\aL] mqfw;"Fjno ] R$`]בf!c QǶA)T t:p."p]C9{<>(oCu:|GلH4mq$I!@yXr>S)10-S2+ItRX>VJs?Rr?/_^^E+}ڶ}PX>::BrT;#DK k <!|߇PJirzsd/4| gHz=\.#won(AJ5bRWjG0Ϟ݌ߵZ"PVRn#J¶9}Yh&5 CK$4MJBȯkkk;e c)G'''bV5BwxE4 ,lnnZ4dqz}lmm=*2 wJùeYvHh4X]]*և|?cG_L,ǿmll|x;== !B@EQt1ygk|RYRJ}9_HB$Xl/sz>S~ `MӪN<K<'˺1IENDB`clementine-1.2.0+dfsg/data/icons/32x32/multimedia-player-ipod-standard-color.png000066400000000000000000000026011223327513400273570ustar00rootroot00000000000000PNG  IHDR szzsRGBbKGD pHYs ntIME 5:@&IDATXõOoWf33qP$D(R"袂"KPUBU]U'hmR7TZuh 6\ NcӅP$̛97/׮]{?o ȱEQ^zܹ~ƍ׵F)冀67oޜm/%\~T2eY^6X;˲\x FGzlfrrz{㗫QJ!ۻh"Bk%2L` VwHb?o}˥,Tu ]N~9>ܶj18X$'lRQ؎ӛI*Y_o"lo;I1۶)uf+bPd 09FOK!kQZ ZkGjzk"dsP9d /Vl6B `w15zCHi^*|%6En2jM;v=sv=u_N::[ցt:בR"Ķml&<;8/wZnex1( ue`mm9@ޱh P($auuuOI/ j!ja $!`ot:cxxr>Ry \.}TlRncnUܨt0Ơ+\.Y4B8i jQ(Z)_0|T*}|]T}RJ*qoMhK\.GVlR.mctNIJ)LLq,--!l?n9~8W^[ AXdii饴&I!"2 8S*Mi<nV*3nsgfYXX^s4+cVWW{:Kt: O3-ͥ|^ضm a֖e<==a)_BاӱglR."l!̷l+Ԕ.O,Q( "Tm:aZJńaxu1Gi˲}";SF)j;οI\&cff'N\d2{,ݥT*u:j[qqR^RQ6$I>xKJ(lPJ cZ[Xej7 !,/FJ._~{l aRZWS @IENDB`clementine-1.2.0+dfsg/data/icons/32x32/multimedia-player-ipod-standard-monochrome.png000066400000000000000000000025571223327513400304210ustar00rootroot00000000000000PNG  IHDR szzsRGBbKGD pHYs ntIME ;7!IDATXíVsE};餓D%F` 0)0ŕT30T0CG.⌇$Xc%~Zwa%FZo߾}ߞ۟;s:qn͉^]]#TBSݻiiR?W1k96-.MӒ"߱X#@iz>Fez i!!cMm>{O^\kx-aw&JXN0b}A)=)\,Mq]*Ep''Or٧NJn^P0aT* ʥ@tpr;T.5qɏeUӤfS, p.W8G\eY]aY8yN*X,^1s)eYRƽ H C(9؄䨿~T*׫*c1@S> \J y\bbGSX5W9a&c:J)0 R bq|Jl6r4:PnR0 !9G( h@i peܺu .\8!8<eelPj}$ ́RZV?rf=q~}.]:a( hZR(!)Lj3337,!]'Bʇ޼rʗ1{}}9C'!(dXossJ)00??O)} @A;C ,--]<=ϻfJkZ4$I$ɡN.2,jJұ)py٪ o☣r׆aU(g d8 `0^Ắ82b}* !t!BRj!DBVIT,d9!h4x׻o}io@8y [V\ו'} ſXWNIENDB`clementine-1.2.0+dfsg/data/icons/32x32/network-server.png000066400000000000000000000020401223327513400230620ustar00rootroot00000000000000PNG  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Ч5 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.0+dfsg/data/icons/32x32/phone-htc-g1-white.png000066400000000000000000000026171223327513400234070ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDATX]lU;n)G!ƴş@Q5d"!Ę&L4QbIb@ R m tJK;3^, i'93|;Z*-K)_^ZUR ėv[ᗱlE%[6-ZgĴB)UXM*Z,3nn4ۊ\}gb@[q1DQ?gV|c,Ox6k`mo JhiiAk]K$cH455FᜱWPJ9_|5?T \;tT Y.ݓyjS3-krد1RN###ֿo>[p=Lzx;n7pe(&&(-F[]O' w˫4Ȁ,1&jxC:^qnͶ8{w|B &dY{NҥlݾeKPW)xKp!Q-4onH.'jj&*KEt_ħ>b2w2P7+_$Q" dkApF Q.%x OX6situ0q23<>3{6&8x'a*E9dw@:|!T*[: \?*l_*7)|% =in~|G X?p Hc|PlY̛7xU Si6sQQj썩"j}x!v!B*Ş.cy<4!Ƒ'ffu)`y>#pҺLv\WB\Z˵V5X[zfZX((hkk# @A.PJ(p5TbF4ÀFQTV#w^1A`;;;1Zkki_1h::;PRy.R:NCCBjjjq(\O"1b *: C.^>Oki M4662s .'OdG;./P)sK$JIT.7@ ,ғJ b߾}a@ww>KX..\$gRETJԽk+>O&/0 mi>APBZk`~f2iウ 'n5⿡B4 \ŋ͏Wū+X(9rC;<'p HZ=v,8P`JIH@ [Z$*@PPE_Q!P >8IENDB`clementine-1.2.0+dfsg/data/icons/32x32/phone-nokia-n900.png000066400000000000000000000024531223327513400227710ustar00rootroot00000000000000PNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATXMOGمcw!AȲ@Bd"$[)Qgr?c +9Gd tw`|DCJ*MLOoUWWާ?Bn(>*?YkWx7Dklx\A)UģG(Z_Ce="Tϸ$ <~XDM>Ç6fqz*ZDZv(|7@_,--  "J%1lmm@R03sCs|ŁOZ>778&RA;Jems/ӧ޽@ei$M0F8ǿ{ b8R{vߜ8-(͇S^\% 55Ϲg3k9߃~bCy[Ṫ-z7 "0a~u(,ւ6 FG8:^T`fߋ:c:lbVW$jR*E,a\91nŰ&-==(\E)2^,җ/ߥV abkհJTU\O7Ϟ`nzK#$ °tlA- Iӄ{wn/ ?/Xqn#_l8:!?+f4™_[~*qA{RY,SYz Xkb \|z Y!"\v jMV"2q+Zܑ 83ĭ)mb4cGƐ&)@G^=cP"mTͶT$iFNjRɑSh-*Gwٙ}.|p2}Aryh DePL#@lXa`? mxOiO%Sc{!R Xl[P$ڇ%Z q{y(G#,6}$Xc:>BT~Φ SoT+2#m<̆vr+)"(tswP>0~m fMF֫:Į)fhxuVH2}}Ǜ0JK qr;Yu2pS\a(hurе]hhY"I^} i3?F)x'?DD,lFhqt=,n~a\?kQa`c-}}$ZI[+Xyeqf3=J,gzw$/WHSdrrqVA+b;^, Z| Z<ߋs_ƱǞx.c[?:9ڄJ`c7M(1)Vm^|JD6] ?N凇ύy:6 DQSGK($"΃^M(I8^`rmtllX[OvV{]D|ld x@ ƀz B`.PdW! OvXoTE09E8%bIENDB`clementine-1.2.0+dfsg/data/icons/32x32/phone.png000066400000000000000000000017141223327513400212050ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/32x32/search.png000066400000000000000000000044471223327513400213470ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/32x32/tools-wizard.png000066400000000000000000000035701223327513400225340ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/32x32/view-choose.png000066400000000000000000000013251223327513400223220ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/32x32/view-fullscreen.png000066400000000000000000000007301223327513400232030ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/32x32/view-media-equalizer.png000066400000000000000000000035121223327513400241200ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/32x32/view-media-lyrics.png000066400000000000000000000016531223327513400234300ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/32x32/view-media-playlist.png000066400000000000000000000016141223327513400237610ustar00rootroot00000000000000PNG  IHDR DsBITO pHYsvv}ՂtEXtSoftwarewww.inkscape.org<PLTEJLN!P#R#R%T&U*Y,Z.Z/]1_2a5c:g=iIuKyZ[oŇɇњٟᠽ⢿㣺֣㤼ڤ㥼٥ܥ榾۩꪿٪ܮ񱱱ⷷ⽽㾾7tRNS >?I.HLIDAT8c`=`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.0+dfsg/data/icons/32x32/view-media-visualization.png000066400000000000000000000047141223327513400250250ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/32x32/view-refresh.png000066400000000000000000000042061223327513400225010ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/32x32/wiimotedev.png000066400000000000000000000043631223327513400222530ustar00rootroot00000000000000PNG  IHDR szzsRGBbKGD pHYs B(xtIME 44&4sIDATXW]lΝY{흝c`6FL'$!"EPҪYD"@xKJmUHGHUSIJHQDqZ^zg>6 5 <{ι9w9Cp3!Y$Cyi;"I#ɠgnDZOo'\ $ X"s{2$0 @@"}1nf;8W,xP}!O,gF/ `Oĉ$EHZK }z17%+1A!a&=߀ D*l`2P%(Jl8L3?*5 ,{N{,o{kD8ifR 2^`DK3g 1*Ev wJ3n;!:3=iMsS=ѕ3X0XtUX, !3k/Z*w U|cƫ=H cb3lkԜ RZb^D \">)6,Ԓv-rT?Ho ݴ" Zń=V%%0L1k̈L/ 87-V7 lJ@6($ QH7IAbL;ο)[ ٖRC庑 "7pOe}rdϞ=uB<KAꯃ m~.VI7<-- KWpgf #c ȝv 4L&:"|*6mt hc_)ny.J#tZZ)w 2d@)=%dvifB HT*W_tzm&[lY(Hn|Gt}V|qd2ŚqRlvakL\( \E{{;yJ.^L&|>r<966 ؿ?r4Lӄػwo4e{& T*AUU2 lF"eY, [o3ԩS5Z*Ҷ6T*nhÇkxL&skŢ177JEQL&E&&& DP@"Xy;wev8( u]]]4 JG"I.;N6M\2"B4qTU@TZ2J%T*h403,90M1 T*nSӴkcttFr VZj`&|ǹs"۶0  ܄eYhxx {u]_uIy!lF6E{{i\TȶmH)hApܶ}Nqyiٳj5uyaMj`䵟+30==FAB8mp+W* VX/Bubdm&FGGaY (.xwͿ^U*3J)с\.K.a"SSS(˨Bɣ(ft}߹e˖˟=0WΜ9SXn"Q*BA>ϟ&ZEQ߷Zjz'^7la?իt(!ᙝ8\]BRJn6g(:8жm&NDZ 4 㘞b\ ,z~``1j>u^pjqa!5l^} ^#۷7N?zuW# àl -)P/ 1hoo8NytyDAW |~(_#zÍFc׶m5,b#lvIENDB`clementine-1.2.0+dfsg/data/icons/32x32/x-clementine-artist.png000066400000000000000000000025141223327513400237670ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/32x32/x-clementine-shuffle.png000066400000000000000000000032761223327513400241230ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/32x32/zoom-in.png000066400000000000000000000035171223327513400214670ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/48x48/000077500000000000000000000000001223327513400174015ustar00rootroot00000000000000clementine-1.2.0+dfsg/data/icons/48x48/application-exit.png000066400000000000000000000057111223327513400233650ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/48x48/applications-internet.png000066400000000000000000000120461223327513400244260ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/48x48/document-new.png000066400000000000000000000046351223327513400225240ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/48x48/document-open-remote.png000066400000000000000000000072001223327513400241540ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/48x48/document-open.png000066400000000000000000000031201223327513400226600ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/48x48/download.png000066400000000000000000000106021223327513400217150ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/48x48/edit-find.png000066400000000000000000000061001223327513400217470ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/48x48/edit-redo.png000066400000000000000000000064671223327513400220000ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/48x48/edit-rename.png000066400000000000000000000013541223327513400223040ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/48x48/edit-undo.png000066400000000000000000000065601223327513400220060ustar00rootroot00000000000000PNG  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: b 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.0+dfsg/data/icons/48x48/folder-sound.png000066400000000000000000000034711223327513400225150ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/48x48/folder.png000066400000000000000000000020221223327513400213560ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/48x48/go-down.png000066400000000000000000000045441223327513400214700ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/48x48/go-home.png000066400000000000000000000046321223327513400214470ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/48x48/go-jump.png000066400000000000000000000021461223327513400214700ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/48x48/go-next.png000066400000000000000000000045711223327513400214770ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/48x48/go-previous.png000066400000000000000000000047321223327513400223740ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/48x48/go-up.png000066400000000000000000000045721223327513400211460ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/48x48/help-about.png000066400000000000000000000043251223327513400221530ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/48x48/help-hint.png000066400000000000000000000055551223327513400220110ustar00rootroot00000000000000PNG  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'<}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\ vpAg00WIDATxgxGꞠ4Y"Ȁ& &X ` adq DIY!$P֌M:?~9ǻLTVT=$)O:Rݞ71onX+#x@&7V;f\)_e ThĈ&41C}Ѷɶ;VC{*"D⁲X]."" UȣW=,7iFEז"ȧ2Ru(u٫=#gE8XnjF`x9|nx##~@!}=-Oru}ɶkZlDarAd%i׏G"C^a| i>„ J"r@$SCжi?jqw(rEm“G=5'_;ZGeg _(qLNHB/?1V':{Ã6B &"JTk%kEkpb$LD6M :hmpBt{IyZ.uyrYn/ ,NN9!E 79<BϿ~~4$xqPUXZQ MWina8|zj`o|9@Pe]/2LLDxLeH~}6KA*|QcHG|,O jfrV2\1_q^k_fK@;+KOqV$sR U>[po{WqQ,!OTW&U#=CݾŠ03JQFF"xNԫBDm ρ[i,)~`8FCA/Ak K<{@r*nE ˱2rijSH1O˧@K8QqX[C `؆H+#=BRl]YH7yGlهi(V2Em1iGCb^mQYk]ngnjŎg];}n!ey($.Tb [\sM;r% nV'G@)XbWVE~tNآ)b8P^i488'&7%,[3 :( R!;ʧܭ܁@9UE'խrYG+n6h''8˺2w:b2tps!7N :\.Yrv:̗{E]Cm.8=%:8Ͷd~Fzv| eai[rDH*&5}m?k>dU*~!w9mv=02"|޷<:Bѳ-+p@oYߘ+f^,g3'rlO1ȵ.3A~.ױ D Ш2WZ2F:.Bj5$pkrPKN@,NXIs!dgVIɿxDֽ]c޸׀z߾C? B֐i55rW,p֝rб[̊v #:A޻@vj:K־cmIK݇k|?k"ˡZ+z:f(0!Ѷy6]ig`azIg2G=kj '9~Hu1^\.+CqvaCII;@;>.ȓn{4蛕_ vr~Q D6* >Np˵b> o;43l [dO?c=EfaЋnvH41,]^d;TxzKWztPg*?q@8 ryT += 2/N Le0xPu )5;|toAv}ǂy k&`"x'Ђ (A&M&f ъ0%2UAeCe2V)UnEV)=ˀXQSW?R^i}V#L[rH#8땫^X,?+QS9gjsH۔Wb'Iշ%v42oOʾ}"z{ :GLs,) `:3 2d&(=zz)m*_ȳ΀*vPN5xŹ`:aBQ#Z(Ϡgt.|1jp w5bA3|0-H%=qO$̔ɲ-#m>PX&^ UJp*6P):怸=`Q#2@CJ!A QWATV (J()ϕ(=35mM 2hO{@~1PBT҇\vds2A{Kv@r9F-<@6Nk?vFZ)Jq{Sjq\>xP/En5e"\`;Xi3isToܝSXX~$Gx@ }=&we()y9UZܻƀIqrR~G8]ytR8O &;)f<N {OEHyÊ&9r%mfg'G1`60?0(|9 HT2,)4mϯ.{=R'dD{YbX@<j]]=z\|%0 ƾ.,!w6OxWxkf̮ 'ݟtuѣ+rE.]uא|3fM&[xiٯq 8NV 3`KPj)-,͆I!':Gscso,2e_IōT1}A"b(}" 2bP$>L82 ~ׄs6[A~.' J_SFxZVԪ/?b(a"I'Zǹ'7+C8/33YOSCjxv߄A>}`3>P>>׵6-cvf=.ԼPtad/2@U[{[dpwo4V;Y; Z3V8l5@S87QZh- Z\#Wjw \ lcc1)"gj0|jyHVWC`?}OA;<8OaX45Ԑj^Uteª2xVݱu.3BGKo{l9>JVB19Sg?臀 ")O[tׇ:\P:>lw h >lm (\@ZӠT^~f`2Xe+ j2L7%Wꢆ=ZSݽO6ddF8.ٌFwgmXzuw(h_.Fz 8W-poՀ! ^: |Ǣ(Fpi(Hnq3:̯*_@cn@1 4"w>S<ji TWa2!x25On, Z;r{T,Q]%fGh^""7,$1Q8gMMqTJ: 3l݆4]?w{p]/._ ,o*z^=b7m լ^Q- QҰv~N--#yUX2rƣW@I:]XP/-991 Z--:q{rЎrІr)!"0637@KW?s!du0mJG ]'ohqZ"I.&x񌦼hZtzxr+bPXϽ͙,_Iq3 _2}{tطE~\EN帔 tp wz;Aoѧ5ɩPΊˡE@->;fH= >oeϱ^w4yR;P֥ò@6U5_Eȴ_O;bԎ c> Lطxu0{\'R0}e[L~i3j鷽:@X"o1z y_YD$2E|ʏ_&W 0&L|T+ͯ鍚޲5-oh cWSu{td`}u(ٮس@LV5z:9*?``Zg _.'${?{U3jգx##;Bs-yi-~) fe|$zOWdT@W^w:7`ZW or4lEi_U՗MMeʖG2Oc^ecHx-N8~d#>+mِ+Xdf<PqpVpv*m1ԓ` N.)x6~ JoP mm!z\|܇fOqbru@P8km! L1+ N56,nM(;/Li"h!7M@h*)^'5[ J* {.pc`[/M3 ֯14 \V"=-2f˜'a?k3OGW`!8|dCu(3. iu -/k;6|39@b{2{kx~hyk-Pt d&@~! ű>¾$Wy&gD۝kw5.$BːGL,P{罣A-QG sc7dxIFK1=zo<~͋*l쩏=X|Y|LSY;*{3E0f@%0|Q:rVp]%PPQ4p98@EK@Ӟw ^+huQP>>%n/?0hT|@x"OM o*2}vE#>0)>_>Zv ?y~ת:=8fd̐*=}_5Pz*Jw7 %J4y@g~Sއ.!£@69rߜ;ֹ ,sKNX]/deV׺4ncګ=~E]d!G>;˧-[ȵ)h<}«&:SOdZSQtE}|ۼ<} ~z~m\kk˦re˗\vMƱNӗ%Gި(OztQ`9md-=6e53bkSG $MՐUjgGsq';ڧ+XXW 4󎢪,qp0 }m+lG׹;.a.6)n#3s];0uSymG^qį0Wpə9QiS?ge6Q^u _\`;j;YlZlR̫MSey]㊽cVBC)kS])u: ~⁅k?:pYL9]~386z~!֊c* PظhAlnm ^ ^)W/K-J)H>ߑe=^6m>wp+aȡ{R!Qm/͊7.;'i^cǟxoǻOn* Sq|;ikz_R颅ű)%ŮU;e^;=OJw')NVnpcFMKJ:!`S vGTpf̑뻆v~70!iҠ1=!h[p]ut7Ҩ!eiHR X߽ UQTӛ뷪 [LktyV p:$4X 4:pZ@aOZS}K}!MOv,?¤~6ks2,^h[lJQS~$6]<ծ`aQ+€mn]elLףARܱe K+hN *+s aK~Wr8t˩vyC-u\fEx w(ǶU:%tEXtdate:create2010-08-09T22:11:05+02:00n%tEXtdate:modify2010-08-09T22:11:05+02:00RtEXtsvg:base-urifile:///home/john/code/clementine-player/data/icons/Ipodtouchicon.svgLIENDB`clementine-1.2.0+dfsg/data/icons/48x48/list-add.png000066400000000000000000000051421223327513400216120ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/48x48/list-remove.png000066400000000000000000000030701223327513400223550ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/48x48/mail-message.png000066400000000000000000000016731223327513400224620ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/48x48/media-eject.png000066400000000000000000000036331223327513400222630ustar00rootroot00000000000000PNG  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#@ztBB@6 vAe9,:cSt@qQEQDǧ,* . "P@HȞ^kUwnu'˛yof^ܛշ __--"!)D((! =K_m%ȊIq\{NL%d0/¾]sV(O6TрFCθ&'#9^_͊hvm[i~es(doG+5i"`WuoUVw#x:B3ҧX-VxN"b8MdFD*PpEEEO_ RMU-U'gIG^>:$=jz_`r`E1u%UmLKiODؠ?#}ƚ0@@Q|xqgmx~;KP!eDtp O!B- ƵZ&&& ("aD0(ѡx4\nx,ٳ< HjEz?.!&FfSt4 ]MwT D˗xy)Þ4NY=wq1@Q1AFvLv,ͧx{&BFr*Ih5 tv0hCÚɯԪ۽sils70í'pb68*B ۖjS;!;# Jk`b mB$Zh-Ԯ3U]l|>( 4QM\yGFNFkh$B ^|M6~|V  I̊"9Z'Z z0BؒD)v b4*7@ UJɓr}u~i³g4A~8u ^ B\ s`GǠ{½Mh?b] |V^#M bA+42Lh]#< ΂ @M46|A=zݷ^eLj@8e|Q騏 yd;@5m]!D|Vp8{FQe7 s]Q5?so6;|8W@v#aNPF–@04>]x ^Juo^>qGlKvՁ>yq狋/Ane %bMRFfBCDxBj ZN8.#?]Mv|[nm+5X,Ǚc 40X:zۙ9]1b;vXʀ=)ѕFW^=) M^o|0UTfZkDF =#Ӽ`i7iJ‘ tUZdo~ܬ2"c:Ǖ*k ܷ3;[0Qo,/0+a(Fݏ?qP(:џp1)1|fNW| ?ZUiƣ{7i'`32#&ӧz!@=Rn2 zAǍhn ;O4n|3_:h[[v]LJHÁXg|!b ,/E/T$Pj#{h $?` AB4]G'9+002eɘw 諍4MmbI'Uvg%(BV,KN?>3=>`ԱoprXL}嗻 \v*/YNh+&Myn\t+bbb -SNnj5#s{xlfx=: DS{lXvn'xgv`D |~u>$ַg1z.^<^1X[TTMDp5"1xjjȨQûY/^8OOՙF5Iia"$@Yu $پqNHH;lK].QX\j}>;\|QYѴ0^[ c(@0))\3[x5hƧ?ie` z:3Y T o?;;^&i5ob';/ZdSgaw^8=DA@꠸pA @a4 @8J#0jɰ?,_^jPHj23E^גv棖V~H˧̅rZLJ +ivꄘo|۶Uw|;OJ OG I#<|v%%)B$?F$je$sO?JEyYbNEo~>fZ( V3?#G=3rΗRʹh}Ѿ\л9 &#fjc(!£I]D? ֠R'PPG% Bv#4c;PQQ\b6Mf 8m(o*ܕ>3.8Wuf~= &κBl:S)r] Gʈ5qccYQB!F(ĩڵw%>y,N!SWt[Z6vM/C 6]/}| TI_>#-h`؉;qx 30j# ~45'F'*0@AȦ(^?pT.$6㎑;w|(pMV_ . {I6;1u?Tp*@ķa'p]Dzp( YCL‡IPddw8pEc&1zCQIF)5;5Ǝ&.*oU@b 4ɒI75t}PUA)$hZHQ[+B@ `A /%E;gL _;N6Z# Tɪ_K*P%BDŽ;.`PɕA!Ý)@'cfCrx-T2*aO` I-:Ы*^ߍ_^ӂ ?7k9S|@OOE̥|ꭒI4t !e ]Ћ(+"%AaGF Ì:?^@&~䮟nzE ?c2w<ҵʮ dXP:"2'_yKI.]wiL!AlȎ-a7be|HT"s,c:79'[Tq'&ʬ͆ޓ֏RA#(ĩ-)8Q+PXH}eKz> ?1&1PfQga3ruUA3G:pCS.7].FFRQ9Q# 6)-hFr*LTw*$Hh28 Lt戙`Dڥ"z(BG(0(aPn۱5gh?a놛\4cVab.XtVds$Z*8p]Ae)L%֘۠UJ[j ӦvD/0£ҿdO8GmOE 7;7Xc4 jFjKnZZO h2hē,dMVߺݐ6%HIF޻w׭tR{ୄW2A,k.Y-NEEh7H/WłJZr 2(-oZ5NNIRHZ k[5E"@[nr񥽘(pJ܎u> ۽dxS@553bC^(?jaLKlҵ{]u,Q0XQ' ec-ȏ?~tVXq" ^-IBic`! TPxskiʱa tx{abcQ8,j8y^vث A(XU4FCX94%iY4)DELf`(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.0+dfsg/data/icons/48x48/media-playback-start.png000066400000000000000000000036141223327513400241110ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/48x48/media-playback-stop.png000066400000000000000000000035431223327513400237420ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/48x48/media-playlist-repeat.png000066400000000000000000000033641223327513400243110ustar00rootroot00000000000000PNG  IHDR00WsRGBbKGD pHYs B(xtIME "VXtIDAThX]l\Gܹ5qN8$MH RE Q #/ȵ hEN)HHTR"R@*JR )dQݽ9<Ů~uܙ;:ߜ;3s5a kXF>& 儝YIP]H$R$Dzn1|/|!oA@ +C×^ @Dhzf|c|̇T{{;RDDzݸY;/L]P.^8^?J)ض& KW&216n^8Ab7{Je!~ҳoO_}SvU6R aX"}L-|f##G{K|{c/XBa߾Vd2"жGÁmd!"h ۸@я#xfF)u?Z$>?>|FTyD!"Z)~L 6AJa1oxh#[hJ]X3#0EDߘ\uXD+*$?],]dT! |; A(T|Pdgldjd˩y| ?{6X`XvdB]р ^ăd`L- zRL@[(`ʛ\F+)d@/a%Rucfc6b4y]k}ӧqq($cTlRf}@dtxZD"o@H:yJimAljOP_fJb-˿캊F`aZZZpģX,~AUA 1H>#hn - ֳY`[zp02y}n\Cd/]pMQ5fOdSY} j σ,@uى]]3B @RjGֳ_\ X,d9\[1}e%@,`#c~y}5L\"2_#3e8 KTucDPtK{ ﺈR X^Z|zv#ѧ!\"aNU `dҐ@fs?/fu;o6m-Zu]I:=4wdjkQDhjf+DH@jYV86*׵ xi$>jNL/\{{=== mejm"-gFƾY̭ 77;ArVw* KU3 3P)p筿#ˁ@?dW+|m``}ð::Ծ?w2o224ֹ[Vp;n]zSBxGF[|*-q`A<ְ?1zIUIENDB`clementine-1.2.0+dfsg/data/icons/48x48/media-playlist-shuffle.png000066400000000000000000000050661223327513400244660ustar00rootroot00000000000000PNG  IHDR00WsRGBbKGD pHYs B(xtIME0O IDAThYk~so.;3{",u"x6UTc74Ƅb;pwYi4MGcT\z ,;ՕEvwfvw.2\ o2f<3bW] ۸qMΉo DK}[4nXrkVXa2 Ca:cԴ;YЃPQQliݓ#P4 QQwMMMBF>#bKGf޽h ]<~DMR8WTDOScxeMC_c!^[Qo3/w],ǂkb5 -r¶*+mu+xV>^|@Fʠ;ͭ-t2Db^YUUmXI$*(gUդɓe8F @ "Bahسg[6xGVx k~J;J"4NoYJo3>P8ڱҞYkVN0M8;f%H[id2L4wq'^}󽆟v_rXV}ǞҀ_Z+P@@={aAO֬^d4 BHs~3PC*i(R&vӢE1sL$SlFMD iHaYz`0G PJaێmO:O?:%%%޼ ò8>?ގr̚1 TJ)rrBR"Ts0o5ОBN(.޳[ٶ"G6yI [j0'|sxkx+LӇysA__ f'I:]o{}}}߈U-)>$;9$c߾}$vz~~e}EBMM._`L{_[QXX [m|e}}ea=װw7̚YwPTJk͵5UuϟlJTWI3?x[ `%%H@k 0);ޡX?x,86oĩV-ߜ+ B5ug?>ٍIWOP>Ӈ?8IC:?j gZbqZok}vƌ qAB@)X,f~fժh(ܽ⻫1!M|<@0u5I?FˮȄ  )Yypj`0m 5HZr3ò`0zzz .P_J ,eA+ G hN~~< @, bTKR&cZ̹l4ҫ&L`Aաa7`fvK132tJ 9)c+BiH s5C)D@Ї bѰm;Ug碰h,Bjmʹ,k+^:E;w`BBZc^ƶhDRN)+PQ v>q ћ9VTDOfR Z5A}مG(q: 55kv}Bzs1R z=q-LUCJU FvZ3L}}}H%RyWpYY=+WF|OSsÓuDA^^rs# 4a3C)"z{8~\)%hyUUݖ@X޹WJ RIXWUpThT2|8H ,8-VF~A>Bh8ΉxK|ss]GSeѨs˯ }ҸZ }~ɍdXtvPj"pp8tCa8$zHGP\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.0+dfsg/data/icons/48x48/media-skip-forward.png000066400000000000000000000037041223327513400236000ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/48x48/multimedia-player-ipod-U2-color.png000066400000000000000000000046361223327513400260750ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/48x48/multimedia-player-ipod-U2-monochrome.png000066400000000000000000000045631223327513400271240ustar00rootroot00000000000000PNG  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{猹qg<3'1lb )4m A(͢˨VݤݴUAJZ]D@k؃mܹ<6cc{s^ !}oMMS8EQDEUG=q>|X|m=7wq/tz!B$ D@uY+%\3;; S;hIF(+%J@2["RU4+xpj\I-!w!G蘾T8_.Lrpg'?8 2 ؽ+ף_7uFғ-b<'bQ^hv\Cmk PS,V(W$@(l(d*Il9T-sc(&HU!$%r*ٹšr7{$kkꉿhvף >ue9 ߞBtN|m03WsT@@JP]WkmItxE߽?a3d d)dضC`..*>,[bL6,n PgG# T,Byu0_VQHiiVݬBP6-GOC6ZɗOjlEd4 tۙ/4=bƩ7{4R6-VbTo lW]OŮzn aTB^wѺɏ5SlrM7WUO[WJ=u\w#r d:WbSֿBg!sW@.r{hRë30<Θ-R43kiV!GWyiI4AL fTO)WTIw tq"4 BH),]()<=`maX*;: ; ].t;..J%*ïyS!xhdnPZCfoJVR籬ix[Kkzewtwm@0u]VLJڃ:m)T(D"x>N.V.)(`*x&P*hk[*1??O>N*S/p8eb9P, Csss/q" w[2E,%ܹm[aD"0*Y{:t(pʕ{(!u#'w9UjUQTooy[#VkJ2$ H$Rr⺏GI{N/ӐZ{ T?qvveM H;0=3K" P.kmRD>'ɸRɶmÛ~ST3m;LO~=15(D R-jO$h0ؽ{7ÄBBi,۶?:~P0FԆ^3ZCLٳgH$I[[۶Qd^Jαc.nSZ鵡ֆxtܹso&p8??q8ZC]r%cvgIENDB`clementine-1.2.0+dfsg/data/icons/48x48/multimedia-player-ipod-mini-gold.png000066400000000000000000000050031223327513400263370ustar00rootroot00000000000000PNG  IHDR00WsRGBbKGD pHYs(JtIMEٺe IDATh޽[lW?c;8'Yfmfd]ˮƘ&MBhH !.`HAB lv[k&MKܚqsxpM.N#%|{~`6}A\SJ/cƴͬ76/ygii B(<R dU%AIPl.g޼135~zjm0bFJDIʕ&/@[v0[Uyp -|]:|4Ϸ_CIZ(w8@k#msЁD`Teb^[2UfR Oj45ܸE>PЏah,m9p} ^m{/d.d->*Tty_u=NR BJwAhֻSTR/t#_~&!^>h4J6BfbjB2HUzXRJt]uݒPw_)F8?x󃃅H)<4 (%. 3s}=xwB ! Nbeghňb\Wa}|h4 }L]ޒZǻMgWW>u#˅HHGps3(F[XJ.B"M[p73Vx ~4Ϳ8p`ߙ3g4MR,--A` ̆{+=!N©i&|@<)H<811A:&,1 rJ]շh8ҚM.q[fڶ$~14Mq\<*4o _b75٧BN4c˲&]םfix2ӳ-T^8vXiA_"H}7! /7F#Ԇc*&;M*o_0~{1`YZbuYk6c>,fffΊp*l6K:|u] =O۶C;7r~]@U VJ2G%VS0 {nD"Ҷ,e;Ϋȑ#緡sV+Ec&d"0=r<bW.issseR'ocS 2[d<{ןjoo{)HYy?x'SgJ[gy+[m(1IENDB`clementine-1.2.0+dfsg/data/icons/48x48/multimedia-player-ipod-mini-green.png000066400000000000000000000050061223327513400265150ustar00rootroot00000000000000PNG  IHDR00WsRGBbKGD pHYs(JtIME >5b IDAThř[lWg.;{]{8n'NӐV4u* ($$$ (B!V\$D@'P< HZ:-iԱ8'v$ywfΜî7NK̑VҞ9}2e}Ym ڕaV!|4Dž༔w:Xr0o܃[!ݖ&qZkh4 !4Z+4 X,ٓ7&7_ف>RM+OY_D+zJB ! u h-B (1lJk8 Oqy쑓( hk}Hh| vvN>Ak 3JoXX2 "QfKŒ$k"_2AT]P jz]*<όۘZ7ܜ*כC@χ:s6iI5q g};@Kr5&9TM !m6!hNDo1$5eOأ@^tHԞo=?n]46FƗjQ㎎MJƖdq&dBiYxX x]YnX ]GI&8]Rw?̩F8,^2Zs`&&kbNNK焞OwaZopcaq3m:pӛ zKޣgؘI@ J2[w3*Z UlX/%u=3*딉7 +lUJJdUJ_[Ҽn ͒~mĈ u7qfs̺*{m^Zi2`0ߤy+ccHפlYhY6)Lr  6 ,t1gp H)i)˘hm֓48qyRj븕s+lof{aW"L.@3?aOɗ?TH`ґzvD1h]yN*3/ m_) Hj=UBj\(;$ .,"„{QڭWЕj!{4-ˑH$+cSqEګnn M:QJw0恭H4M őR@)N+W{hmLY> RJ ,<2:GXfKkz{{ !F+?y: ZCٿLjcT*U7bfXU R&vQKWH8vv۶ٹSJb11DpQH)%B9 UG1m>wޝNb||۶V%QKJ2ǙA)aH)1M/ &Y;2̷;::%͒JjFU&IJNײGydt:a~-uٙٷ.-^tO12܄.gÆ n`7RLLL jRh4h-0_icS$Oλtk+W"OWv"(SSSr9R]]]\g7|czm@wTbϞ= K/>}Vy.NJ2vM NKITbff۷qB7@2]O7 u1)8pLޱzoܸuf&Kww7=zV7ضKӚn!R , &udhMAP;bɓ'ٱcmE<Ӟ {zz^_4 qe`tt|>O swMٹ8RJ `rr^]~ @pLi"U?KYAJjO:ZɲiIENDB`clementine-1.2.0+dfsg/data/icons/48x48/multimedia-player-ipod-mini-pink.png000066400000000000000000000046371223327513400263670ustar00rootroot00000000000000PNG  IHDR00WsRGBbKGD pHYs(JtIME d IDAThř]lTs?vec8)F( jT4UU|7ޠs6‘B4i^Q{V }-ӧL~ cv0HX$y]R Z`Vo+m˂ @+P Y.s,'lC~"PwKt"у_u}߸[ܿ`$mm6ne*tvF9mco,:udM ģuD"A, Tv)%h`K4JR. .ϲM<1PgZ<{4H_o^iĀlۤ3}+/;s m^!m6y ^T\/-C[^1e'+ Eg9X Oj<%R(`QӲp=M?p4Bֆx,M/t\ɵyN|pP9q +*BU1XIYldb}r?epֻc~ouev\з끋]}/,oH3@<<ػg i= %6?Ӈ68ýb-T{%1GvUn+ht#ia%OT =m#qD{;"EJl͂ -Bji2M,!0Vخ(lU@3uK,nDsh=8h|mt#ĿrDrbNDX{Q '˲H%0_|}޽Uj~CC?J3Vm60{޾f?( 8YVB;wn ^3 VOal)W׏͛.!J?&"^.PZ6 q%aRq-E<"ZMP4M|4k@b-%FFFZk(!"diiˣW<:@ XH)}˲pkmSFƘ Fџ!>JȑUuH*"J5%al6eYhQ_.i1ىF8u۶׷SJb1bzхB{ !R6S)bA:[Ip Ӷ?377mhqK%t,0Wh<'ɠ0 I"XvE;Ίr433C6%J5v2_sFpNL`ªI;::9)yŸx*]]]|WFվ}17W&_c\E 2#bJON B-ˢX,y^cZk:&_H$C͛7lޜ뙚|)60J)a<\|>O>oXc"<WM>~:33TIAW&*;!a:yg,p`\fϞ=\vmEz)/^DwwWQ$BڄK* ;vq\l;@0$$)<;wܴaWǙR pjxxB3ݛ&''ȑ#;00mOTX,⺮pX>k0M3iSqfpp^ffftJUF<LPD(473gz_~0R{g5m`4,RUM)RdSt|'ϗJȫǮ4^E7fi%fq.v"2??OOO wB@6UrYJ)'@_}uuݿ߿?*i:cZ BTMs Щ7L=`ttxB*Z?P(!!H"_ ?iڨ"iq'νХQJ}MV!Wc{?xu;7+|C#L²,HHBIYV?%DXVVV_6{E;'j*HT&jRl^mRX{τMtmR|,%UO !xK_ > 6 *۶av۶1>>>S93g08:<rS2rwybq;0@@0sSA61Mat]oTX#<|)[p өTjLfQTUE0`CCCXZZ;11W4pQ.Q*ypBT*E1p]4 9$$w)j 8zzz_(b@Ғ[mzD}Fra繯]xdTd@"mx왪HE:;; |( ˲FL&e˗aYUd:8gdyz'[o*Jp١/RJB\}lW)!P( P3{p^=zJhBXZSH$r * r9SOu[a|_'}~VȪ;e*)E EU6CQ"$h해y4ŘeY=155p8 J{ѣ>]`vn: @IJ###c^M$Ϗއ0cbmm E)勩T_ˬMk.!p7EI~ag6]-QxuaYIENDB`clementine-1.2.0+dfsg/data/icons/48x48/multimedia-player-ipod-nano-black.png000066400000000000000000000041561223327513400264750ustar00rootroot00000000000000PNG  IHDR00WsRGBbKGD pHYsodtIME@IIDAThՙ]L\,`v46ؔi1?Avk9u,9}me?$R4ZJJEn+YM6,j6ܽ{޽N% l4s7s̙3E~Bс*[iϼ\UU}@ U !^[o&===F"xYyonn>JWdY.XEAe P(|{+3%Iw+0 br[S9?zyH$I:m $D{ )~?322B1dK)]'=d!mz1FOOWVXnQo =y=ǨYPf[LXW j(+--Զ@-,,8NkPqR'(1LH]W-/1&Y./|U@aOՒ+epxG#;ضrzK̄icx>-b`h?E{Hz qju&o |cդ{翼;mqx"Lfά(XƋ7  %!_ >%_ G5BNQX,iN*uHܻwIIJ,,bddMӸs&@2dzz!pmEf|۷ fffJ,5\WvقhF:.E<55..^$bX̀躾΅& AQرc5B (R3`&`s\8N͇B!|>_W `6Nɓ1Ms]tY^|E<Oi磻{u4dp8|hnE\B"M޽H$'PWWn}3۫*S@ ܙ3gϺ<;WUjjj%{,+WUUSCCór;vbaaksBYQ8pD"A?333ضη744 sutttԔ4 >}}}?lll<樬(A<\| z{{QU!3??_ILx$UUs#QT9<kMhn`` /^o(!f裿pBxb:xϯ^K &_066%V<?899\(G"\O?j>|ŻR)02=ǎu!$r(wyiIZp0Vyn*9 !F\_9ڻ;M?m|W<_cc#attJ2 m8ee}lkk{xCNxRYn[tuuU?]b1r2 0??Ģm/wttm[Xix;.K4.`_t?b$y$Id~r񅭼ѭRY,\-IENDB`clementine-1.2.0+dfsg/data/icons/48x48/multimedia-player-ipod-nano-green.png000066400000000000000000000072721223327513400265230ustar00rootroot00000000000000PNG  IHDR00%bKGDC pHYsHHFk> vpAg00W mIDATx[{lkwgz]c6vvljCRҴ%DsQhSJ !msIr[&Q(#} 4E1P%ŵ.?gvgggh:,j~j3}9  aԃzgOWz9{axqU=(FɯK٧2kΎ9Rx7rY&\xRK"a".o_? ?x埌Nӧ~+WZV$8$w[>w;x /au֭JI@{{{{{vnnXrr8+_N:qB v* '@ϧRllN'PQTU M Ȳ,s`[,k4M~?R[PVxѲ^uF@C2)4@0d2qpe9 X H$hG ˒JνBE()YHDXAH$7Zّ5H(< yF媩l6^QdaEŒbXrF0|¢"8f3EUW4MQ^ѣ;nzz.]j$IM& rjj.\Qώ!f p_diQvg $jx>-*nja^cSkJLI,qѣD1$gppCXTu:IXrXe]Kt"kPP̡T,!dRA!lA`21+**fbh$^lސod 鴺鶶vt^"ɂz,F"ɓ}t~>\hfG(0*$ISIN4S0 c2MOf;f40 TW~$IVJDElv[w=kAn`2$ sj4bz_&#, bHDMȨTU-YP{;F"J&I"k1-q,EE4hWPNqk `YD^ xyQdYQR)GzZrr8nJjhPȲ$ȈD}WʹIRxRg]$@(4::q@@AͶq#Y?[ 8dժu&|(pf|A4@$ɲ@AAnEtnbT#k((p:7oV>Kcc??0oCC;v .MO[IEن e@Dy&@WDx1ܿ'I0l1Za84MQL h4Cx 5 :QiY Qpyy D"5g3odYA`Y,z?HS˥*:Z CQnZ²zp(+@ET*SqkD57Tې) F+\.[Z|>=8Arz|n4=D6:{쩳Ǐ7oiҼexUW'?>~e2}e ?ַb{N۹sjDB͔ B:cg 7A9g8q^]Lxb#R"PۍbrYwݥi8)Psy-A[QkqV@ӦMMϿݿݿ}׮x<ǁf b6~⺻GFg~]eY\tzbHd9UWCFwvܰr{snhiiiiirsssssH$g IR&jS ML,ɤ,'h8 GN3Hs9w~w.g& z}k3_,L)nVxI8Lb<^P2^a<rL&2@A0LhI&1O%+*dy(-,-88KK2./,ѿ\0p|2:nY%j???$ IfO],_]7ԫAQdlH(- JKԕϝ7d2Em[ R?O\?tw;/rq8J ^%^%^CMu8ZZZ._f3Å~+ȑ#GQ _֯7~j۵\~:/^ x<,x^׫'izn+W\rEܭVj2L&Ax^}@NI9988n|ݻuo_ чeeeeee@wwwwwn۶m۶m 6lp:fZ2]NI6LxI$IN  B! 2b0 F~6|0$ϐgOd97777'`|=m6mXwN)_|++Cz)Qenp卖7ZވD j j jWv:NS -дv~t5sgo˴l6̀p8P\,tLF 0\.,Z,@}؝<&P[[[[[#>T>T>T˩''' 'kK-M y$i2 ZFH*JR@ sW[)Z?ͱ{b1~B{tT555|;8c86MOs>}fr=^+ܰ$); v|Wyw A~|XU_l_؝$I>EQE}S֎ M7=##TC᭷Ɂ>k XC$auOrp[ף N,GŒ$7+ f;?+ Ho*i?P0A:M_+d{ѳVVVp m ?7,W*_U~QzȲB-%?Ҭv]˙)^aWX` k^X¡C6gUW6ӅFacg',>`Siή"fF=jh~FF_`)3jԫ%tEXtdate:create2010-08-09T21:40:20+02:00ʮ%tEXtdate:modify2010-08-09T21:40:20+02:00UtjtEXtsvg:base-urifile:///home/john/code/clementine-player/data/icons/svg/multimedia-player-ipod-nano-green.svgS5/IENDB`clementine-1.2.0+dfsg/data/icons/48x48/multimedia-player-ipod-nano-white.png000066400000000000000000000040051223327513400265320ustar00rootroot00000000000000PNG  IHDR00WsRGBbKGD pHYsodtIME7yIIDAThZoǚDIXVkHuz*SCCO=EoKi>t)6`-YɥDrٙ,2DE<$fgw77IdJ'B! QJ̙3~p' C9n.;/rd2333<_j:u LF.{DA\ƾd &;p1T!kH<* ;49>J]Z͞磾?!)$=YZl}ar8)k_Z.}ǺAEzrb)hG#1txq{׮8B;!`k@$60FLi ZxoT(\4L $ Xb!=B]ZC 65 <z!B v7Mpgk ^D).cu0reammPUΝAΟ?e+D5ʿ n}K`𺭫$~v. (PU~swz&hX,B]9mCQR); h[UJB{צA`yyT He\.cu]**dYlgJ)"Ȗ|G۶{g0ym}xdRa8N}$eYr$I,낒$A zc e!&ٿUU!RXH$WX (juR튶?o94$I$ !G]߁o5 LMMa~~2M.l|'Z "Pa1:V޸q!0|` 4А111i\|MVmZ`6R$t=I 2dYBL&b8~СqEQ98 [zWl @$cppP(8x ZiCS Fpxj5ضJ- +$xLǣ1aonB{mO L|wBJIۘw"PJa&btӥt/ɲ ۮ\mv \f"Rz cx|G0 D߇iH;rnn`Vr/'O ȑ#NGJLMFţG0226>^VCXA|1ӧ|^*rB~_A6 G}icllA`~~d10d<0 @f_(حhO + 8q"z…Oό |PJQ.:Ϟ=@7~e T(x/K.}鱗,Є%B?=ti/vv@WXnoIENDB`clementine-1.2.0+dfsg/data/icons/48x48/multimedia-player-ipod-shuffle.png000066400000000000000000000030121223327513400261120ustar00rootroot00000000000000PNG  IHDR00WsRGBbKGD pHYs B(xtIMEIDAThKOW"q( VRR"e|.+mmEESU"Ԩ,#R4ll< ('/8eit7{ъ|~VQy dYpիXZZ*PJAjNW;]RQB}眃R 0@)vBR5{ m{ @)ݷڙIV8hBBlۆ$I @)˗/~}4 BQBDʫd2 ˲;;;(JbcccZ CuLMMapp@$X @UUAF$Eq00lv"196^mR0( @Z?m!8ؠq8MԵb}#7 p000(+q)^v+D"X,JC~|p:(uI0>>ł@&Il^utUU$j: 9L˂eY @D]υ$IB"a}v;a;tWG bèxp BcV| Oɲi74MKc=;l69JLl ЫS7߿;e۳g?~ BTUMz)meY( x8yRRfsg/}~ԩ> V (U `qqc0>~m&66^ &}ppR)HrjE9ӧONBt5u 0 JX,óg(yކKa$Itb1֥Ku Ν;8}44M;D"0 ǣ˻>L&^-n^ 4uĉ2WVV<ϫuK%{{iѣOav }"33 \!֋H&<*AB7 A!_` $≮(wp\4tfbV9f >##&Q6fQYձq8o?}1-,-!0}ϲlض{`W! *PՔ  p F [ؗ뿅RPU~>dFOo_Z5)EeCpņGM bX@Vgɓ g`"2?lR=2OQJ_,1](HyӢ/ ^kδc_|JLpdXC~Q(`W"n%b~M$o902 m$SL?@@>ݛeY]SUU5!EQp{af1:4B(HR{i-%<m}(M 1B˲:dYZo ܼySM,d1 I$IBP4<BPJ(J!tseAY[^~8<<|R}Ѯktuu{i[&'&&yܾ},$<σ8`կ}#J8P\.ceeT4Mk*b!eutzEQJL&wBeAVŪv,u]D18|߇a@4E M`f}]4;Z=Ԯ3Mǎ{ CuChFU!8LӄimC$Is]T0::!$)ϯ O`bbHVW%|R`||sss}ciJLp@U5DQxW?aS9K= ` l-]?,--ԩStnܸa1X,J)JR](ZbʈFC[Q) ] w~ [T*e2X8nJRfe{rzUUA`yI Beb1d2alBˡ(7~bBSSSrf>ܹs?K&d 1+J,pgj{!NTUq=J` ì:l6P.Ȼ'N;qu`aaaMys˲PT`m;`}*x9<.\פ]8I)iMӴ9 " cccps 8υק]|<˽E)}GqBQ;'ȦM7[SlJZ&{{St`,/?B.^xT%oظ0lrrRvO# !K_YY+W^9&iUoxr 6IENDB`clementine-1.2.0+dfsg/data/icons/48x48/multimedia-player-ipod-standard-monochrome.png000066400000000000000000000042161223327513400304310ustar00rootroot00000000000000PNG  IHDR00WsRGBbKGD pHYs(JtIME|IDAThZ[lYΙ34qizڶ$!nbi\Ti;EE+^y-ڗ *A7dIJU\3CcˮqҴґ2s̄ ) BBR7dy|~T:uJ>/!;w\˲>mxϼfB6(d2 gyR5y뻶zO NRJҦQwN֍2f-u81I$t" ƾ@vXp!2d)|7]THT)8i+wEB{\wK`#?=078yW!8y005 %w *o aH^Jxh]ꡖs.C1mQ>sWP.P<@J[R(@u>@iR~ *SKCتvC?j^jN )z'Q J .!ғ1{,eܙYCW|b Z{h9i@0QG~|1t#F@[!͙{3';ѵ!2=rZF^϶Ww Phs@U$-K(υfRJx۶>TUi`̗+++, p1!8LӄyuT \ U/p!!H)aYA*B4}90{lguu!J$mAv\.o B`yyyW?P0 A'@Um'QDu]G2ip]R m7obu>iiړZ04MB5 7(?]ؙZARd2 J)VVV* WDJ X64yaJ韏=&c 333 >VWW[&Z*׵^|q~{BRJ(GFF\ZZBPiGIEii1u.8Bsq~s1~s@P#G.eϣɽx<^m1lnv>Bb:۷* hV* \EH3]ׅDTB4Bhr ۶AA4mP"\.~YӷT*L0t]6}wE("Dra4:J)z{{w\777GfJucqq <FFF!bG( Y_6MCCCGbMa!4NA#0M dDU90-<(X f.+ձb叱ϖ|o}}בL&qER:60eY(JUH$ReʚR/AQ"GN˲055l6 UU>lۆe<_:s4͟rO<@NcvvlW\d]"W8p$A8FT8ĭo8ՓYᵱR4A)EsAc<Ғ|? Q>o<Bm8Nc֪X&T{y BD 1X,d2(B( ְ^EC={|>\.[fffnOOY)%ٮvUU <‰'GZ۽kȁV;vU׎"С 7eY0Map˲|΃B{)?t߿vzdY+>twwcbbh;Au]B>~־m|>EQJ)n}M|U'[!Q%ٞr${{CA}AXⲔ .LkN[A@5=e8+?wrڵmJ臄?,,,|peEm}jTA{&#h[;+IENDB`clementine-1.2.0+dfsg/data/icons/48x48/network-server.png000066400000000000000000000031601223327513400231040ustar00rootroot00000000000000PNG  IHDR00WsBIT|d pHYs00eʶtEXtSoftwarewww.inkscape.org<IDATxZMoG~fwcu HE@Q{@oZ q)BDPq8TT5DU@*QjڤD1؝fO[^ьgwwJ))orn8Hs-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.0+dfsg/data/icons/48x48/phone-google-nexus-one.png000066400000000000000000000125271223327513400244200ustar00rootroot00000000000000PNG  IHDR00W EiCCPICC profilexڝ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Ч5 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.0+dfsg/data/icons/48x48/phone-htc-g1-white.png000066400000000000000000000043441223327513400234240ustar00rootroot00000000000000PNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<aIDAThŚm\U9yۙ]h^Ʒ؈` j0|JH"b4Db$4$ZDE@)lbHKK[Nv;ݙw=~3ݥK}ss<k-س۞1S"17ȧ]c1Xdo5C> m{+^ؖ/ٗN5iPXEDitF_8yW>ϖ۞Ukw;rΝkZ'OZ͛7i QJ WЃ<#8[8SSShZ7~ nEDBSD߿`,k-,333|[G? ,7f׍Q,QK)+;52gff1'oOֲ֮J-MVr;1yK/kt7PZF+8j\׏nݺptMwmHҤi(D)DǶ>OXЪ-ka0DZo:r~11`ZwGGkWřs-J]@d=H:K=F YT0I: G F#`h \nUbZ#"=U$)D F Ht܋]r+*([#LZ(d(%_z3GsU8'HӼs'?} 3SDΞe5+Yjw ~S(#{ .G喛nчC"ĩSqD,eԢs[ݳ=oE=YIG5ըHsGxq|5~Rx!y5[Ζ9]pՂVث+*mU1P^'JFT uF`:"g=\7I8} y3"B9C) *T9l>u:pGğHS3vlPZւ JLy5L% er嫟$з݆bT0ZpV*Х'P EdnHh+cpP#of^M0Kzm+ _EƹjhqBCh.Zeo)Z~Пiր2,\<СfB'$-n$jRXI;v 6lus1X[BuvcTCF[@ͯA)@B! h'PW;|];Յ65^1.i".=khRK&Afe5krb< @M$FZ$*)*fJy݅c/'O3[^$qc4JrqҗV1 BY АȦGT=ܢ'>B-e ###_~_Z@/ojpxiM44֊,L1X sse2S*k%]]1cZDN)JDx]*[Ih{ 4Jl $SEìz%D$O&͑' ԟbVq T21p~=~c9PJ8Ir<#":}lfb\# -+A@<?vJZ 1d3YRT*U* 9xhL6<>d u Ð ǤÌ׬_^~uk>w#I<ϫ?yZ\׭Kh~s }X,ơ=+vgkD80} \eΆahkڂ aYlajjyo_Ooa Y-g_ }z]H%Sf(ϖfϜ=sz˯^x (E@@N" E'?HND,cc9a`>*Eڶ'&?Q~3:eg{{{ի3g<; a" B'"yc6k-,sܾ};z~_Q0@Vڵk__~yjasss*]zlYuQq֭Ν;fY z͛7A I/Y6)e۶ qpƍ$ "zo._h!|GFߟ }ETh_[[+HF#pαݻw [:[a¶uEX__@NڈQچ!ͦ sSJ$I`&8y@KM۶97i,˂I ڤRQK)!(t[<񓡴QR"cEY!`F4 !~r DN~@:Y<Dk84Ncl4MH)yiE+`mh 4 % I2ڔ]_mquba " @$Ȳ ŋxq Q-DY`lW-!.\  yB`0@JF`1vvvJ *FD4u/( /$ǫ KQ@$ \c0^{ Ii "Bx5eVAJ`,0 @9`yy^ Fy_uWo5t\wB, (6,ѳ\!qZVک{|QCt{!~+DH APUDN:y頚,˰Wjӓ"qi8y@Dea8DMkn\$AP/_I‘jRJkU)ww"$׿u "0B*p]8;+Z'MSH) "ʣ(c ^:M*@ ùJǼ8SÇ:wicSzc+ IZ/Lz@eDƘU! IȴaUi&ڂio4ib,Zmx.c85u={^ᰔ?&Ycp]ٳgh4xI/m⍍ [>}8qixi4RҥKN`Rn#+Ae "NSHI+lDcfhM#4MxXI7 XZZ*4MAVU6&8%] ;B=U.,CǐR.\wGU$<R/+++B C(GLJi=^|44MS!8NQ}\]]-Urcvg8mW>}~$>]8""v|[V06 ~+\a[)ItXAI@B6:saN`=>e9['OǏ jIENDB`clementine-1.2.0+dfsg/data/icons/48x48/phone-palm-pre.png000066400000000000000000000056241223327513400227420ustar00rootroot00000000000000PNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDAThՙKlu{̓!9|)QM]qI6ӸohWEl(L.k(ltS ,N -zY(ˢߏpG ?*Ǚs=s=;JDLދ.V |yC Pjkxǃ,//oE<;4tсu(ԡdV,ئA֕RX[X谺@8JOoʕ718e<'?Y_Yysۣ`nff~Y]_gie6Zj.+T)b8\p9A(Q P,h4p :xǏp 3g-o?}5(A.+7C)ZQHxnF{P*<5XX*(e<3vHGhZTQPSh!:M:\'6_ԋh1ق[PۓS K_KllnmP;NRE-Np\" '.N1sO2Z=`(V OW02O&sgm}Ii-D)pDJVH5ݿZemB,.βQNLHuB+ Vz8z}NXӧ TE-R*7'/@A 4-Ashc|G05v #SSg83qwE2hM4a{#`E2+4of$ѤFc`%f/etlSTXcPnR(laזS>Xk A_ΣXk0&7h%!vx=w'i4f;;(+ (j$jNLұi01&ere_,=m5i"zz?qm4a+D+ PR- Yj,lX1$i6c4IdXcD݋Xn5<Jhvǒ &𓫈n> `aiu`M|7R(8BὛr+}ȅWFskLCD @^8$i#z3=wЀT'$:F)H86 TXRj8$IPضE([xX]Ɗ`Oh;t;ygTDdVu=5twuvQ=u [ oST(j%o]ZE~&#VwkEGTl.|8N nQ1T{89y*%DTH^g<}?4 /;;hl~P2M) Zk&1a'b322BجT*=MwPݸ dnjk=O])--PV?x)Qy'ߩĂNSVWW%5r~JBp`\C"B$Z-666tIy}cDsM?jq\qT ٹ5G0|gfعw|kr]uT ktEaa<"\N p]cL#W(x pِePFBkZJ$ggACKy IENDB`clementine-1.2.0+dfsg/data/icons/48x48/phone.png000066400000000000000000000046471223327513400212330ustar00rootroot00000000000000PNG  IHDR00WsBIT|d pHYs11(RtEXtSoftwarewww.inkscape.org< $IDATxڽZIozJR\D*l:l` )a( -'}@/$!$XJ"@oppM\f g-},90޷uM8%f).\PzoLLL,@}6-+AtA﷣(j6 W|nݺq<`9sk׮RgADZc P:BT*IXL&#'m<|>߽{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.0+dfsg/data/icons/48x48/spotify.png000066400000000000000000000067641223327513400216210ustar00rootroot00000000000000PNG  IHDR00WsRGBbKGD pHYs B(xtIME 1FRC tIDATh޽k\uk}ܧ}mb6Ʊ P &QDBhVH$~A҄r%W ԪVQKh@PHҒ R^5kk_?}9g~g枹$3ڳ9_{a tUoHLJs6:Y3V ^CnUdU),!BQ`V`ʿfz[~U {Kp#pN%ðBɳheMI焢8&v~mC_xy]JS$RΣ**"UڷoyI4% +Q,@2.Bqwv?9w6N_$IIi]wnVhdVR "$q !I{HZjT\}iCiIZt*-z &eVFFNY٘7 k蓆9]\B&RpDf;ҦJ5Y1kdD_ڠJsD-Ej߰Z寧ϕϥ.lq8UTq4cgrNLLA1TZ% ˗q,OY}a7.D 1Kۂ*@JzhZؾb[gзfkM^}"Zd!%(@UpcX"T@ΆKոvz4gkgؽ EJ|Fc<([m u)77̘C1Y$R!. 5z8D0EUp|3o]=<#GmC@ɧ!PWKe|eTB0㵟79^FPFӶ^I"8]5 ]5aIc2eRʕ ݩ+)sM RQme۶>G"qMK-& jXRy*ǎ~qPeFA^y5Yljgwӕ$j JPM]lڼ&:dy+.}(˚b!PAYPr /4q2ɺu on\qvYnVfl-+~}%8 " `qg|2z+-`Q$L33*E0y0jr@qoO,' ZVC ?2V%B XB'j6GJ+k9tJJ0rF1&/<霝_Zid%c l[`oF!V(UU)I¼ Fy/lvlx=8|hg4z,)TA (Ll }F*$mC*yˆ¢"TPt'Fg555텓'm۔f!W(B(6Q[EiY]R1} y`lڢmö՝K>i=0xi~ +2h&4f 7V~Kynl6MNĔa'/iuqm/D(+["kn\JᵤW AMUGaS3'F{B{rn͗˧}t8uDzjpE2oG-s}لz3$4NO‘Ҫ:g3 9\T[`;G@Ym׮9{}kZ#W_%Z)v EqVN vu(O+=ިy[2 {t̑F(QKf[׭~&<7PoW[7*5cq3/= _}y—h:~oQGFDh9;qhmy}{_ruʡh}?"SѶ+`V jjrq}FnwtswIUs\GzǾwYBۖP`%9/X27 !k )I4w޸>16v̾w\Y#ZҚM,P;Suߟw]-Ք^?CW?x^NS>t_[COǑ~ $T=s _Z/_ӿ?6hL;;$k O#. />F_;Nc:?pZU7s٪ɝ[gWz]xG>#mM ?Mg/>^`|hh(߬Fc 45'pIENDB`clementine-1.2.0+dfsg/data/icons/48x48/view-fullscreen.png000066400000000000000000000015631223327513400232260ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/48x48/view-media-equalizer.png000066400000000000000000000060621223327513400241410ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/48x48/view-media-lyrics.png000066400000000000000000000032311223327513400234400ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/48x48/view-refresh.png000066400000000000000000000072371223327513400225260ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/48x48/weather-showers-scattered.png000066400000000000000000000064171223327513400252220ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/48x48/x-clementine-artist.png000066400000000000000000000045501223327513400240070ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/48x48/zoom-in.png000066400000000000000000000065471223327513400215130ustar00rootroot00000000000000PNG  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.0+dfsg/data/icons/svg/000077500000000000000000000000001223327513400174015ustar00rootroot00000000000000clementine-1.2.0+dfsg/data/icons/svg/ipodtouchicon.svg000066400000000000000000002442321223327513400230000ustar00rootroot00000000000000 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.0+dfsg/data/icons/svg/media-playlist-repeat.svg000066400000000000000000000061111223327513400243150ustar00rootroot00000000000000 clementine-1.2.0+dfsg/data/icons/svg/media-playlist-shuffle.svg000066400000000000000000000153131223327513400244750ustar00rootroot00000000000000 clementine-1.2.0+dfsg/data/icons/svg/multimedia-player-ipod-nano-green.svg000066400000000000000000000723261223327513400265400ustar00rootroot00000000000000 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.0+dfsg/data/icons/svg/multimedia-player-ipod-nano-pink.svg000066400000000000000000000723251223327513400264000ustar00rootroot00000000000000 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.0+dfsg/data/icons/svg/spotify.svg000066400000000000000000000272471223327513400216330ustar00rootroot00000000000000 image/svg+xml clementine-1.2.0+dfsg/data/last.fm/000077500000000000000000000000001223327513400170335ustar00rootroot00000000000000clementine-1.2.0+dfsg/data/last.fm/as.png000066400000000000000000000047331223327513400201530ustar00rootroot00000000000000PNG  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.0+dfsg/data/last.fm/as_disabled.png000066400000000000000000000045071223327513400220010ustar00rootroot00000000000000PNG  IHDR szzsRGBbKGD pHYs  tIME.IDATXímh[+EJ,YNEYlyy$nYh24) 6(hGv0l0X KJMaܚ4x^,ɚ#$[ovιR]䶴it<Ã9PJ`0TU5B14BZ8? d_4!X,v---غu+!뺨T*(XXXXr,khxxx?@<cOOއz,ömض B!P@,c}}quzz_ _Eww޽{I`AM_MPJ:B ǯųÅx^=u+Dps~xI yxbhh(ǎ_0 PJA)'VVVrrgg硗_~B$A\V Rtww3 "~ ڳ>;~z_?Ee ܼy ?t>˲.c`u]X/4Y.۶a&L31˲_|(B8u]a$ l۶ Rض5ܻwmCQM##RBBR1?`*ugS~wvv"JRɔVu<EyB>ݻ199 !cB< ðmB!~$IJ%pΡiZZZсbbbl$ bii }Dss3dYA)(uPSS.Ν;I d|׮]m۾dP,Q,7oބa `rrR!@c 硱1ډizCC.9ǁHӨT*eY +W:::|+2ƌrL&󝖖H$~W4Mbѝ^vWWWoPJˌ1_N?c!`rMMM;#VB5MR* +++r|W1oi+B< 6rI\BKa< +IENDB`clementine-1.2.0+dfsg/data/last.fm/as_light.png000066400000000000000000000045111223327513400213340ustar00rootroot00000000000000PNG  IHDR szzsRGBbKGD pHYs  tIME IDATXõ{U|יٙv/vwhK/H)bi%P1JSB1FaH $TlҖKwg}9?KOr2_&=y}^aa6#蓶ڶ7E'N2Jt|] ܴٜ+>ʁܣdo ZϻmnJ,@`(.c/S(i/؁G~qUִ;|* aY {D8ҵAJT@>#2R?jÏO~-qҟ/rt լ )=±qڴܬݹ{{ۜ&TQa#ca!{ɾ뛶u:p|=n5A %` TeoZg65wW̵6uC X֥ cV§10T*$v]4?8拞禽"ҚE82N7|C@-oJKW[Wga*:kTeϹaitKܣO ௛6nISQq`STB|pd *Q 8,Μ,F@4'SU:7 Y_?yMEo!AR*4" ל0Ɛh1[)R<hFc'L5śO)qu/oi"*('܈B{9R4hm<8BqBe\sKZ4B`T #[(0-509h yq4'S(NR K&;ҩnKLjt#U*?pf|&_" 3Q$:`>_L!Q63SaYE_$3E?( S0iG6SE1(8j) ?Y{+cا'`:Aʸ- rl[(eĒ.!K1(@To(Ý[LsLr@kM08Bt&PaH4Ǟ*Aҷ1~?;HMT8HF86²D6anX"pT3<8IX؎҄D Ͽ]C0>Yo߳]&^`,?`gX^tAƅ t"v&i[B7%}t2Q-̹z-V&!drx_JLMMr |ʱѾJ8JyDuT 0RnP<փWPj'ORn΢NOyDGsоCT}*"?@ݒ.ĚrhAs1v2mDvu`1u$~s#rDa<9$آTr|<%&^+k5iyqxxzu0=ClH,s?̲xeR`y.!B)Y}i5о^UC|i/ZoBÆuI0_BG!v&Զ(0PMKrҙ>R-p3s7l g^r_+nwZ9/}e:;߇czNS9Ӈ ENEKq3u18EQv_vzyz@X2w?޾~*aV*pLqJ 3^uH׍*1 ±q,TS~>Q+O83gqym,a D!BHlyN *2heYCQJ#ELqi x?kw~7s)BƿUՉ`8=1!VyՇQ3 ÊpG'淶vhတ1=F#ZWp\U(LU N]yu銍"i]u"1"f 80<04<쟷]۟1ʔgݘX˖77^LԶHY3\= )"ȏUzˏu~ u[30 sVo1;fP B1>5v=eoxd瘪悛Ss(R^]vb0L:+,ۢX*\D%^{{py|t/'f۞رCn!Gkl ; e\ %QýkIENDB`clementine-1.2.0+dfsg/data/last.fm/ban.png000066400000000000000000000033611223327513400203040ustar00rootroot00000000000000PNG  IHDR szzgAMA asRGB cHRMz&u0`:pQ< pHYs  ZIDATXåyPUu},= T\Ed5 |SP5EҤqLSr!!3 F\gT|.hn-N{}Dgr~|[7"FL42os,zwfz1ُtii.5KkٙF#5 52aENt*el/g.rQS#e *cI+ԅBj`"KPPᯢe5gi՚t&m Մӎ~8F kѮy͂zĘ]Ârb*HYג}ƙX\ p֐Gk5tv;'8"zZ=GT)iMfp^0"cMs WӍܭr=tOL{.gIw85V[:tkFtQ1GƋУW!Դ2_G$]:6X hMG;+ >L@4c]Qɯ7IВt Qw85嬣ťSB)rLW!cɌ\hP-= =e[ X[7%3Me;Y$v2^i-hJ腞Z\?;59|Q"sF}l ~bz=)աzjnr/[iZC>(\K  l|]TX[Si ! ti8#Zr>8elľtCb&U="P^) S6y)*SZбK1NEkuޡ~% PlN.Pkb0b0 3޷|TM XSzq6n'Ϣ0(;y51"@1hI76 !~7sȫ} h6J݄mTu@YC7zz#|NLs1Sѽ&|ʾe>#P rc"umSr$DD7 Qo85&&A-4 )EMC}?L ŝghƃS*OG&4>+,1bXCrQZh~˅ 10ɿ$Dߎ{?Lja 9EXk~*ĉe0Ia戤H1Y1%;Il,ۉkbB\6LUIENDB`clementine-1.2.0+dfsg/data/last.fm/icon_radio.png000066400000000000000000000006161223327513400216520ustar00rootroot00000000000000PNG  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.0+dfsg/data/last.fm/icon_tag.png000066400000000000000000000011301223327513400213170ustar00rootroot00000000000000PNG  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.0+dfsg/data/last.fm/lastfm.png000066400000000000000000000363571223327513400210450ustar00rootroot00000000000000PNG  IHDRK!sBIT|d pHYsZZ0?tEXtSoftwarewww.inkscape.org< IDATxwxUJO RE `~(^D+kA.E@QE)Ja`L1L2='g 39{{gB3l XXXX Xe@_z<]z0$JN$ =fs\cB0[o,,[X8C`n?! ,]ǜ}(#2%x! `c`-Mm@0xJqM+q.=W/љ7Zu1%9&#ck|}>}=-5OO(""--J%D+Qϐvzϋk~߁;OalB|o ukW~}|m)׭w<5{J&ٲŷqA@;9wuWsu ._E}3$*/Kbf6ĵ54@ Mt$&7kAq/pq}zƏD48x Q0E?SY2YVˁŽog2[8x6 eK:JODJ_kV",o>2Yo~c1x76c8&9;Qwt|ܟ ); ?iVO4⚸?5mB UJw\q*^UlW`*=N{2 GO'=?12۞h%Q8؟ġknslTjܳc'QPt~bFc8 T%Ef.M<}5yN䟀SY7Fb-5ڌc/tl{rC*1;41T 佇32E^4*;ev Q:Xg"^2@oނ%SN ݉V^{m|9 8V5[10/MgQf_"J1t-…!#CLg)FT]큟av3Z; 1]z_*}F40>m؁J$F+ugs0;KS2jAuhe":E?ι!1U=1~/B%cuwbvf9ɴv] \D)O'`VQLd)foCb3.ME jQ{qs;50[o"eֺK0fg$"R]T+0[kSh5`AZ6[_W 뽖RD=ͥiio6Xډ+s0 =ca4f_>Hg5bϽ1dk%vͫL^zFVn(7--mlwT&Jny%fֆ'Ŧp&2OGq.¯0ffT7f>F|6}N~MGD$F}٧v5C?Ylbvp-qW|6Iř)+'zcf]QMFVn 5Mo|f1&로XGIƬEgi~H qii H`v-uk>tqƵSYҌ/Duc3b;uQq:L8(wxlsbtOgV:c@DDM;L 4o_\ XgU?mm>oP2Qkf`&v4E#>FU-]ԳU""[Ta&5Wef|δgܟ>e?x+g'ձX8|+&9+Ӹb4NE f8 BDd&Q1Wڴ8s'J}.֤9֕LEZb:.`f}5q!pLX#;i1;8us`[bJ]a*b S8`3fVAQlqHD>b3tbMv0Shj"NDDNZaf~S3s_2V(H$vG_=W`]v0bJbHDk(^H,p✢'iΚ6;؊˨XTCLx#zf0MyXu J$j8W'DdX4(H&Tl+Q_n`6/LTH"25JBqqM#YT,|7;:0bFk>pxRf-DLG, ūY[ xfoDD6>kvF۝s$6`Vz*w(feoˏеR-Hmy?FVkܿ:%YdvBD%bݣхWD,fP/察. DDjh׾LlK/>R:?bQxIځ7c/E.W;h }0;$;6@g= ""=lAY8H _2g섒rEOA}xKy@Q;xO1);ZoCܟ3k_Cea=X'3OρUho1 s7 ę @1L$i4mMpW͖KnTĵpp5p;0xhfz,CLo[8N9;YT :'5َ5:u 'Gt<<!CP21eq֏(~"Gl[kF'?pטTi[752w^Eٱu1/8r܇ɘ <ё/{e8=!"i1QYO[˕֟Ln3uԱjj!Dx=_.[R'~4AQ f~[XNmMdC_Ӗܟ)I_=QL?07HiY=9!VTEH:0իj#M,[O Oו25Ոs/Avg+9;uף#~(/_(_xV%rE_U0[GLLVa;F"n>Cuk};w}QJ1o"m/1{EFo/r>zk}^)@N&.r_51{5]Q% /Sܷ^AUz0"/BYLR7Q%PDr> \ߟI`^D_㝀OD5\\\ӓ~u|>qyު~D܏MǰxSmFJyf`0!QYz~Z[2N'^bpH̶+C^B18$fk#{^gIK#1{1ÝLImW7D'TbBQ;'}HP':Nto> \U:2ՈA;8r\D)":}$Wס.Q rZD7Ujڒj75pʌ2}Z?WsZD}4p3r?Dx3$6R[E Xb(]y;mq ;q;g7S7lC5nc~a*~#;0b'* Vդ|֦d@xpdP~9p K-J&#l5,13Q?X7A7p\V ' %<|X2LDhOu$KʹNir'֠\I=L,)άb֭kSS-H[3)֛JV$4nqB>HE1AOLDd&"6exCw"f>qv?Yז3tbmFQRdbq"j+^z൸?̔~(Us!X~rz6.p.þx! lԶH [n5iQ_F,V.Jx2zӈS"}(ړL,)D"[]!n Et՟lbzHhw*~DN[+J&Ddf{{!v*z]Ei[š(X 큍)V\ J5skB"HtGԠeCr- N7 :]"{yDbC+}Anفr /xlVV21QDؕoy/ ;Y+s9ba -q4 ?f(wN o-Tp̎F1P(Y;nO^㨾-Y5τ:QV&ct>pqO1$Cdz(Vh}!g8:8ӫ/oˎ$ >G)|8J7"PNƍlNz#?$Gr1HC$0-jsbJ$'db| A;D?l7M^EK- mN,<+u0D=L}xf+4>ߑȄ1;ܜH lb=rJ&2[88sfb>Kb t1m8*r-Z3\ 8$]{J ibglx1UWNu4$]Lg e (wۏsu}qD1l*<ϋ*3L &%s<FW~wv t3'%.N'GB,HY4OPWyr+4q2;)9;~ VrʪM¶#wGnƽf6Y7pf<9R;΄vED8z)<91q&f c.ynk|ALѭ䟆899ʎ'2CP2ݞt>|MEwWr*|ەjfWDD1SmqwsrwT2Qf=#|Pǵ9x=bV)ϓ3E 1#""30pyv"ɵDߒc2W21uĢ,/ iAbz.Dސ|bFSd⟸/Ha:RwU21bkr;Tb>|]״}ӎDz1f$!""\4 pYr ӕzے~PlY%8 o`Tv0""Rs7Au ę;jW%_9$vJ&Fl0R2R_a\'q:C""*c7#q',u*:#KlA:N*;LQ ,G˙ُ1{fEODD*K㎮Cij \n>f&ҽܽ=u%~!_<JMw[(N2QMoTv,LDD*3DᯍjNvJDؔ݃sRۍTb%3TOX, \<15S060nӤd"lNt2̧$kLk(u:?bXV_ x7p p?favfl'fF)""K҂:LvJDؖע­>Kbe6Bn24U-ҟ/`v/f?`6)""Ҏνa)k$=ܑ~# :=O̮d.$T1sGpf rqtm:hTJ&Jmߌ{lD,:}cmF^#7p,fcvfaNb""3f&%aӦd¬0K,Q٫;;5sA$FlNݥ⻘Y$`MKJ¦ML^'oO: U_!N:I"f/V5%mf`IDAT#f.ʢ앩щ4hPf&MJ^'oe“Kv܂(z﴿,]#S~7Pr`^~/5[H$?B>mȌd"wfBLϙ.`Qgu  n`b'Id"wfĶNXYSTp3j!J~GLn5bbۍf(6l=abJ[NNpf?,3L&:k&,h*ugQB1Yee48J&r.v;/Y4AO lLd"mo9}cxfk/AeEe"""2S(uctg4,^Ye}DN_ ̶DDDd&PG670`/M&zҒ^Ϯuj~˲ivJ&`^b7??B)f׵E? *r0P;<Ԗ܃oloM(zuDK)/DbV`sف43%t JMn,jT?#8K$3qv7 fg"""ҬL"ڡLT䞆 9f&0Eݸ/ l  (S phr > =q_؆H\bQw?ިQPR4dOn*9fp&;,31u8(nQ=A4%DGMlY\H "}c=wfO}k`U D`=5:NDDL'vJl9?ܜEc-Įq*{D4 (""REJ&]kf: ƀ141\W&"A⭫9;fd"SWe7__pBvܯ}srO xsv"""DDzo'GfqYDi&ebHSQ2n%ݳG%LK1v:1;pؔ({>eہmciJ&&՘"9fpuF6O8ܟ#fߞ&i:}*;Kg/gP(s]ȝhVLl_DD(q0~'~ch?"o+f[$Q,wIVoRJIm4-DWځch|b$Fr$g&EMv`Vv /= X8qU`qfѓ5RdbevGd|xMKX_{#f mfk!-Ey13@;&v,*]fW.*6'"tTT$( hQ f`.!m&@Ԙ-ٱĦK R{{ghKkk^|1ۤ^ወԋ]H֕I14>ǀ@aV(!Fo3,n&cf&QSg֎D'{,Z s0[*]:7cGr>!>[;Z p|v @Mlx̖'v xfKADdڲ_ 9 !:H͘N]1ۡV9QZV&QRRs>~Z ]? ;aOr""S}]42T4?DHUaMqhx.;Q:1Pv UXy+?fZL=܉40";:;ҳ[څ8-S+86Ouaˬ2φfBDd*0+ڮNl+ 6feR=0BGUxjVgf6f#nmC$bcNHDnW #/JaB58."2F dv%m-m1[vafm١cTs;c Sk#O_"FQN| Q0T竅.`W'ޘд-ٷ# aw\Cqk:W`fMZ0uo#~uX=:ĻE^ x0 _f.n̞'|8X#WMmq͘2-]0(%Zꗲ]}>cxq:bv?fĬ(%3{;QA%"~Bj "GavEf6 =0; ;0ro_^LJ5m:z4k$F스l``_``K`-J|@bdAguݟ%"Nu"fu.uY\i*>Z4\D/RW'JL~'=ivdk)̾&\7c f^b6b%1 \pG+'- | 7afK-Z0[ 1}1;C']n'{5):PWqeN}þj>b棨ZK݉l|ϥ*c.Qbk>"`̎%S0{3f slϑG~̮':W^7؄؍]Bﺘq<MHGe;4$No%6bfo(ӝ"Gq?Pup㙍YEAL4ͪ).&TcIw%cJ%H>WϼXyoH?z&޵]X.'p'obov\\E C8tr<^Etʛ&3rm-Djn]F>{Ü#ف,Nёjdf Mt΋vjDʳADg :nb/wGS;$/`1_DqqF_%d 8Sl>QQ~!̞ :Y}5z5ib&EɄZp=yl2%G%1L5l "RQ`/̖ƽ: YoshxYLdnXҸ깄(lzO*(&FDdZJxvܟOc,mf Q5}b/~km<]ƒkt""V;`~@ҌfQ3'B% %ͤD/مkآh#ʣ4g]xv""KRN&.SQZ>F+j֩3o$>TB$;Eej#jy8Hi6\D"} jj;3JN|0 Լ=O?ު?k@_zVsEab]X#x:;l̩ſSE4nbs ܋f(U/ T p.lX] 9 QEDjjt2q:կ!Y/`O3Vl'jܕفLx31? lB,kׯ3Q6Hu%ɿgcL\F@'<(Z(3*"R%'#m,V}!:}hE-?g$iF5D{5ك"Ű%fV,z.@DDb px Ev?x5p?Eq 9z"9?]!zCصij> 3: kSjuvH ML@yDz#|`PAѦՋf%,WmE ike`/Ii}Wh_bסPRu[FYkv/m."PL@tGIBct`b#97']y,%c[Ȟ EOĽɵ cm;HLXܿD6~-ؒ wV܁sGIHgo1MOt H$F4N`'; X K3VV={7D@O=gM"&L@t8i+Ōka7-7p%#kf^%1UGT\VD௉'|\ʸen9Rn=- g.Dv`bV^:'"R3O&ܯ"1 .hY♘eL۟FT5NS4 {>d߀ہGkX,. XoRnX>}/#09'|X ~_Z41+S,RM̼1_ MVNv*5L\~HlgI z,k  NkQZHzϚ{?8xXtyE?,bU TJdV `Kg 21#pBQDf+Ll3nvzscM >\J(l#>14~ġljTaqAbAk=z/7LIV~|tUc2{yRO~RRە3s")ߝvevvMkn-v!Y$FwڈђfDѶ(E+qq!r𷆾LJ]kVKt;W6;` qh5J)m!T)6D8z"}i~XH)##{N. qOx8_{ξmJ 𼃸/Sr2I/_.~E5&"M"-k,!J;V"W#ns60-?Q`l`k`[ù%#[(wj:Fytm 0e (ʍKM~^,ȖZ~bdÀrBg#ť[uɬ؂xؙ`9F:t91ȵ 1pQxps*hZRU{Ed}2!lK#ݥGgAt{ѴvsQ9D'nܛquG=V!:8k {' %Ne 1\Pz2-닌\/k^Fq lr{`M"XnV$x%fzXc>?_z/*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.0+dfsg/data/last.fm/loved_radio.png000066400000000000000000000016501223327513400220320ustar00rootroot00000000000000PNG  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.0+dfsg/data/last.fm/my_friends.png000066400000000000000000000026651223327513400217110ustar00rootroot00000000000000PNG  IHDRw=gAMAOX2tEXtSoftwareAdobe ImageReadyqe<GIDATHǵ]l\G{?qloݔ4P%"xVJE

Ϯ#Da )fzdMǒ(NJ,15 sxg;mP‹/MDdl"2i43E.?!ߑurBcJ3o,{6m]߇11^*IP-~}W ݙǵS^mPuQHmGyK?CFwn|lg=kbkmdsk bC?ā{J hiq\Vf0wc-ri\׎xXbf nS 1;6w%,3Zk::D.UQf!}wdŖk#s5ĵ2~Boˢ8E"/Atmh%rkXXߝ%URx+/NHRMB(B4AGkT[Z9J7 V(%W-Dz)@y*WɖF']{]s%H%4ZͯQRtRіM775PJ 奮N BZDH8dB#Ӊ_Llc:QR!j,N]˯~vnwֶҕQm B Z(d2Z{ 8BkY2@l+sמ7URIʥ&ОF_qB D-]uI!ELlZ85'6md4S:[OP`Z]|VFR7!@Nf7~VIENDB`clementine-1.2.0+dfsg/data/last.fm/my_neighbours.png000066400000000000000000000025271223327513400224210ustar00rootroot00000000000000PNG  IHDRw=gAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATHǵMlTU;oM;ߔZR,TP uc;ct1n4D0į$bBąD%J(@L?|wiNrs_rλ{>9̸hmYz٫"w} 6o+)!0e󧓧!FMkoyU(̥1GG熈h7^ 5rPza92 @uXcKx 8ɉB3lʎWxja1xkz$SBi.G`ayq: MڸnW+j̸Br‰^c- Z\5}6^ڸSC:rƗ.0 IT'>01ɉ_&8w28yh#ppNY qX1k5 %9`@A\]NT@ky08n\g*m o]B=31٬+Xͻ)t gMh^Q c\*dXNnլ'Q|uTGh4,.,&/3/AD@!곅̇afyd*7.5V#j f*ZY*QIMO]MDUwػH&c|{ӟFIoV6'Yu.;8u좛 KBdU6Gilk@5FWPn樊Er^E4 ZQau}ݽkZCs0wKqRM'n1Bl6| 驩nI@HBcK/s`2$f= =; Z#"L @ xRJ6XˀwP܈AD%HҢ:fh+oI,ivRJ01 )n*R%:!RJc ,X1DB@˦DYGU 0vBRHU6 LX CDHJ`KJ.,bYJtQ@ޘ&O}4~DYʈ"er0p@X! W`[J%)I獙*h6WS@sd hR]nC 1ۂXG@Ձ)vrL>ټagzo߾yte}=6W⼾yAV̙3WuO??5u{{ܲܲW 1hhxԫ  4zKKˢMlǖ_tۖm?ZOhh[^#zWR0 s r~U݄ ֖啿۷kV6@z4e4az7SS޶ 䕟O~u֟caa 4^jő~Q/,,Ձ :GA1RМ?3? ˁ8I8XĖ  FSdž#3Al]܈-IENDB`clementine-1.2.0+dfsg/data/last.fm/personal_radio.png000066400000000000000000000011041223327513400225360ustar00rootroot00000000000000PNG  IHDRagAMA asRGB cHRMz&u0`:pQ< pHYs  IDAT8˥KHaǍ2A!zhD$D#" $ADJ QA' 4;X]bI :(4#4?aE ª˻L =Az"L%D%WǓ} (SA tAzU L J;#d u{OOPo/'bQ>d^NlO BT*w:f߾!(E3є 6Y[@77\طr~ߛ|#(G"X,vpC &6F4  HbZ~4Mm:n)ͲLD2k~n;I$.xxDFntohl jr-lra* {?R)aL4PǾɃM9cZmIixd_.6趃ol[sMݹ+D1g; ===PJ6ۜk~e>k1*tmێ1^?gOP.%fӛH MOrR־T}|ֽ酟+m/c7'u>tU'ҫv{a.]dϞxsemPRJ:py}dc3("-E4v>8Bxobh VmiZ殺,/+`9p1,_?A$'c1wfjscDh)`81nVC0+_+?_z?F@B]176]< ?LήrIENDB`clementine-1.2.0+dfsg/data/last.fm/user_purple.png000066400000000000000000000014361223327513400221120ustar00rootroot00000000000000PNG  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% IDATxy}YUkin*,@`|F}F 4"Bl(b$@" (6(x/>5*(<ACU;Z2!J.Ըu{gsw9s.d2L&d2L&d2K>VjRc,NE\ o6<}G+d2Y>iO~FՑ`F N#; ZBEPT}^5z]60Ma,Ϟf2,lSX00him1#&#L'l s~i],fm_͚W9y} gBQyv>Kg^_~:|ae2e~_/5Dk{W1R k??sCpn("@|*;KwL& [~a<}Yq2(p:;e5PwԽ7C>ㆇQTH-Dћ0[[70kRTjg2,l -Bi+ڃW`gqnfѶ6pl|cZ!3DfIB EQF0 1T!*G/ϽlL& [C6{eʾ۾I/_~6Q{|s/1/}w’#rQ[ED{z(,FEZ߳_/>ld2xr*oC>CCWoK,2!3Рځqrq :ΎݼZKC$Ef@4%!bQ"M߲=;<+?-/a|goABQS%,#m125D =4]OUفs,9Ƃ5c,}NGIJ&da[})AIZKj,t {v2rCGSؘaL4H)Ic;BЩR={\)]3d2t(G֦\޽v{źg}3Y$d;z/\ܽZ~m.u墥=bId­'rө)GXĒϜXSeQ\?5GjL&W##_)Pawr2bLc{N KFG2W ƓSG񼸙L&cs[ϋ8if4-&(Fl&]2c!{!R՞y9c6_ҵ@2L "yk^\|xEchM0 # U9c\ddCg~ڼL&Po^ҥOvjVy|{·#lLױEEQXbDY(Gk9rC[?o|z d2!?Io7k{[cΕ>HSc.,;T) }S3OVcdswfަ&d~W[ԯMߙ16B֝+1*8h¤ǏuL&y![9?zL{tk36&珎%zjӀ%!#3L& !_e: M3L _P:阵 cz]r۩>hyIW-drvh 2|(21{{1QeTN_\s#3L& e\hq={l(Ptur{zF4W+`W.d9yȸsqۛPke,ۚ;w.eewyޜd2,lb}Ylh$ 0cxqCZˬ_Θ;y2L& ۡc{oЪ k񕰯# k 6G(CU}ò_X}珽,GmL&퐝 Tc,EQ0uFfx`}zfmhޝ;Fy3L&A>T(ݢU#\7숨=]Ģ@cyoo2L2n՚/l) U.W/҇k95EQ fݳ}{2L.GGy;+; ҫbB=1` *#̌`kpƚ'=w5d&[pGG'ڑ-)]AJʢ ˼q2q#Q}ˬqw]hW0da*^ 7^6CeKƮdݎkbGg Ĉ彻r:2<ɩC'_f&z)bc$0c "tI'O|R_l"d2HHCC=ޝo/c}Ֆ>^VNzn\ܽ}DdrĖ9l^򅲬"F)0 [_/0R9b9C1 bcw-<5Cέ>>v#Q5" ,XtsnV,}ϲsl"[bi4bZc.`&y S"D#Egۖݦc,}#{e2 )oxģaݢU/FCMc:Ʈdb *'>}ld29b.|h[:ZFƎ.c.X5];{rv&–9|?7zb}+WbC v@eװ״f~z^#L&-s{[ ͤj7̵IQ[װ-vs9ﰝde)>X2 hVHa!BP-a/9jd2Y2mʹ%XP:˴AӵKfݜZqw2LaSGG|i 0#ت&.*jp}GS1΅ W/|R+>su]6b@ǹr[֏qޭ/B %TŸ!`&[ql7CTg3¢.^YPŨE۹wL&#sv+AX X|P#0-&M9uC3-ƺaǫ1:¨`@<"}ͬ麥͓H2L!S룭kimpzބY_5~g2,l3mi+,P:G'%# oi}w۫rL& [r\t/L,C$*K߲k9de3?GNG(,M}n;[n~qW.daZ)8eHm,%9jd2Y27?nNjv50)*PAu5B_V-?M$L& [rz|\1o5vzuޙM$L& [SjӋ=0Fm ַ,gWs:2da^j Q Jz,c~$.odI&–9;*'Q(jZ@o͵{r:2da^~{oNEE0FٿtȽn^O[vNGf2,l͙sm*bhkJ2->mW{ګL&-sx-xR:6"5_;Ml ;͓H2La5o魳ȍihfmN3b|_d2Y2NҬ6|e J[D Mv=cĶqWI$L& [8ݖbJrG{͒zFhk}de/i48kIzDk>u[|BW-daZ~7'Zg84_RJr[Rf{s:2danH5`;0" u]/WJ&–9|3/CBAmݒfF՝{sO[&–99FOoknD;6EZ߳i%vL&-sȣm-W$ENlno@de7?۩Q(W"MצI$5r e2,lc7T+W[D >xfݒ{ide77=2>ǮZj Qe-i.ʗ%Z&–9^'7϶7\HSpTXt55ngRNGf2,l75zlھc{G-td&–9ܼ;nG+X ٠hl]?de2,lC͉l ֡RfvZ;]=mL& [psvƱ+cA5ґW.s:2danm~b˴OIj@ N3c]е?i&–9_?Վ]S"Da53|ט+9jd2Y23nhZYGiS*7EAЅf߷z?2L ~[؜Ʈ+$(1*{͌wŋojL& [Psr\;-&:k$vGv'g2,lC 'nj[a a%!1iֲٮn-dan^ck'Y3cVsmG.wKde77r81"ơ1쳳'^N2̡"mg'Ο|PSV AҮڤI$fɥ6g7Nbe,e>|۞*M?/~Q~Y1&pw`UĪNQ޽_ǐWӇI/~_x;mM#x=pӱ|[}ﳾUܟ<'W̛k)~VaiB$Fj jFET#ya|aZ*[Pي–ZS//3}g%GlO!N=\g7V^;0È-ZϥǷNl{e*^O/0/(}-1FD-Ό)Vƨ ]߱l,9vA7;~64@pw.*M_7X)Ǚ+l C(mAJ8S`!`0Ʃc-~R6gy[.[c_py1ky$*Zzdt~㵼bL뗞T̛)~^t1]h->*F1EL: F1EU!HGz}>MLBB/F"بҤtY)eO`bJj 2F XXq8[R؉M?6c7v=U5Y2$'L?x{6..wi(H'7O}.Ǐӭs|giʿ4RlTM[6~f[4o}O].>I;DVi/[z$j8bRBH_ &ZUЫ+`ZXzaP.uh:#8Qb2¦P-T6{Ps!JTK;= 8[Q1Uj3tt^iO09k9u\{]Ha QT#j2k.ٜӄ~}whM[at>$"ژDǯ>+(UDa"&ḬI5J*"DMPB ƨĘ.`NEhUhIQ$j^)b+ ~غ$xB)ūGb@5-&VO=op~.nזˋ–ckJ}̫ ;Gvcz{3ߚ.Gl/}sgye9cmA;g-{VvV^9)7cj2ׇx:U?UT%&US$"sʦA EW!7Q!AAxleI$y;g̨vr::wqG;|-H"~.F_SҊMZqtEc " p)N. Pq̤-)ŨR" QQ*SQ|TLH!uj{ёrΔإc& R5J&XFF*X适| IDAT*ȐQpV)[)Yc hÊ3[Y^q~Ot듳ڍݫlF[˞'c5Loc70Y?ٿj^?/.fkz`q2ogAB$iIPoШa'Rl10pJel!EfQzM- MTLcaZ:@1KNBPXFPF'J QSФ8!!3)a fx6@T 1j(Q'q2ÚD\zaX{k!]*~eFR؂UTɌbӏlc|c-Ƈy5v9`l qt&6Nε>ȷ3ͥWgwV;k]ڥ "DCa3^c%'&h9FK~Q֭pҁsCʮ(JȨ&AeЮEf HR)gׄ#6ls1\X n(xU%B8;V&MVC0C6*yV?cR"PXeӦ:]1-ü(6-[>5^zU0rPYCa SL3(8f?lol7< (99up#1^L)m۳h.ʱ]ȿc^}\ٽܙ]RXdcxP')\N+M[U5a+JV 24yA aR2ƑDGt6 v! "FM)H#[M^ !E$1WJR"B'! NCabI/H9V2 cw}`%dQ(MnYT ~pJ(1 b1 ;4}Suj>=>_&c7W=`D. [oܳKEM5+Fc J#LAaFM#Ƣ71eonmr9qS}ߧ8|L<%OX{~avӷ`(8*Wpb8ߤ{裶_/έgld=T-|?D)UhA4>EjJ)3AQbԡ/ J uq5-$9KD'Wy+`QNBiPGj"t2'C,cJC#w"QUQͣbz+.U&[B4)gRO]9XUiFN">v H%GzST_\~7@X-}L >{a:1tfZze#4jL0Xn#.ͺ𑦡8;eH;hI˰-1q/.ٴ@`=N-udoqM\"J2Ow\~_um; )4Jүԃ6Ll0pq@0>!B~/2i B lpHJp}CI8Diq" N 1Ce5RJsI1Q;hU zD$H)B-uǨ8M7 1$QQE"=Agp6=XDKakB!)V:! {v''Aj$ࣧXq6S:[={,ܤʭv2:ֽ)oOY-1e{]p\⻖.xV1e}4aT9w?x?g~[~7?_ݻZs*>\O1\4EXj@śd;h V9UĀ3B"=J VPlvЛ њxƴ+QΌQOdRf޶!HK(I$VAtE 85R. q2M=1XFGŇa|QMSLA '&5[O eg՚ɐ@FqQZ0aYL1)mח 1rN3=ɹj,lnM(MA$`"&=ӡ7"ĖQ+5 ^fl(MBQln}r{WS Glc'ܶ1LaEX[gWW:7c]W>0~G~elմ˺r0G&Ga=y$ 4JH)*TG^Ci@a\H%j7/ HuD"AAYԭfr\E&Y;8Q )Iӄ0X "amª670mn蹳. F%jӬ20qť)e+չC醢0ׅ 8+N/1L!$3K\JS" ->0->t^H+Pz4 b)lzN՛}GM[[OX#5+׈}}Bn5JK@FX ?\u`wAlS#LfP:v2AXݫA,ĤH$d CTړh & CqVqkTc zRT9aZ .Z:Rip&MI8TR}olqa( +Qe0$˿hJ 1ۡq}iQk^`pfFh<"Tb9 hÚAb@#E1w4nX޽ o*_xt}CFSG? N"uq,8;>JtN<8|gky׿k>ޟ_]kCHABꫲ AaIb $HݓlƦiBJ!jH5Tj @e6z> f)G^!m~5JYR-hT=SN(SpuLQ]yūWX1lzZT#-)qtq$4^KC]IdENnMj0:CY8M!>)rZak RCU Z_Q[Iuʎ0@hrD3.RX-b+#IbS`0g]l,85M&|msĖ8vv)TR1L܂5Wbkkw H^sϑGF,>^_V@@:5}SV0I3lbΤa!8sC*7A46RoC*JS#v5ހ &˪i  D86) UYrDUՄ`T(bbA#2lnSDbjDŘ4]1(`E}* ̓_?e[weL($;2LGo;j6jBagfYWz}b-s$KVJRm:bEW3|'\=FlH-`䔩K&$gb"Z)]93\d\Z0P6M42T`ZT&5ߝIkYw:R"j ,}1Yݣa&giTMX%>zT28\ېR4PU1S#k4FMbMAoW+fpZZbضHu !E b#bdYnX4W';s~T`-s(9ql7-j)먆7ķ4˽?M<x}ey?|V}RJ9]B5P 1iȋz0>m)Bj2v1M0C]τ}eŴA(1Kjj9v=l A*?-Af^). "BBİ|fJF)eb-Ey&hɄ~4& D=p)6f)cCL-v!H!BtSrIа]i(mLJJ 8J՘v< YK.,P uo"Mhbj)LvG+kjHo(MIЈA0&1c,tC[~Q7WUyZ;߼/_KƖo|Yh@ Gbj=R8~c[g8}DŸy|.oh6Z]ojgU"Ӌz9֤!CT{8jK+jG/` m|Ŀ\d3[M>K{+^BP4/>=*s'1 QA.c#Q&0hu;nIXz$\2 1`Ue\53% + ģ/TLJMqxC@4?3x ^|xĸ4_,*񠮖YJG bd^W2FkI0wrR(Fz]ZŒqRR)b B _|p!RPZ5ָ45:WlSͫ> [Pct{M]0r nG^HkX]bS.0sV3U' }.dA()C}FTЀ=9ZP tiA5b%5'Ǵ7\fPBRt\< ʶLة+y M>~ Cz 4`p 0CbH.g(Kg(\Z `MaX*,c6 !XsSա9:9Rl҂VD|rqҺ$tj0:HrEjjo}! 4>LL*xAtO33M*چ!0-ט*v"c<8ʌpvq–þri5kR[ARi&}Yl5{',˩dӯ-;| } AҝyAwfr]zym_6lJٷ>W.Bp$^a4 ,Dt lRtއtҐT2*Q`iҤ~V)I(wt ȃL=1`7ȁ@iA2AD *#ZrJdl kTqL"C"8V U HSEP11b8ISuVnB#XqmpPae!Чf=݀x&@&s3?{o隖ugyo˥NU5c0qБ;dӱATvV Q\FFBG1l{z9tSrw{?˪pr"22/|nf̙e«cESNXfND(&'~TBH16j6RAatx絿!u`UVrƌ+ b%O1lhmry\ޗD7Л)i MWbMӪoZ>rАo1;|RFr-)q"4&yˌG/,dR5oa>^A 1  Thr~$ Vi).M&]՚0Gb]3@lj;7#BKz ;*ѯI)Sw CDU0sJlcɟAC\)c&C,:6Se\b&4ȊߚuҬ1B s&bFHlf teH;^Ii@DURb*TDRVoCяYupV_aV]Oϩ3"'|K|6 7;;6&8**n\3闾<__g{/U}s)<"0OK{'b+sY1#+'I/I&vȎB c)qgާWM2s?aj4?ad)n& ѧee#8<6- *{eJAaMh3Sʙkm.Y9D9@41xq8~A$aΐ4dwW1c,ؑn ru|-h;*PQͥtHB{=B#~>yJrnQ^t{𔜝x{VaIcVi ! 11ǁ! z!<,ޘq\"xGBw8SsU(ej3)'6#F 1y]ِE >Pmeל'/T|#~{O?bI-ReU#QQ&;F1]t#%uT|2>WԨ1&cb| iM66'v$3ֆlJp>ߨAI20bQZXuXJ[g2C^ȡしˌ򗑑lb&9r@>&5E1WcJ.{$_.#bKcy31#ecKZǎ! DX`m֡p~o0) 6݉ڢ:v}ۆq>ez~N܋Q]/rx'K¸3=JR4;*F !iN=jru~u>gWCU*\*,MTTG8LEh6q}d<$G~z8k%=}d(Lt9I%ͩWq娚H{A!cj-(&/q0;O1?KW>c*|Mj _R8Wsun>ŲU&Poy`v9=96ٞ$eGB.&>owls^;Oo~.r* U%>c$f1D(UίQIr*W#ǰ[UzcFc*K?T*/ތ5}ipW= jqƹg+Uwu_Y{~W̄&|I:kpjnaR3VGR df}_ӵ߾%?;{)6Ƅ!YxQ`God/ f,Wf-p ,x7_ X o̯ʇ&bX<ǽ{w)u׳k][z,͜S2 .`0/lӛܾQ|X}v0g=vɨ4JeeRKVǙqϘ-2VFɥyYPkr2%GA第ɤ歎s2.46 sFs{a]R l~Ţ/uyMmQ7wb`8bAQ~[tЎ&ҕ">$D iMK՛ooOJn_|i޽wzybl(aC0 sIvZpƌY _ U5r9 6 'O0ۄv|_,w*]%d~ݧW蛿g-3tE:){,8c`Rk\ത-ò:Wpq{ʷ}ǚ0a" >2|~Kf4$KuQs˼^+[EaY*PgGy/oO?~۶g~P&; &b36nV͸Ӝy-PJyyO}}^NWp„ &t &| vͺoK~ɓ˟]q%Z7`kgW~;1\M0U./ŏ7}گvgĦdjzj7Pfx(jvsg?cb„ 9 0Nl;oxE( IBLg(N{%MWp„ MxMaѰnk,Rw&I՛0aDl^s(*,VFe@b" J =UŚy5ǯ*Rߢ(˩>a„Wyd«sgSkɊkURy{] &f&j_w7@h<zE-ڌf?srz5 ;)׬#`,s7CDYp@Y(+m2]Ď膎Ւ.t # k/`APۇn}n‹v/]f_\8^=>~]/ &bFlڨB`Pd? Uj ۡu Q4""+!Uo|_ S~/u7~>]8✡ .3l@jP_5oJDX2 l]v/4H DG\nKFrKpfTtZL6fn ŝ;|iQv?um0gA#vEh`HEU0lupF?K/$6[Ă\AY F]O/u/bzj bjRvkҖzݬKLUam- Lf72g.6'fvAѰuHx*H{w[mB#l-a5;m _q>)t d})a ڳ3) h40t\n˄&>=0%Mסӌ/H:~V}rI7З~dH0a"{ '(F[&l@ akZ! )gu .ous?X?B`HAV1 =xV{&t  ^98eAY\. W&5f %Y5ɑbVgBΞnq(Xb091͉ ED kX,W^䥗s"m_=ws^Ifkk0Rp)m᤹;4 I ̍eQ#tD.zq?kƷqcA>ZP`d׷|SxM$7a"HG.ҭ Mj )- e#5y6+7{HbDSDH-1"!@J<1?߈T !FY&@Q.bCN툭nvl!,++ p㪹kkKTi`ND;<3-$RJ? ;@?tM(0$C;g=SG1{/ݭ CB3X=0[1B3 pD%qY<8lU}zBl8Wp]pwNvtIDz rF(J@hÖfG Ƣrx)fu.D04102ƴ0[<={ڟSmMm:.D88R ҀjBĢRcMWdi:e#eml⌜{+| hc~MDyZ=pv'+pzC:\r !PxOa bf n=ܞx:z ĐBGTvKsa&жhII'#T(懄sʋ*ܐ$!PC3(]^ /i!԰['Vͧis7`gxWs<@<8Y;re˲Жt:Х@"Q}C``y'͟^Qfhm؅mر-AK 7W>/kk{" M, ]XlHVKIe2RP+Hy3$)& hcR Z$<6BM2I#,T b## W"ƃ19C h9O;5/K^6.-]%㸽7=-R$l./o,X9VQpD5 9"c@TѦZRsH8bKHvNPC!*Q `$eBH v(]%4ǖtY6U++rI]-9\RGh <\}}N [fsZNqkvDy,V >a,G^J! =ݚM[s1l؆z8_鲾5n$&rv'9esgEnʭ/p( 6 B/xݰ<=?FuU CGJmh =%b X$qIMc_tv]]t[+NHã,@$]D zR@-3:̯ie\r@ء}hBRchv4=:-ga 1`+ĺ܏SEE]?LNǰEb@Ðfeu $ͤ,.^X = xu:3n$ԗvkD#G-̏jV%XrO0+dKlKm>_e2l[@HCj }ϥm:8d5g\ U[74&*g\L~$@ 6%6=JTxbO\]l5r4:/݋; ׯpԶ东3+J4AgJ*łmʃxvq+o3˶ky؞sPR2+8n Έ5~<~?5dDldoKmI ˕m>GLҬ$E8wU>p+#ƀT=z|B&@?)7pqݝaH$^a\5L?sihrɲϤL0)°C}`lD9A),iw[Hڭ~ +GK-}I 8*A5b3V!OhqD;9/_!j%ՖADʭa6,8V!ޔ\qumSJ y 9 bL4nѮVOoWM}  W!y;1!7LWF1PK!G2ZIc90|pHA[$\4cpbyxңmIGA9X${fVZ3T<+T#{KrƎƒ&i[DY̠,>=%yE_^Y}Y"DtEbNL%f!Z,TzD#;ҵ!]tS/G'fvj drCBB)Je%6DmF2/ըd܊"˳< 5 CbI:x%bMv6-+ }Ο.I)e:l .}nhXw]tC"Į \ɥ}8Ii"*\I>}1-7ѓ\nO9=愇SN!1yXh+%C657k\3jqԮ݇gNJSkM&b{MF3uMuy(z 1VU39A\l=Ul-=ø+9!5t%rt^/cReS")0 ):\B܏B8>!{ԇ۬j+yEE'_m %bmNazv<tF| ߆ؐ==^\Yy4 Y)Hb4À%""$L67CS";D>? $"=iwhA5 -h1!h]=Xa0ft>T3pӶ;ky۳p./5ʍq1v>bNSz>&OxwN^]="B]ֈ]b!Ǝaq{6CNj M݌'c:`Y)hIJ? &% fFrq}? 'Ʉ%gi.t;{Ejc ƙ_ThȱSb C>ܜAڥ3b\>BBv ;pHQ]~t灄ўV91!W?xa4j49g+3&"33iv!jh1|cP0Qjc$Ƭ>CBE~,?_7 f Ę(|^Syo_4)*{2;|L)td0**4l &b3OM*)tv;/^>,t?;ҙ0)_ fAh/~}3)G' 6&ܯ$ovz]sv\*͟c *,ϱMI,NǸP;$.%nEHH(% &Bs޵kժk/j ı5RSV\sxi櫾y ZP=M1P$MBtcoqB.vh./-y9d(BģuapHQ),ctc0ANd;krNl .zBFu;W.l(9iGv_"um;9PHsV8\ݒ'>f5ۑ=ܴpla'a?fC1B!^ {%%s􋬊4=1Fri.j2 ]uu{dQ#_ M)JD"dX,o[B6d<ۚ~'# 0H6yLdWd2!jC 'Aڤ!}&5jSo^ r΅lL]A2DŦJI3]TS̿ihOh*۽L"GZT \ d<"Y(Eve.[1K&.*h9z~iӗHȋ9my nmoGK2@u8 ^ߡu +(JD}@|W oq)w5TKXa ԦCAB qYˀw"dhFY} Z.uyi#>'ÑBNiJ owV['ph 2IbF|C)\j(P;RSL92*lS7׬ǖ>N\ljËC5Mp ,3x,o _J~wpG`G j?-&5>5҄Cv$@-,/lmqR2dJ;o&h`e@ k Px+ApeatͦK'6ɨ,|jB~JyCT5|[ђCt YmqB߾<%Z.fp6Ϟ 2uq$;U zv[F8bet8F]0XVT0 {(B]"ui &),4d>>GCOBv}g_Kt:NHU [UF4p ˠ1-Ms̍=vVgh㯢WddNP( ܸ'R8JxX& ^ ެܫ|}KH(2#Y 8~I(Jx&)rVoYKsF")MqB//vANppnNr=v?g~2i#J?_iVމl7.^54)n {w`S1LjYY#zE` SY"sg Vb2(400(]>EnG^|&۷Ȑؙ*l""`{a@H0NDG  l:{nɧQ:G?*{8 QN")զwx4}Asf6Zd,m) A7&/YԸ9+7oiNt |AMRp twybݛ7w;٤xKO{4Tvl !ДgD9!CqWvO'ޜlg>gXDԳT .hnl O% ܝ.$/B {ËNjXbvw]?_q{|-G;0ɾf&k\-'y&h7L b"V-ۍыo͟UUp[B2,賧G9G$hFC5zP;a`:~}NCAӧ(K IqV/>U3:&S72MXmKuz{&E#[dy& lj[5O^;1^Bbǡ 1L? X pqʌD%Lm?p3FXԟ'_jP0ЍYLo8 (#1)7,%jEJD<^<9Xi?$ͤs{0y|/_txs!jZ֑.qH@;lbpXs}MiArB &0&dysYd ydB`mkC 3X0d4e+{Gt!x0*zeZ`)}|( fV\UanE9M&;ao;0f5E'^C-wS"UA*K-'R/6^_Vgp͜ ?5ߘP{y9"v)9!3¤~v设7aBF.CN _r|~FZ\.꒺l8{b R"s0Ş&"#tbZCS-bMP2NK7RBGRC(YT֛_7G{|\mprR԰y4v3Ex2lrN4&Џ8L '?ׇ8V #&i&ۓd@r=x"R/ qA6ԅlpRDREi4ZdS|}g ~CW+zv_ڕjʼn 39=/Mcur|s! #MoLHYCÉD.% A j&i"(9nmOO?/x)#U?߱v)C[H+}v) 5@CFr.zO~Nџ ]WG]]R⼛k( 4:aՈ )`&03p]"'{g(#8b6i*x> %Vi'rw :!fU]뭉O6vFk~^~g> R7 YҼٮWn 4S6Jm}+Jl&ɔM`l, sM-<71d}0a8R‰M8-}9vqjM20^ԸD UԖzӱaQeʇkS9bQ&S]uw[ڱ+6͊PEDzYP!F5rɮ#nhQ(9J hViQ, Ț(I}X=\`K?kwkaMMZE6xǷ0Z]XDp<҄vc{P f2)` b]haKȖQ56 'd#QlaaS@Ъ4I\]H\@9Ao`Km|3jՅ:Gٜlr܋G^<1/b%^ 7[;IvY(6%Et5~oFٞ/Gx@O&S˕7}krciv)=Lz+&a2/jxiFKdV﬑! yLvqɊ8Y^1QPv3?#%Rf~bSnUإhPn)\A!=ʼP@Ք2&(,,L'A^Oo:ʛ;NW۶e0aHQB9";\qRs\,TsV/(^2)&{9- y"0ā,}>Wo#=>KO|JnE (!j~;ɔ9/u䩷ÍvgJQ>:زc,ÙPq=HH9GsXb%lmKW*EpDg&bIfv1JV=ConɚW[b|[7p}c,@8%d=PKdSYj i5=3r-l.Yp¢績~D {_d2q"@`l&rDq&)- Y i*SK֥]6| VF`bآŮ| IDAT,|=C5myKH{=BI]#@#Zh{=UfDp=P(2AM6R[~Ա]n a6Y-LT.74+xo|!_kcL}'Jp5a9)Oe%ĔzR9\U_">6_[IR$KxJXo5zEe"r!:tx:;:(zf\hNfufE:sL,;'nt\6 wY/ ^EJ;ѲjZR";X/~ .9,XZ>'Ȼ)1a:rmt 0zcV> r;FZVhY!RP$jc=<fKQՄ%h~)![h)%g!Yy >_K^#o>L~lz׬v ht]U#}Y&x񁕒޾k뛛;W z S;]fw=w& [|ZWF-zl%#&rZVSPT5!q.t֦P.)[v74Xh6[hS4{\:,.nSAL cj֨ogpRDo"ꐍōIb*r8;vD̺ ~?޽ pޓe !׻YbI7M''Ѝ-"{SzHFMsay^-ؔ571c21O'ؓ4b8E()6|W~,/=ғ?@~g R"Jr4@Khx)GDijqȔg0Z3%Pv3va#IM82g zsr8q@ \f>?G~3Kceo{Rz1r7рWH鄛R6v7&zI2F낛fg=3QGUC}{o7+ Vy![4 =rѷYfpww~odc%n G~}NfFsۙKPТ=rfR1]4$.Vk ,j'2(ԶXdmr < F 2[TYCnYR`پ{ ^xƔ0s1qBtdj/LHI.(ua7Vf\sRɳk_snn~7G; # !3LLjúٰ]|uV*ӉђRO 'ܡ:1xd7i"i#8pm t*ۿ={-/+ lR`}2i!W69޽E?B{c1]2N ԊLS 7`_7i 5_Yۚb!ƨCϭ\YN-`wm}[n]rTKr}eUrk/OC 7Ns@,cR0:GC7+rMR.'<[Vvi㭽p}U2Բ.(e kD)ApJQ]KĴMfũf҈o),ķ.\l(|aT+pαNd:,( ExRp78a)W 68b~{RѥH7~=]lݾ׻?Il֟bY |E h8EμEњ߉CTuݧY7h%q``2 7R"xMЋi_Jqv8AkB{8h`eJ2%Kߘ1`2AE`/xӭpC QZӈt5ƣ]NB6!NGFڢ:>{S2I'BDbDL1輁ob3h?}8"$k&l8[=˘L|{1\(dL]+ZBm&}g,7H9\%ysg2MdɸP"ERĭ/̫4󧔻=;I.YY(_?9Y@Ur;C9j6xޤ=7 PzM]T4#鈈P^efSmy\q^5{ mRdS6,%+ >{)Eԩ]N4NLg#NsWx7k4 "3yL|AJ&qk <fZ`Ianl@VKh̸3sH)q^>wĘ-krqN,{ rêl\mw jD N9! 6iHɪ$Ի}w_\߄_[G`=?Ӂ'ke*d'Qr}NjGdx&;EĒ3*1:~Y,ΉL+܍צ; |5U%ɺS"Uh?b@]κúx4f/l7Tz3<74r!yK$z8k!X,x@f 7/ҒGVgPV躶uii H127{Qύrr !jOM\Y*K6yʧ#2v |h frMz!=B"5nC]mҦbAk=i P{x'g4Z JbJL.x/K0!/p }]`BBL*0_앳 ? %qtB!{4͚tpܝWt[R 8_R Y!XO3VbL ɊwBMY.8V>K63bV8Ęz9x]~OA+3mf܋hՠ-ND$߻ YolU%9zejzHpHt WJqt@ܳVun!uEe?9m-r𱕤vnkѼ-zD31Y z; Ъ- s+c]$%eg١ B٬uC;̊}Da}Z]ǁ8Txo*5WyuxK,KbNVgK{*傺XRgՒs4܎G8QI  $4-Θa<@1{wvow~7=x"ZD_;ӟhCm'3NQM_mj 4S:+fx@s#@nGV%[gР~#Odh]0(F%ZY/l7#Jk(\L2:q(y= ՈMgfmcwsIfK99@hd4ZyӈiojD6os[V C<)M$GkqwDhmUCgzkraB8p!޿"zRdtdNgZqv }&NH}7 i>ې 4-ga5 -mhʅUIuYp, G 4{8 &sC@H"@}V6i=qDD`*i2͓ 8mϬԵ^5bLĴX͂УKbw 〈Eێ*醣f̐ZbQV-x"'g=9#oٱl.pS pd24V2w0tʒ"xQe3Y2#{"'\|G`| pN/q*X)"~(,ۓ(fgnSd)6Ne쭎DC "yH;(K i2PfWVFz)"&a?O1MsH4VRUiz_0!baB29woh~^^"^X2ioWSX+Լy|~)G]p; V`D#ۛWj3oB?%ĕh;1E`wwf/fc w0᳗p5zN"kt{<}m X,pEa"oSIXشZ ElGXf.*,D$,{dM?Ndy(gi/DFc(ZxK > 0o^k4%C ﯨ c|f!G4@A3hrRhD8 /-rU41q`qKb}JX,7,gl_?y|}? {?9Qey&UwJ:Tx)gЌ'`O^L+߈xOJ{~{RG`]\2v+`QD&P&H,W CCy0TukV4&g22utnv,% 0ԣCD$狅핦ۥж[nSoW)!!hԲ2eSc2XZ8O~85r~]lfe/̅jųYԡLC9D.>K>f(>v8n?hsn,u q/Cn:33 r_|;pw7S#\˪}N].?(d[(LfN LgթVZri%3 X=?CΞB@gdq֞vB:h* AsQ-F:pc/Zrv|dŧemmABMb4(oXVsV,O!{!VӅd ٬U#l1T3-k5Ղ4iEe|n,Əx~Į?ᤠ.Dx1⽣)kbE#SC?'K΋&*3]ΓrtaWGp{%Pdɉ7pL-ϝZ*FA8g" m`ʺ4?Y{.bސUs53"Fi3y;&˜Kl_Evf~Z 1M=T3H,jT %ȤY^ Fje{~Dlp[rϟϟKKSs|hT 90k],D]Vw\Y68@gqsx

~,ljfL٦7~ =F% =2KQpa6 gyΓn<9C\;-grm|?߂4gPq͹e:@otu9{.Eg9UʼnC^8(t0RxyY7L^ gw~M+XdŒ\7gbڠ;SYz\˕r[853: 9;Cmւ9CzryiEޛ_SY}fww~=T&3J 9Lس\[eiв]>4/+u&˹5@M4l`q<}ns.R_T_鏭YV[{ә✘ysEa r1/m%jɭزqMPl (TUVUf޼q|qYm_ঔJef܈gk\H?BHYfC xz5'jtl=(#^`:CB[eסg#ŔW;a6 ȳ*%AUHfWP!S' KI|JlTgh _Voo|yaﯟ{(m9u_!D/DIdCb852K4" v Ye%۾Éaj;)FءD̔oy&E FO f6tvƟ! cxE:2{/'vnKGNpK56hΊ…` h?{ؿۿkAװ. +|l|e ןFgi[dui(d {A&CNMU\1ޫFh[x:p>E׆7 :@I`|dEp<1Oqו9 w}﯎L%0y~W^p]N!K͚xxsHl϶]Y]rKޡfN}.bHΐYve(7d;U[ܘ 7hW5-.A\}c[ ͚4Q7k%-md@ -'wbn_XtRVƤLضRLϘ"i'$?c97@STRF #BV$3 R$ISmIœQZ0 d>t-{?>?7>fҕcMB[^k]6rڊns6kK\m/dva5-+S)K^^O/؃[ljEA,&F9: Tp3g(][cwQzvHԛt,U88\cS3μ_o^gI0=|y.o>!ۥOt:C4-|j|7GA w*z.q簽6`j#ϣ\f82Bs3 y!~D6ܘq}}MLDp!jLОa);mzsv2ߒ\{]-Mm+O8cgN-C,DS pރSwIO2-d]BDBc˺C[kSbrȱ.quB709D'3mzJl87qC: t],\n dĉ$3%K%p 7@D M]$B6-G_ v1:I^qNL9_>>< HPGĻިI|JclHCvJMp.5KXTxB0tDBc3w1N[jGyaoT~ۉriٍ9F[g&zcд ˭?ZC0EY6@XX@>%hX7F^|;ŕMkLpH5 tFSN %v52ԨLW^!(Me۝h3\1ڧճWd9Ct2_=RۡU{H6{x>yRܡBv؄ +?4o QO wblΫ7oZA1K&zx!6Zmd[P x{ugx3.'vT#kbK[I5@ԧyLrྂ+u 9)!(hY>^ް|DĮ-7|tzjbC4zqS!MsrvMWt wD< A#ux$g &us&*/kfX,j4 mYH7H HߨC ΔNh i8GX\^ [\B/'Tޛy04R[ΎX6VO=~Kxv#/jtHlR$`^|\TښnIS[E핚Xkк-p~m :#++ؿ<{&[4A5n6Up+/[HSAo}Hd<~+]k7[{cS8˧pD+ə;([4Lk{N$hO@:(KzcYiAC~uf'!x4 DE <(ڿtǺ>u!I{I |]WѦ.&3(72D(wKݹ0~2u\=CV ˲ .1C1h1D6"MeL1إ%Mŕ_CHA3 _9K/KbڋJ:!q0҅}-B6!T;]%sА(}ײicAيWWKL4NK(OӭiϝwB&>:m$"x')|NС.!G;w^n,wK?~yWωtDz(N,E](*Pol4v奥S h$ll3o1 Ya㐪BtQp x5;+D#z$poG^R"36SC&]RnBBmP.Z6fp.E3nm3#ږm? -92^#WC@^}/2#$ˑr<| Y=S~$fn%޼aW=޷0r Ħ=mpz8=BN^d3pS}T =¬7 3cf6`lSd=oNM⟦>wf4͑CdӋvy,/KV;.;{]&3\(X#$IY\>vɐjƈ,px4=:frn>6\n^'va?D< TmIDjAm Ձ-d,ji?)"1R F b3AVwtBהx 5s6b|tfTxㇾM?4/|KRvCÑ8GBphbGs}FSL<xmr[oo?=/lUbGn$]O L]6k;{Y!f3ljDIGR hJܡۮؑc-R4G>U6myޱ0HGI#RwA#N;g$bLTbkBgayZ'm)b|hM. Mkϋ~gS P%Z83h@5lmc5mukS7f\T$eՕn|Nٴng$3Ƣ].92ܳwgOj&+h PGd|bbb/~v\WejiЙ`bia>}SNw ^XG쬰ԥz23"Tld[X~&rY,MqWE4)װ^ } x1C^r ,nŵOZӇ}\)ժ=g@z2r|NOᑍ};8u]\okÉlSt78 =;4:$,}]fg|ͦLgv~߶4BM,дSruW^>;}.I飒08 Y~W4m4F`̀MIr/xdZ$:$7nVxsQO*: bш3Q"y{;ZHEt&* }F {ֽm7f$l74QzQ.6d2A ܶEflfky.2 K3&s cȊғ'lm8"$:! `#)a9~ Wvyd%d0pis+=-fv C#`ϔ[[dN=[d=t^}k@=2;q;0`9t7F|a% h:FNOa4" qL=n|/-(ўw@Cs=+X6n8{-&@,g6?W9IzI?J~a6 Iܑgݚ-͜:B'tUI N!v-oHc," %RRmo_ί A6;5(ޥ ҉ZQ|Os9.5!E(&0B/6BPŇ:YT+>ϋ'DXvTϠZKc KlKfgƵ MT5LV 誝(^~7هgO{@h+goh vQհZZ'Ƣ//C6 ύx[VcOuWt8Dト-Q%\>nPnh\JDf'vEFS3d|f]I3xny4 g0G(Kϫng{ Blna [ژWkuEM=291|ad L{)Ե֞>4Yg71Ev52wmݵf=Ʀ2r^X^_[YgX`_I{ .M,S<ݱjeJMw3'7[Sul߅OU%;WKי'FC5mJQF Oq=sva9>6d64sf Xm]AУ{f o6KLhEAEkd3fuaQ~dބZ!G4 F3B[uގX2<9#)7^ď KԿW>ݷ~7u׉'} 8$#Ohc~+8OB@6"Hđp"|t=/lyQ"fB*X?ז|K@vؚxlRW; JLRxloQ1bݝF8.i׽4nm@CeJ/ k`r 7&B MO Mi}]a$*ݟY~~h}%NAFw ȉEfTrSKo^]#oCo}VuDK%:9}ǶyQ'cxʺ|l!3(o3.V ȱFȳy9#RLa2B3 F[>I Myu!-H+(FJ$w&K0- [H+PU>Hi,o{G0>D'LjPԲ\oax].1GHRX]tdT%WߏL)qj90Ll ,>E&cpx"%½[@ oFcd!v;\?B-m=Gő O1;6E߳[Qn50)(F (@l* E6dt2N- (MDpクg>~;~ׇVڮ !xqߏx+lifOM >!B1Uz+wMn9bp_}۽z^ܞ?WQ쮝]8V}\Gn ڶ ݖ$QI-%д;BkyW8$6&H@>e7{LfF>`]۟yliX4fe1zHl$ptIݚ-PlWWBѦɼi}vw^jk䅗+:š-n >dH"-rpLm _}Ʃm}x(K\1;55nBh7s|2H.ρGvOȇhG zZ@F:!- }|P^>+KFCBhvkAo)p8-z_:K~~?|w| N$yzرz{2Ë J4xp* D/^$6z_=}4 GEXvzm1@>;˱v& ۽zj߁u]\4C_:uw5kSfFr+hF\ 'HD)7DQL% ~źmeM\nRs ޯAEo~Ve&RY]"8NRyoCb9y)獚88=g0=Bϐ5n1D*(5-2gw}޷y."ʭ]Fv[,z7qШg)=i~S!EqKdvNّ>3/lPnPGFsd| M b@[3 zh6`Q4ϘXQZXB rtk6):(q*0X\}+WЇo1q6,$"}^. 7W]u%`y1`{c]W-K&#Ɔމ|4kaz5 Q+33wx^!)Fx穗tk\6dtt 'H%?ԇ=Iʧ3ݷ|5"^q"&Ő):v'KM줽D*ƭO"ɶZkwn [^M\4k;`]d4k4=gҤ GjM>u L>-r =0g⊬;H t vgV$ҕH6D.ۭ,ߡGwpr=x _~.9d 18G Of@"լy*\ 2 ϯwCwc@ :XmZtWƒCKhV8ʹuXoƬ33xdFv5\<ZdO%UޘiD"xN|@F 2ۥhX@)x5/oޛ-2A>9zl.,7IP}+䋧M ^0>xƇn8`6I+;: ]I[.sZ88A_zgh1trb{fFoEk&8mû@ݘ ~ARKǗ)= ].h:I6^/T.UsA_ߏvd&˖!`{Lu{ D\D[Tp=4Op[D^}':gvF5!h$6]AD"*˨D"̌;D;4|]kbF~(v_@:44FBj4`TjnumH; ܌ 2:`hv\3_dFCSFCr|d?"&cnn?sB19z`k3f  mwx}ibI0@7Z(F9~STkXnۧn4Ər|ۮ.-`st D57[,,CCc"Mk̒riJ$Tյc󋅩ZWHN,b98x^|LLR `gv431PĊS''ɉ"{;G;%V;xb;hu9U/hn{wCsm3KD B6Ir+ y!Y3D,8%nM6|o|G.n]"̇Ι|}-;QU~Y$iMx>A\;)QMvBLm.7G?s_ORƄs&⍜QnLf&kD҄b7 cET57]6f> ~v:7bhqrd#gvYm?)+ nqvdX '+1\[g7_Y7=6KnL,t,qm{)yk^3no;=WQ<|_c*4A]N{/\{/rm f hFYac#`ݚM7zbOuf2 ڍ GSnaf#/m.t|bK.FmZ.R;uAf;35]-aWԀBAf>гĊƩau )߁K(V86ud˕at=G.LQj^יѻ|0- )+:>4gQ؞q,3{3tQ!Zxj땃(Bj:=ݒJvt0bw$YF:C]il:ù$6Ns?k1ioS[mpND';f>e8vA]}{#YxlgێψD$jG~~ۘ6=]mDZýSд+,/ߑؚ ɬPS?E"A6KhhkX;cH!B:o_LOmT#wqfًl$N|V+CAC}[:89MvA7))HA!}Xa߫4xr9C\ݠ=d8lw_ءɏm4N%}\R`llDf\_J!6'Pp|5Rz _6i^ύ#YnK?-a@Ҥ#~j-QKvي %8W#%["!Ace{r{=5KW vnޛ̿wq([b)kL2G3o⥶5RN[Zbt>5Xm92q͟pfDE6 ݮlxnHV⻈)Rg#嫧.M.ޢz./q5V$vb@4\w_E٨*]@BaiBݒMi<ùtGGjf44/3?-mxyg9m_GAALJlGxge. rkTBW'j'S?U/Ca>/R)WcBp&#.A7HI ECCFO4&<ۭ!ҢͳU Ct=K:r~[>«FX^8}-yܢ';w[dz&;Kn>GFakq{sWKd@(29{TktzPnvJ/:Y=58;3tv{H.q}ԝ{tcoݒB #佸"p_$/Zt4,hY07gƞX!ʼnsH"nmS%T JlH-˸] ˵vM,c9Mt~evUgcN38k#xre]9Y!M!?1HCûۜ6mesK.#YSw,MRmq=^q $ĈVF g؋ %MЭPX2\7{ ͅ[aIazktѾUy#5"Ȱamk3.1c#;vm  Y*2a[֥98FT3 y bcBsmASmKh ΀Դ-SX.lW6} l&{fW]bh!n6D\"v!~nĠ^&v^z}ֳU({8fԛ%bB#M}\\5\4?Oǯܯ}-O%yݒdD?4*xȜ ;H%vo3$$Jזk{ןbTݘus0C+i#$m$k3Ң6 u\&mw6t1^$bi7N9ZqH}4I[?ރCn] 9>A'3=+v"&Tx.C7`~.Tl61AkvE`"5% wA8@N {` 7O[6 3Wm '/^p W-F(1i9}T\h/ՍAқ'0g, t=EMI6KR6+N@FVxBc&ﶆna ۥn1r~'l{ۓM@DoްZ/CY'G`U3 Mk#|R>Cnº3QEy+1,Q IFJҏZ3#meB#ytky=i?g"M;v8iIH,ꦋBnW~ G>@^"u+D`(^đOЮ#v[|ׁ$v$)"TԿ?YdMmI'Ne,MIus] ]m~?=\߭ =O߱8sz'j?a O~ĐRcA9 tm e(6]om8tC9$GJֈOl/FFEYZ|ۿ i*jcxT[dۚ($&[c & Gh5n痵]fƒ;0އ>V6]*ss{^Y_5Җa\Q;<l̦hg!wEќ]aszƁm5cw#/|ZrWkFSb617$A"/ L#ld|hrJ1._Yb3ergشfgb+5E<ⳂbvDB(3 |J>;$vjY. MHDHT K?'o~7($q2ҿY: tpa[\/ }g+yd[oݷ菵/=/n [,kƨ:ъM%+!qia4rMr b$b[M/5sI_Լ5Ĩ[0"U04K& Qߣ\*BBCk.Dj.&#;,{x`ψ#-lD5EGcٝ1n%q&.t<@f6~I(,Ke4}xNFՅ"7B%$;hF2z.q?!Fo1m;Y_,X'hXZǁC}@:!I]JĦ^5[+^=p w""~d˜D\aNI͍EAmSv yiު2kPWHڥ\@yк) 'f-^!o)KDaw}F#Gg=v"11 FpRcU)߷}dDzG2׮"z!m6 љB1&C4}sHCvt$:SxmȆC){NCޛ]3ϹֽfM 8I 0`D-Iԉ"E|mIHhuKi%Q1Qc  q\=yg{ϭ|mb\ws>^{3\+|L>7?p'~C?յAh'6u+˼O;!gYNçM'wWܕ`>4ٲ^}t|?M'?1R&=-}zm{I]nc$GV&v:iv&Nqf*ŹɈ>UP]nqFxא#3Z/FbOiasٹeM w%L '7'}?<Ŝ9x:AnوK4lt&%QVsrnmϳw} xHw Ԥ_BvoSϠ[p &/G5sss,R=@ҔQfCx ]?RY4&: Ibp`qb98JՄ%i'DdOn .4/LbVCS.Zo;6rU$ Zf3YGʼn B҈3v'IR?^+i\ٯj.p#,]xt҅Hs41Eg[7p6lD&{6rz}r+Enؓmؼ Ff|wɦ)W=#r?xq RNllzCd+h97/6mU\} >h :{k6ݻNK+ދ@ݷ`Н)v2hiyq8ΡM -tBQ;: SpSv7(=޷:ȭC^M3{_2h:n G8F:;tig#^xɻM#/Q c@m9,fTHԠݿ{E IDATWIUs/x+xE:e_t+2d]%AGbSR:mr<]T;&1b0^Y^Ó3?`}֔(|s+M)?k?j)QC22&ߚɳ2H^#rҨW-g?i~O}ROCak,%|5MH"q}fg"6b0JUV6c@ѹ]rK-`nMxśgr M;'uI 5!Lz+ d&gĖN]_ K8:L~np2 5nL\0ٶ8jDo{0L pxoؿf;:@0eQves&r,Ҟ$ࢢOןm"On )j.a R5^DxpX;2u9=zwdŊlL \7f0`X^CJtm(Ao~;Kj Amc-Ɔ Z v!;\L̴\}d%>+|N}c?׿bN;Gh,qD F>u^7Oehڿ~o(%$I.ژ8]k7>w܉ sHox-\fʦGD[+zqD'DgR8Mk}Ǝ1p,6I)BP&[Ugnf"uɨYtmLq?vf{#Ѿ3ˍfوMS̾"7ӱlKN<|]&+J3aYwF ~)J閧]Pb 6Lfs4/q%f]چ1hx0@|j)j[h"]g{L68&"ͷ >M O SfKA=JJFn X^ִ0:@sBHo%kd8ESKv-wvn"hB[N҈_q]ܺÍ l#,pbY3B'WMxMbn6V Q TM|\^2ڹ/GhEi ee?/˟ s˜dr5.ËuJ j?_{C?ff뉘Oba>4hɉ)Bo?)|SSh/@#umԋ҆8V1nĥ%C`b6IL2OB~+DMaRGZ :6n^ 2d8Bƴ&ospq &v{=*DDDSJ %zx\SWMza=0O-<D/T}G}ۛIӐ^n[23#_@Cm"ppHWӫQ\YC01Uuԝg&Pb+u*+S3s Q)a-yX\XW9_h}a_ n\uԻ*6 $1ZK0LoK9 : G&m H,ms.Ι3npm3dqٽ>05Vx)YK$efS Ө.İ$P"R'szͲXTƍFKTKKQ5$i Rm]#sb s,g9;??ؿ>Woھq̹Ls侠*F8'D5jc$KnK**ͺ9 ]o?4 OTwC446lFyό_'c@h] bH $[&x'PTS ՘TwvBG8'ֱ:VY -[ŠoqF%"~~`{msFҐ庱1\mf98YH(!?L4rj w!;l_'..а6#gF@9_E W裻,  ݛgLl#p x~HwhU[{_SFX_y>22{hcݼ1d&S; 8TZ#KIZHк3oS}xvq),c1Ek%>tpy!j´z2E Uu䡱J׭)3 |MoթkȨzvQ=<=D3$tݻe" "?B;89/py6iLrJ`mQuVFg͐m)۸]Vk4FfmJC}\!0:J&*фvy j|L_k\?3JɜNj',.}Z*,=1 R]Hۭy>1W?oP!ՌhU,niLiU4 uM HiP6Q7b K#.1Cvm\"3Cy]JR+D?Sq5 AՖ;<׭%rAVՔўW @r?/!ѿqT U hSCF& ,8+z,-hW[] غ'hkAR< Fg)d"> 6f8US멚o0=VmQ2a3y V5*aƕ>3xqGs}mC[׈z?BbC+<#S0B)j-:kV #ֵh˄"2ZIbj3<;t t2.pu˹B/ Yl=6^qQV\ۣMBZD;] u%upT{ =?BEQ ћH}ĕt/LzSS`yٽ,kXH0 Z@D-MWF>5"}=l8p㋮{ʢiV+d~;;C%f\MQn4|LspEd `fV8mQxf,Qm40D Yf[vKpyp$NNlB{+Zu}C6 ~Icm6 u)}vkW3䞲 }K  Gیo-g'h&MUIX(&Su.v_o_{] NrywӦwFF2qIfז{Wk~C>p/l?3 am "f @៝nM[GCP9QQڄbq| Fc$Hq9.͈m\)ƞJ$S*ݚK#4'Cfbخ誻riHٸJ"홪1Ϗ#Dp~ 6L62$oθڛeq`ȥME.3;B{ h\(_J1&q͇C`=n߯*\ՙBoe/N,539Fõ.K>@hhfn:&:Xbvkl[X!.MAG&o"퐍-xDF"goXQ*Kev^{^$ĴvF HJk]twb4Edt+մ"-ڹI;:3%\ߙ0]Iۯt[\M F~Ź"`T_K _C/|C߅(/2'xqQf}!/5/^cRgG6[6k{?|m+bJBnz$Gi53qYЄ4mފ!䅙 -.q1cp{f)ps۝hF]]Bv\Y%?/LE&X7JhsBRMm<+kM*.ANUKC-ܻ< (t}OY-o}Ⱥ|' t!oi !ƗR\&#/!aa]@vAK\>!3Gn٥ }b? ۡMlqٸMᚥua+[  DY:O߃~ VG&hr[rxת#R mKM-1Sm{'Fjd΋C*MeT// 6=;߷j7<4v 9Fϭ+3cyf>)@_[P гq~ c$6 4lg 0&!`\!jH1KMB{n: ffq GՀ.軖M)8G9yO}xl4A `v _GʤXߊo],١EVPgѮ !Uh Q4]]_'d~DBQM[KRXa *1g3Kj4 \W9*=~|e -$_vCDrb{iݗq.L~ePa"{ pb"plN-1EXѸKEBTclhgi~U*V +p7ui=0cyy`AeH ƛfȽ*3*C8yG"Cmd6݀҂98K h0 ɔRmF{:u"Ը s- ןc3d W ȝ ,m-xth!1̊{VZF/M\-w 5tq̎?@&Y6a;/#]ʩE#T;\جDe@d?u]|q~ug7 jm644X6"=HMTjfQqhݮu oPL7,F17kM{r+dM_%^}S_"ٗ?7}p">>#ϩ{}L#hڳ CF;tk>c}WI [ a$G,pNM,YI>B'EC{ F:2w:iף}'@y6V +ye^CZLָjn%S4DTi^03&[AMI*r5#Rnacyƺ֘reBmOP9*;T]™XnqsCK,H(p{НZzȶlT:Cwje bs;XZWWLi,=hA臖5x*8_Z 0~ 1>vXh۷o[[au;9 -Fqe`:5!IX/p%<|8;Kb-35SM_n\Bu&V`,7As3D`*vB-p,)u{W"C '͆T 1QJEҺ##HA3oY装r"2󌠑UA}o\JD bKg)&T6x]%(]\f`g_g_~%~Y[& (]bdNeA IDAT[UWOm_3rWbGXb4$wh^>mB^J3bיt) [)6&D\#MO\XS99ۃ]*y4IQS51#Z!@7r`/ʁ4j#;$eY%x+$#-w|%lWlLۙ5B5aj&[uu`˵{?~+] $l7 &B v}af4|9w7L#.(٦gE u*ANb #||<.UY 46m:ȃ/BԉmT@ỳHT\ZDML.؁令E n`z ?0[0^ѷ^E| eFlq򂆥\ Mmm"1bi"=|tsMSxq^"=cZ`q?]khLOtHwנ̡g?!2$7 +sdr@,7,܇rGoJ'?\sHT2"y2g[44hA59~v y6 s >}=!-}ѶKGIחuN%!)"2r1z!Y,*i?>)?_#[KHxI0߮fe#rdEkВ 6rk[Xu:Jn ;Oך]cJH*-%}H4R°3l,RCJ N0doo >ǩ\mt~ Yu@g .-FhV_y"n(v6B s`TcA H5\{w6Eژr#.!}Zphtf?dsH ǖu%\FR8t,.X~dcd|VG!Zm٨(@ .9lWm|E 3d/@Y߱1BX6H([6T\1X\߶}=S[Bڙ1GyfXp24;[զ "W3+ڋHW%Ypo{ov[HDg8I[\-Q:@0=nNu14[eH:S1p$@6@](J5#,R d}֏9b6HB*Sp Y#*Dp s:Ed".BlZm՜ vX<0A&ibxB_/1sˡsy!D?/_noҧ}[ky ʦ]҅@ԫ;d.{GXz5ow_ Osa@E Eh샶6yartW_4k c9:Xd"y O,/8PZBq4W&>;!7C2*suu%Sk"CZ7$dܫsA#w FzѨ1 )3E@ ihLDDE&K[uFqLS8=A5o]Z5Ɏ{n`m v!ݨ$ԩ۰u =:#|#) ^Z7FC$%$Jkg;Fɯ>ffcRڨ[MM[<7.hai_;ԏ ߄B[huIǫ}Ó̳Y@UM=y<;tM ]i]Ds Y"eEIڤ*Ȱp m Sdy4JͨZ2?Qm6x\9hlS͑2 lYغ"WV!4+du8GlkB]{v ~%,9lEB8o+ښP/bk?!d$Y>C=:]ƘjyAh!ڷs:Glۺvf~F>30ԬIk ބCvoUe.^QL1{F( {-85̬v]RڈYaԲ] 4K?]k6u-ZT8"c%8sN&sv܄*&wBu>C6`VCOP}P2AcSX1Dl-!tmS vЮ縪ܾf?o-!Np_fp7ZS_O[+'3'8=bYm}HcUmD CMA6j m!ae[0K6s.`}84;ܵYLRBDiJ62,7צ&>q n ,}gJB 0* 2 8]LV/ +:$`H1uZؚly"%ۉː(_O쳴o@5ni|:4^Zqt-pvraŘz|1F:$DdvN爋:pw384(]\1 51D GINvT{.7λ@ΉşlZ+s].]Ty8y%crRF>iCq~O=QIqw -F-ce5Dž3FhBOK,AXNrq.WYRIΧ+kAF(r 2AF;bw|`DZߑǀ%$r80ʺ[t vKάЙB7Yh{lnņp!Χ 0FLoi_l#nHn!;L5ZmziyۺuLy98;CWϣoH}>g]κ9'ڬr&9ֳ}>D3^CҘajpef֙; Ee%$)K_p^<cDŵ%$;޾r.-w| LٟY"$ XUpg(eĞzӲlKW\O(iDv#ҊyԴ3VKVI0Cգ\"d_Ȫ;#mRFS-GAb|ݑ/m4L}nѮus!n ] mic\vRdH>Ter&ayI5.s݂]AQ\|a(Kǂl8y\%wpǾj#ħ?]lu"e瘑%U +d*iEp]Bh\fGďYES p&VĠ)t~yJ"]]jNU2@BH~/}軻y=3\QB[hOF_Đ(Kd0r qñF@bIZ6&]֋3jaFByf54Г#dm8ab(% Di7=[M, ڙqQp$pk!gt!mƦ.Q$5f sq"4# (Ǿ4(LdΑ(%$DD} ĕ=#<گu%P-1JRiim&/ h, c\nЭ.cL37WP}8g9i̶z;{xwZ^{-B"!P;`A "~a | )" 1Pּ͞|1kizg뾮8Mg??_>-,6d0{8 D6{mooGVRvZw)ޟʝ]j;\CfbtI8JJjeq!yt9.VZyav{*J.A{PiWgxV,N]۪q_ho) ?_cS:n /}h(g ^xԾgFk҄+Tg q|iQkzO}֫:,jaW/شWK`_X8 E|0>N2ރqCX?ޮmS|c-'cVNa:|쫱Mj"B9 > \ݻ Mf}.) Yr\b=,{16"j+E4xC,ڝADM IF,VDiWX)e)= /tQ2Fn44Į}&%,^Ja7!gB\W+"@Z$5m몖r$֬jPRhƴUeuՠjZʑkib>bm'4a9/`&581$|N)<|Qj"Hj,,=<%ݽĦ9fw/k~/6MpCg)$!hzJX$MHQNJhrB%4Z_|{ؾK )Φi[ Wh2@}l6{;= }lC{ k(-:rÝ[bHN /@HSgZ,$͆V4e iԮQ ŷҢ@i#C5#?>ÇIFLba6lP=Ō'wxD&a,:+҉rkL[ͭɌX-ǎ0n+YUZ5GMee$ն+D9*%>`5Ƥ"܇Cu>6+3Xwf7bf2;{SKW4Kmس{?rM"~@i %("g̗xj#sQ͒\KQYBTZsP#3he(J"4KeuWptļ9%.EﰸzOQ G}f, e"3] )q/q{$AO`Z#2- <eNZ%C7 J7U ג[J;F3 L<;q}G\ ~Cs!Vʞq1%(憴Iy@06"?Y7rs]"BC\JG)acTt'9 _ bkFa+H+ w!}{N??$F :jǧ뷈ťGsCw IDAT9O0=x*a%n|%YZA谴w4 XASF.)>݇ɴ+ŲDDiƽdoa`Opz3[JhavoS& |#-D({TTXrT@=_@0o)!u$_y 5u LkM>lŹ RC$[;e-U<u3|)@T/*"PQ7ZC]WINL)&~w&2mQ3X\;![#mn F9E Npt4a;aKv} / $8[ q ),Ѿd:ugBXb^}9(avp"kkDnR,-dB,B 扐.^tJoj؉3e[O_Q{FWeD\cǷڟ=t=}yK,Hj OkÎ0Mr|pgYq!pEɑuNh+ˆ3)5 ܱ~7ѝVRքJ a:rc|qu֏E/}@͵VÎb0f=Qy\7i)i=>sj]E4]{Pk漧Ď We8=%q sz~IIJS#yHmTL7G9XKrI Ӿ3w|s{Yqe}f8ML%Sc$ +18n}T~'|GtXڰõXkM~ J2aT ?@:uuE jRZByΑj}e rIĖJ57Nw|)֥vL4-T?,͗& 0J9^MvD[ijҮMq7Z|`ډy{&.E/Y 4\GdU Z*aj4ڢ)Nzo> &u5$~FhQuX>o{.;VġjEA#vF9SҺzOf8>ĻzEW\u{J/g½#DVM/^ AgS)AD\H÷zD[!dώC3cqUAn3ǝdbY\*gK4=@sBhzu?],z1Dc'b#>VMj D0 N v*3U쵯G`Q&R+3L7ūx>V3>^9a|1 6o`&IkTج3v|"pМT\#%=Mbwa",c暈H+@L9li/Н> -1v@/|Q/k˧&)E<Ԧ&q\I6c-#H'oöc-*;tڸSXsH(t[zPibI2Uˆ<3 7Uk4V{Xអy$eq5U6WXMe΢Gn;Cݲ+S.ĵn>SjRAxB Z ̆ޮyi*2Z0zV&sh~[ 5|Y&i8n %k:U1tG¼&ד KpOƪ3I6LnlD,?^`F7 i+XVIJt?wZWKN^5W$W^&&F.%=;YɉtSB'v{["d6.ޓWc{)YS"CEKKދ^BNP^XO'uuiKQ1pB~9ޞr`J'Eta.ShSgV90>=Y=jv=KGDHu͟iP@眙 So@|i g)I5Z)rZj4F1J 2>YNl`[i;ZSfܘq45BhʴG8{Y g4/J>d<`=x@5"6^2JO}rO]\S!WRT- i)FFXSPE!A|QCs"Hvd#W+4ˁЮ SZڞ<υk'b-┴8%͆rxCpܺO{tb~fb XcGb  (y5Q>DI\_lEaPEjρ"2T.i=Ͳ- ]q߉ %tM AvT+K|qoopZkJ&" 3LGݣJqyHƲ9ו yq87-$Hvн3$? _Q%XS] vC{j|jsyrguD'0ڹ\\~DL *5b z>bEE0X-ɰ<\bŠI`5=b$YRM'aM/t(sիE93]jBl_~̔(ť dוDwm%]t5: ZLX\Pꅌ@5=>=y;c1c [6&NYwJPy/#xU`^&|`R,2+eQw~!eB.P rI33y;ƦEY|ʠϽT|ڕ-`} sXvƟ(<Z'h>\+BC\]I{Vtp ~RB =4mUq/$(SF6`CHKn0]U˅w.=y&}UѦ]e*0<S/Ge@20 x#ӄ[Y+ x$=xBd~"/ײ8lhO^6Ot1\>y i}^Q'Z;RӒ* w/ZC=c׿űTwd(VjŅ$s |m>Z0>_smgB ;{X#rHDeCFk&^R38S [Y50l8V\:tMg*85׿Z9sv5탚A3(] ]YL{}ʖ%retDزH@ %ʰUԸsŜ v@ N3ܼM>+bi-g~`:<]r 3EI=>]/дk)y(ce,m?W۴9ttIj&.>*Y,O,Ov(haPWVfxi"־\&<{QU'$ھwgyƃC-Z&XY!ubM#B\>ĭYi[28$yRʇaZ X -|QAiuk|^"RQmw +Rߏ(A0ʼUQD >ĒzCQa(fkgqBLxWwXxvoir=JHV+|qX e#5GST뾖 j8Ou`[Z|{ '7emRB1THw,V.]arS  ;`,Mh=]Z==~/b2J0˴9p|yBH^<9]u=aSI h:Xs"=Jj %Ǧ" wګ6\`-%='-23^hHa i^8yg M{!hlnNݒq%.N >3lPʂ%VZDVI5!6X/}b?|/!Yژ́9ƭ!}ז#sCmԇk&U\C&TJP^$@ ?]c5oa:HQCK)v+Ih4}1ujB!oeC%|85TTp.${QP>VDž@2oYZԓQm/ϕ<ǂM3:h_.ojӤ W?W6e;:]7?#HX㒒(I;R?26+`[~L=) WNH37g ;ǩNIb[.uk=Zz_񄻐Y5_(u`&x `ygJx;ǸB]bh3Maކߖ<6UTwDb^t+cd:qY8l!2ŤBW/uCvc׭tnte_)ܭJԡ=S aMoXDBJI# )Y;kjlf+.ΠmS*d%~]71D?]8YZ"m=[?G'PK+E ^»N7sltW[$/oEַ'"S4(H2<u ы:yWهr(MV\|'= H@P$- P(FИ4e՛ Ur%u$P*ź3-WO MfaEaRa.x83>ht0$J+.b1_;}C' ay=>);A|u&x갔VehY>84mCc u1J<1]7>a~Z| ,̄CHANw&EX4> (ed.~<㞱U2EYs%SsaVvuڥNw=2a _crر%n' yCSM?|Xg4MXc[oJx/RZs gB'WSKTBƚ3H |"U|l;ٜ%Iej3oYM IZgxp !-0Z/%~z!ϭ!re] ={n R{Q\=ˁ%X>xD״&h۞4c[QAfѩ'C)xK,mJ!X~Ų[cK&)pIˏJOhbs椨CBlv_Lp\H7AR> *nͪz-e=ej:rb^"Y*%_k@+!/G-@>aFr; 5mȊ)D܂lڣ,ZQ17 bO.Y>MeZQ߼BJێ[NkRvoaY5`},TIwsM؋W)o$tkAayx _}PN^]r!]/txXa逍^6",ހ=X UfZȳ1:NVh^Qb (۪W ; h53NXJS:uKBMˡSL"hu_.% )KƬWmroVnlJh_:h׫A<7#Xb=} a|GCd`qm@{(eJb!O }OlbB"eW842wry`zMp5v!j|2e|A6#zƦ BԮeA>LX/_^j<W-[y4+Q^CǧrPQfI +JsRXArbyjI)t}O@:F ԟPtoA۾__CHmlR QLⷋp<ǟvG}H"h_+L& L$+ )*"XnX%\|^'rx5K>`>TAFWX))9yRu $a鼗:eM${,~gw8%0l**#X%ŞE*X(oWS_,KPh׃l?Oz .r9Y=r\J.׻Ս:/axqu>PV<r\)SqB=]yWYUdM]GM/Mӎ}'5 miҫ/;ޡ) VMj;7]{4(!,9GBS֙7 q2lQK6@CԽkn{Xx|,V/"[W&SA{2OXHX:ǧX kNib%Հx Q=YďP,t)F[6 B4۸N5-UQrM:~|C{kD`U/5nY@'kh|?:QWTHs[<zN=^vUOvۈٴ#LD(o`!tgrJ 5iʈ U"g~!lmDX~@@LM_XLYe:#!=w!I%@:aCsrFH=ӳDzX bAϨr.O/F(ne#ۏ?ǵc;޴Z頌bRi۶d\Q-Zu>`.c"Py>^ DP#V@iN2'y _L, $PڅByk&hg>C_n W rLʓ"VaJ]n?;PJӃ8u糩T jX cPrQSJX\@sdn),.|j)Km[謁!hjwXJx:(%;`l$#NӞlؒTkCͺǺO N { -(k&X%;)Dţ8Ch7SAVd>),_LzK]FY˜3a/oUfԜX}=8qA>n9Дkhvq)?I1j7I6 <Ŏ#,dYӡ,JPʀE CPѴĦ=xC<}g`DR{-!64KqcIiW_ Hz4NO.j Kp~pz[ڭPM x^wm6jnL)v(B(Cej%xniD+.YE=XVʭ.gԮV|Ӭ= G0k¼$1(I-xBaƥQ:8]5oRп  wVL0{yDk7M=^=)W?KꪃElq_,]Jg la.d.r|Ķ űSs'i J  Hgh2,\wt 7X >q&U ! 8#YݵXϚqŴ3L=VDBNYԿv>kA#"kWH6OkJK~K`\?y.Wuoᮩ)UXoaR-f`Ԙ` A(jGSf!s+$BT('ݙU$̯\մ/:Oa9W}_@_}տMiZOW6])!. js r~ IV|[A~M]/䷫,KPyFBa&.Q\+O=޽LIK7RwSBQMJ>P)$]MS= Qŷ^l$DT0@yON&2ڈ ӵԡڸEdb^ z|w>nײbI:b&c\2 _b*-a|0m{0&@bG\02vz>wA~? ysHI,z{1ThꁜHyH6v@p&P 9)ҩ"[ӘKf[V}e.]0'H  ۣ2@0qi,+%9 K{s_{ 3VAhoM 3RLA9c 42H5߲E{-:Cx8qT$d`g r>!(%YOJ"^N-ܰ:1V@G] Vr8աmd+"UOL )_yCO!FM]`H)Z ;x!Ϙ0JDx*)aVہPVe/%aM)h|n'7k1\qPi7IF? ʯ?OZkהr<]wt3]*?TlnP]v0C sL֑zz<0Sje/SaȨF*F]9t(CMT$"`yh`s:.aQM(.N|]9Gذ\{Byc6"RzY>h8cX@y"%p~͍U*lz6"Uh- Zځq;`z==o_!(Ux?IX$ 2۸-va}$ϯS(!?5Q +W@4EcË7Lf;nWKSz;jA߯eIdfYmG[l9L[Va5aE)5 ީ/>fO2MAb\Q;Ɵ+8~(8C.O_IrIW7aKY;iDktvZV$8C֢R$Զ0@ݠXʜ{ 59]c,9vkPl2 2" Z?Wh`O-x<xv1|M[g/Mte4aZUq?;gx$猭dd_9p#DQ!,~8HUxYc[C>[eu\w'c &n_' 4[WzA"wXD%3<`J'E_Z"'T!1a)9 ' *ax W#P$l_BW .UX+IR=¤dg}=Fyo;-+ͷ!>rYze$fye%+,']`^aX&-d Hʸpc[C67 Fˑ$ʢ(5E\PRA ZO(a4ihɺGX_+."8>CJ)"^ƍ(,B60"P$%*)6,sF/BՃOAAJK@p8_"~Rhu[ά<AՇf qZ~ae4K6\(zo(PQ}>% ԢBoܠHkdqfa28}37Id|`߄_@f Iz̲d35∜{ x6* Hjz:yfh#a@E| mu:=X.fU[jK2s=*Dg zrU -46'q%u=Az%DzB^ͯy/B0 -d 6,Ȣ :lRBTh?)Oag[NICJH 2uW]#dU7zCFn(12AC) ]/hҢl] "AQ !$Y 3͸Qb C@FZb CU h(3+g+d0 ޸ BDKX)0iQ3(چ+;Bx"O_;f4C#)@߆Z&49]3S`l?2=sr:^iP9Yމe N'OHБj{&mB3CE{7T}2yI!y|/3Ixh+xbTY-@q '|E3_ s63RL53eZ H-Nq 6X}F=ȅa$z ДOo! ?\f?'yRUGE#ޠ lyܮzp tA`"ǟwVkoOO&CAA|V*S-j+NYXCT" r~ ')d} Էlo<wP/-ø! 1m -_!94Vw {K`cP9RD(4)z}jqz e# "LW=r(GC{9 1{5k|OіcR0bpw+&K+,HH_B#_ҺLnogJ /?c".l39Qe:Rn!m:3d>Fv$9EyS^b!9y FdRn[it9>pȩs:d2`#\-rhq3pFd+ ,,|l;[fV2΍u>|b& ΧdЩa@p א|h0ZPd  ȳ7繡i6@spzoL۰ 0-S_gȴ嗫6\+$Ԉ=8Aaf .R zgW{='LA^G4DY_?&)dSPR^?Smfz=mn| ~~6'9 2Bn` R+%\Ikn}oL(HӆHByZsQpk b0lMbzh.Lə3# +<ћ" CAʾ~b;S:%TP6 3%8Y5!*>GM|EhqmыJLH JTziV+TI"w eleNDޏ z| UEcT~ ?j3|x Fj:s@ +7ՒB.H̚Yݠ!zT Ȁojqsp&ָ_o 6#j\ñpsox{t=<ȱP >W*v16|F=~{fx Nl۶ Kah+?3&GV lC'aػEJ`"{6@,R m le=>31$x!Ih˂] H7Hl{WE&"!˙Պ(PUbșfH7hO|d0ITB*7Rt5BL +kvKZrHlN,GMTaP6\`qNWGR{B-l} "/6CDxx3U|rVBbp ydxY+ 4~˶ɟiLai0uſM;.|BIk-|+R_y>eU3gX̓*dD8= @jesNl'  -{Ւn 0E*AG0,8wJL@ڂOmN{x]FbQF5 !{ l!"!)g$X'^W{I&x&'f' N ZFVDI +x}Cp;13p{ 'ոѤ^3ϑa(mE h k%=)~aζ\=E".TeDR2QJTl@<"$<ΉF-W_rQ69qE ͐X j6|Y3t|DgsXևO Wxs yGTнq.%soB /?uXtSܖo6nOC F2ߍU]FF4(,Z2*^6raG8ޤ 9!ϏtR1 1eHFD)A3@KVg BP#;`0vC&-4֐_ Wr٠h9A7VW_ZeÓi (Zs5׫A|\~9BPOZI$̰ЃO0n'mzx)rE‘0E@=p^1+^3n.5)eJTC HBqb?G̳nb>"yc߰U .{ gteZaK5ۉ6u"-4(SR8azG[>CN$Kxm_TGB^?7~ #lϟsve;D 5bVi//ai3-[ oh hB=A7@yָ[̽Bhzi0M5+W<&Zo@#'(x@u~hX^C8"C e)_Ak3;8!a~x#X# ޟ?Sg%ݔG=%j{]zz\("B-3ؒzUi㙠eV'& lkPfn9"_GJ T{"|KZB{ǁ~kGVi ])ؼ,]_sKEJd} i\I|-G3ڗ'?=Ey`eI{~_a[qϰn$UxjlA34GČPYA ?8U$@Ҟ" 2RSxjJA46Fi&r()H!ր[B5Dm I">H z&4Tvdu-`\n!B Gaw}{j?#i3TZx 'H!Ͱ?A[ٝgCU  i{ kVӲv)$>ZVvDPTi;劝)վ8AnƩ ۼHL:/ $m0^! 9*H۩ORn k@?e6TB ,O$=4] )mCqtVJ 4Y -``Z:N0]S8c uUliѽkð m]9 }b|.~?yA$fj*2]tve]$*z*p3a#]6vXP4(Lr.9Z%Ŧk%YoQJbs)KiAyYxXsQ!9~$eO;R@LPL=H;p#Gr~]>!4s6~Bko=|3օEA f8B_mlZ. oS%$놲\cZ,#cur2dE!o/4=/'*;աqʶ=~I+m?D[c:ݪ3?~[XN\H5T]l^B;==%qX˧8!GVgrI'H~O +~ tCRCLrG|``Zͼυ6땂^y~:={Rfx.xV` ,+?^ό_&zSSGB*_GKX;ޡy\+ᕇ$scSUh`}iaΐ;^sU g}7ߵ"c(A(aR 6 = l SՓAwȔcY(+[VXGHp&!UO>C#[n1^) Q.u;sA,a!բb!؊;)x82k59U19倥+'|MPO &#~הx#"K:C56(-2B5 9@7VT$   l|4=:#F &[@yjScM+ƠHIRaVXM|)(ý!-[|-dcz,NVYE"7t]+m`z=Vbi7H :PP   n!0opmY [f&) ߤ&?Wpz][J:?7wB0l>1N#.DK"$Qrzĩ\OW +{ dU?ڡr~b];-l}OsX5d @m$4@>ׯ*灴o_t!\!Ȑqđ2<`~Uz +fHcHOFN7PFΙ! +|/w&).܏lvWv]u'v O??~hb cfi2C*`K&x;}v<m u>O 2}2NLBdAf!0֭0VF 8;N-@Q]1mL> *e 8mM6O]=te@kG|C0z_1pF[v&v&G24#m n,^lɺL0ٽA[`b`v"Gͼya!IiH 8VFDف!k`# m5h6hX6@rwI淰=y{K%=#$({/4> NQ+ޣ t>>CJfoN/ e%d/zVdNl ' #f(,Ax6$`4DsbqFH?3i~yPqfalYXHи8;0!} TW`qCG. VԧxF qɈ™ fO+(0-nb$x"ۻ:rl+z4DZMfhZ^0Wzڈ^#eZ0r P15j[ g@$Aqy T 7_7uHypuxl+/kZ Hlbt( ygGIT~a ~3՝ky@b1Y}ҡCQ\BI:v\;) .^7&Q?߆A>~ *\PԈ4fAsGp'xeJBze&}|M(d=B!C3VFPemR(BZ8 Yònwzp>\aJ55&gTHcPO5>@:%&oP{ rK+:t=3} "#N5=| L!ZYub>EB-p=TzM~:Rs6yFξl3B_Hӎ3-L535oقv5EŁk|"?O~al?w~bcYg'r(*=Ӟ􈲁;Vӓy'*l$ g`3@ vbX!G.01Hi/TGEAX2LÃ#p1JP74"oJK  Y54;LH| . iHaHЗ#!v`:!m?ʖG_>"*f&qπNueXɵ Eο֘WٖYe,C AI'-TnXi`k(Q7ڙi s-+0"-FH#S-]K*3T wqbM񎕕;8dqV86=!$v ~_4x!R"OJԣCFN[V{R^.m2m4B xFF"m|gu@RAl.Dbj6Nއ){kڌ򄛀z*;lqC<#/I?_ K2l2P.T6[O{ mS\"<,Ζ++=HקI34$}~ _/Q9v\f6J:PUc%:=B`z"=UBm!Ķ {awI/خj\cmU1p9da`],nfz t.`eDL9sE_9RtݸyTެ&LJ;' -!v UseOȰf``Hy[i< &ށ<$Hx'I$gn!Gv~jIkY~IPGC*w-. H)WPS8?gtC)CC߂1>[vO sȾ$f}"-;|1 `HpaBƗ 0(ҒaKtyoŇ) VR<D+:lt ID9a.lYڊ(׋4m j7k{hEW7z֖sS2c*{EMWQ!ըlYN톭C 861Ձް xy:迒B@mޱ"K :Pe+-AJ䥵Y{GꜛiD<(*IH{ q#=}5u(/!4n}{ vf ՅRx\'[az^ ^/0(axvYDG6A?~ Cg|4~d,'X H- t]8[Rm*U[7)nv.ehDu#WȠȲFw*{xIX&fVᛗ/ Ja@Uaʐ?c~EoV8n*=ڨIaoi'[~Oi*=RlnYvUnT73Ϸ>{͘1ov$_vm-a9uB?iKI_wS>UWߦ򏿰4`GI<\Bqҟl'n+ighRSUO3E J'F'c8l|:3!#>"+")߅ ~ 0MT巰줷+#%Bb%A;v喠ݡ~ـ$a׎>̋-"j w+<d k{Bh@(GZ1Mg/`! UȒ>G> G\clG~ą `R^q4ʝ^^Î]>G  ̬DTzsH*.J\/thG^ܶ3Qs@ywKv&k;r2|;zcDTh.nƴ߅*#=AZ0\o,VM.#F3}asбjkutSTBQP ˅r"IZLAGw>n*CmG9h[])!!fNl||zd;(z^Ckx#YA&hg0.APp4AG[༮G'ztq8 Jxk ?2nq5-KӜSDzDeTN;` t4J6<= 44md)}]~ i.alaGH2L_wg^*0N\s"c/+ um >.L]T-F+p:|3(kG_Ed)eäG z2/FIC! m5¢HC[{k9]K;xٓ3>Z5d96_x椼 W 0{ό~@!S=A!c7bii&xو~~Ouqe_#E^O.^c#hF^^`mWn͉;f!Fe/~^GӤH=Qr njdE22ojبH V'7ZhJ!21/`%cch?A{@k'ޟ5M֨fD$ wnH$t#-;fƥ EA.,!~a|~=G(3V@:?9Bi4y  sF p^@l%;pXrOɳ 058Dy$|6~I<"_HHIH">Adx@^K}HH |PWqA*ne[ai\ r;'ɓNV)= {vxSEkW8=򟥊CN>K;4 ݽb xбAw3F.xqFARhjt^}n` s*%;>7Bɾ)]1r}ׄd GQcAafC̾|]?s3yhˇc4 m0P^q3IKZfW$ O$PL୾/{KТo y1XЗOh7O_Cd4h*uTq(Vپ#@BE'm,nfhs䝻vr$)oTA/>Xym~; {in=XU[.m4I_UWi|}ItF|K{1. m+5n vQ3c(K'}כ//m 1NPӫ`-xT &$ޒ4SE纋ɌQ20U4JUH7'b"wZAPaكh,bȜ{v &@Ho RÐ)o=@..q{,!B;QWOa4d`/a{bh"6fgBЄ _`Y労;} KL{: TE, U Rw~O0ugVH}lL V|FsH5R՟p.m@W|?R p4.P[.gi[B>la!Ҿ\лgT^ѷ'f{ hȴqp%YG'BQظLm@}CaH=d) UIoe;A(4 x~" CL!.ƲT| 5@PpF)(:~nڠ!{Z4N,x~%8nlQ*LQ> ڬp @0{v5J_I_w󴜶t/(;6]U"3o|brv>rMPKP_* /{æJV^K C=B(O1'W&0Big ;d4;9cP3;hxZ FuU /lneo~K;=ƺ.#FC+;&/$ȅ Yi0 eSX; ܾe&Lҋy9_5Jt0!]CQhNQK2 y!xA_`]1'ft# b2G_f*c?Q$Zo'JMH WFJ"Tdc}ᘰ􋡂$ 'HHĸ,R| uh)k?l,%0ntۯ9܉[1/ZxSNa#C-DqQ3=+L=|8Pt)e>Q3VE6Gx(]c{;]64R!:Ry/[ǍBjY1L˃;{HC3RP[xAm#` kh|9Pu|}< &xi5)^4 X/Ow*7}7}J^ۀWibDMedN; N: ;|{ŋd~NWtOtU  NX)CwFx5 n\%lrP#}Uxx: ,u佥 !c dgQ׸OsZ*o# TJߠyY~ŠOQ&@"+)JMd27sjTQ_}ݑ;g']hnei)َ{o(߾kؾY $=]G{82Z$^%{! }+tQ4i !yBa|qRf X.W̜`!OwfCl$eD']}YAP}UˆvpqTGH'nʊ&B qX=i{& XCCBiGqϻs/s`TUedPb`Lx@^8nM  L T!QLh(%H\޼5hɛfP/ ..s2ϐh 'ц26vrdWԔxnAvл"S&1Sӱv‰H%5;5LF.i"Oq0}Yc0#V *4jyAjix#+^+UiF2\#f"g.6j ƩRՖ(15~gDX@#@d \G!oG`{gӎuHyxy7L&z[:d~@+_W|‚cǢ83@F̱!G=pcݞ|/њLp7h^}З:| ;GRB\|XiQ IDAT*ՈyC4FTBP[zGp5l6vvvzogX} c:+lxZY̑-m\n)/Hi߀;w)$yޣ_AGRh^?Avo tAڸ-b>0B(>kĭ]#WH?CsK$'% gb&ȼgWB;&X)4_74lm*|\ D c l|P)T"׀So^StZ H!f2l/./Ob?Kǖהw )2\!ӎ ex.G)C5MlA7bL rC7<'hR!5Kz<]Vfޢ@/EP}j `/7ɶPHHGQ=Xavf pr}!g*: 5} CH.0ߐ/>&9oGx~݂39E$0ĎQh"9]g,o30R 6$-q3` |lqPr(=Q"oo0E_f X )DWL-|L3Lͬ3`/_TFo_҆\>.5#:PN+%@ K0F2YK  kkܧ[x}u`@˖d@@N-Ig@+ ag_JןrUoEU+}fB+~z#͝XNB܋\ ܦ^Ѡ angvBJ,`#"L.ipDR,yhJixrO_ #ZVyP3t`qAz)~Ȫ"eHuٙ sl'`$~Q \_Q v i;ϰv y} ~Yux{_~)ɀ&h?qp}+2""-X+H~`o'ĮN9s숤!dnt'*$"1|3U(5Ptk D5^5iDl{qoG x!`ʄIU@4} ã}rV=F} y̱Vzm$UTxKD9Zv#ۭ+i,. y7#gxɀl2 lwluOĖ1sήkύ291P q|3~&\!}e';67/[df 돣P2`xCBOcʃG 0OTA^7qK@{ ߨ4/h| :v(Hqɘٽ|xc&8ڌǝ9$HAv- 'A #FBX$g6(˯ߧ<_Iא#C IZ =1YX*">4?Hl`y ^3<~b)}o*E4߳(}gs^B$(l0G#9BkGpđGٺCh.L &A(D v J~4 'JMC=G Hb4 ;Fr5VF@k8^񲔔TOP1k4AI'܏.4RCcFs8z#?\rP~"Zgݙz (jGz`J<6fWyuJE,v{ȠՔY ="B/R .ddB DcIXWzT3'9`o ʘ*/۟kd(?/zmBB $u Z)sSJO !ĸRU`x9v\b̎Q$4s&hpy 92[İM"?NGbg#I"͌t%=FC}!3E'Ta ))(wqϼ '2D=4Cƙ41h P @|wUXIzϕc9%EB\`>8tKN- Q 3x*_'#VK3zOv;O԰nﱝ9ƴl/H1L*CY|@a{D*xJѱAx +:bPa[ hBJ%4#SƏΝ~TxjW"M3ωHS೭̄HBpD*,O+g8ϐ9|>B}e 3:,=,FPTm$g}`T\ a=h!r]3,ܹK%!{ %:;_J֟K_:6K'5v#::3k)=O߱3(;h_\W&2lOυJ80q*K,Bۑryw'z0HF~!si6dd~o{Y3y;{Li)ц/dc m2#xQ,|}" Չ fsg.&a? 2 H%ѕ%?0HnZ1Ht6Pyxq`JU,MgX9-L9`5 !p7m` zJ ߞo_pϖ*y6 1%$.ﱞoae\fXR> PJK!d.7<}p0 i'`R5a-hxyiY;ɯ P&"!- \+^fzxLf5/mQ_P+rl+U,@p}fDZۇ"ϰ¼ 7,<(%1ui-½@DsH vBy),Jc(A4J#$ B1М!΀h!alL b';2d}$ڂYxc=Gr7TZ om̱#blUh"f}>ghy;R7le+-)Tv.a5Op2&ũl>a gUyw]C :+}ƶ~0*\=m{>Y`0wEA#i:k&an=8p :Hۑڴޟ( D.ٻ@?CĨ v30\~9#i<>{ M%#;ci~y:1+fd+|g7IyWhωr7b(Fyl\h}/#p;6C .!Q^[`%DwwT`!]B/ fb4 3#i̶]XfR3};G+-#&$b3x#.GHI4𤋮JhM)0%FX)8 [7Ly.b4R kw 6h?RbUBzsoFJyFf\@\3AdwD:XC]1vhO܍lJAv0>|}8)p7KCo_ B0)HL3.3÷kGvdĊ0e@ÎHV1`k<L{*P3$w ; uzhг^ Lo= @ o3Gz ӛ-b`Ih(xy;@?BgX@5n7h>@5Ph?xnd>:ta.#ӤHOjק'vpH36 ĕG` ) >n|D'TIQy$.@I0LX` $Vn_J՟Wڑw hI kp&.a1jx̼_}0")"v~"I+d"EhCDre }CZb@@3U[V1 "7rɴt=#h},z" $o`W=VKa+ؘ5A)Wht$w(7 {v}!+`ǭq@16֞c=ܟaw_|b';R'b}&<I{"@: r% 6a1r:P01jZ\i <w΢/`p".]+/ʸ!C!NkC nH27ರCÀISBVع*?1\b})lPw1I mS=S5rZb~|ԙdID&Bu{4(&^vFb){BlVy p}R/J{gq+dxDKh_3vaSr9Uq+6U,WZ#,%>@^.#ԥ 6[9KVJj-ۈ)1q@[\H=I'x:DNJ@h+~cڟ_:E}'9 mRClO8mف&J>@3 ۑ#*4.3$vl9s>;9# -Pn9bqIC^ Q]Od7̶J):`Yy_"L ޡo1f| t$IahuL3.= |D{TŊWD5 }'rO;٢&|{h:( aw :+kcG&SKQN/G=;d+CJ/ių >>+~ c]B֋!0/ v!2iTxJ//8/ (_kw.ilr ܎q*SxmdFE#sh2EF9KwQ{$)#47C)%+L! 8]b;d= `&$g`U2#D(ϺFg#U@fFH}8F?$}K滱 be*X)a `w4cI}Zubm;'i">[ )k")L$[0k[&mY5x A(!iY_ #C0|Ds޳@k%^>D%kyG B<,*6p80#=TG%åߔb'x{ES=4PfB1%)%_BTn 4]W˙w 켃#_ HѵBun1uRjv(J >jVOvB)"ro| &Kτホ1.ǫP#;i'TT"*ՖqJ#%T $+'Ph54 <"̱!ڗ4h..JOv`)nyxD[3o;21W(M\*0*t[!%s,5H}]3ef7 yMXcٯO>(%Cdpl,+AJ•ļrc=?}o^iLdA:/ۗ=&Wfd}Wʇ p\)}3|k|clun@%(͐4Lȸ.OJMwuN QHnL62XBkBo:av#Nc `^[]ߢ# n'iR9c! a_>ɵ#t,(3`ilrq\ SjP^to5ֈYBIDՓwE=iu߂q!y:""9(+LǹBxQY^f\c?8E Ly1ДyvOo𔐝@I*H؅#J 8|eH #n챭VhkH&vMfUP=p +%:~o+:Lw %$,sW&Z;J3@ .sr,l RçǛiO!U!#!ͯU9b=0 H@=LwTJ7r]".np>X)tȥS2[li tE IDATk(Z4T:g#c:`a/퇅Mu(> G֡16@aQ CR"@$Lq!ȧ+,'.]Q%l? K|t&YhCBDЄe;T{w3wp=`) (ddf ~5.d2c[J·v5Fw1KGi#F#B;"3H}Mb~d&諻A3lmW v3"0g{J!u_Zƙӈq[`!yяP ƣU4g [JGZ|SƸeۙBr 2,Pmwvaᬽ=qtϑ 0OV4M}Ny_wj%t>$e7]&{ϪmTBz씳"ٞq#LQ-ؖDRQefQC*7Ď8Ơo\>SL5VFmD(` zw 1ݸ9,C[-KȼKvhH,1`4/K'}Ip 1LjydI.^CQ 2>F0VteOvb7v6W#,[-3a`C)3U)Lգ?zmag:_^oT! h*MWZDȸû]` =wH}@v_ ߨs8z*9'B0H< $Cj@˫J)OpA[ 1)Dh^7Z8qd 2*ܛ=TaکK;m0Dols mTlaZq76Ing)C$eҀ+:Uh8bJ X8sorm;`؀[8ӎ3X7vgGEHk̻Vgrw ̱O%be,|jEIN#yGsD-B62de|)G"3CA;GWl{o+Kei9Zf{s"i$$PSqjw<oq쬈8lw7֜\iAAUufqTRVE޾g372E{`>+AGCSuqDU2|ļmKH^sVlPcsPҰFD _W64ZJ va bd83j4Mo;E#UԏATd+:#oнрÉ[3D  Kk©ĕ-9F턊F'<|`f|B1cWq} :rY2XT TĔ1yh'tP )!.#*LG\T$[#/+Gr>2@]8 _`` /\ X_.CpqWԍ@X闅?ktZ|=0'/J[>E<9j/vЪJ9ԗ/8`˱1teG= {+d>`v0lDˤ\=Bh"ZWCq3 %3}ga(;XG%}]o}A,٩GNGzlNrBM gBQcۅdDDw$ |pi;?{G:cBpB1:3`!˙: )tc .ĊƸuǤ;ZIrNr!wqxA^<ȝ+/WyC7:F ;:b J^a%@B \ Q.L5ʯvNd$+4:GmQ- Dwu;urUT:]NiP{4– מ {o2AmDhBIop'D)AnVt1iC ]+o^NʜB5hwe3G)I=j :@ήn7h!Ɗ2rEa VAps/!3Ct͙;JnE2 /Fv hwmq϶:^&}Af_WO Gn_21բsd(9?r4y奖n5ת h/"Z@x<.^"LrZ5xWRyqo1HzgpDZ/o+uc~?wLf e n'4 \-tf&1..xxkʁR Q˪*ݜHlIxRð̩.$ZOr2\R+zqʓcuzEB#Sġs)~a硬BRީ GM!J[$Udx{VjJf"B~l+_r\&`$h#>r"3.0KL 7!ĠZz $: 0'AEU^HЙ p#iGVƃ 2Mϴ*7#g-r%yx_!*!"nF~g3D/]˹Avsz}AƓ{K%H"RL OxIeo8sayagg1qT+^FYOT+#aI,:q_k3:B䒹YT+dߓC4i5yeҀ;#"UZ"::E uN@ XWvis=})u#u\0&kcQZ7)uF)S"6 w~RM>8'^NܷL=ͼ&gʄظ؊#u74QT3sx%=b8<42["_){F"p/\ ~Q2N F 1qlDG vJNʜ( w O&wܡyE]m/UW Ro<|yY ~O?YK-Wb^] `qxt:e ryZYcB=t`Ą2aB@$焁Yw&"Q)^s#6zA)$shrӗ `RP婇Bj /􃂣ToX,h0ʏ)9F1X*[(%xSJX)" ks2!)*-V * p2r& |4F 4_o=h'}!?e}bbDB}X~C@Ge000|u8~d,!ν/%JIvㅳ{D 0=M./ٲp"R aB4A7J'wjCؓ;ʴk:8`@ƀ\~@Ag& x車seN& w{nǀb0 P,mB%*JG&ڿ" IUv?7qh MbBd]ظC;!o2`%Q(@O &%DBݹ+J$Q8{Aưq-ET"2"~ e>6XY&niRϑ l;J@+„Iw"g < e=o+~ZXةeTM*GFͤH{Y/)ҘwHeD*d~92s" ɖ"ĵYt E⃣Ǚivlh*j,h7N4ʔ@ SC )3a&ĈR׏#W"`>`q1K$D$VI3:XhwhphwUX][&^1ٳ—z<-!4 0pTh[wBhza%ށhٝJ/@ _y)wR 1c=#vALJ;&2m Ղm'w@8iUh}ؾo_ǝwtz - :LLxP+ wV !{# 섋@)Tm4{#c b§S?z u~*J 5R'4b/͟oFʤf 24VO0>O-\5힥us8-y+t B Dđ{:ma&V)/a*d :wg2(i.LH dgwP,?UqLÃ@@cC~0뎔B<#GlD@,w#-IHXK\Y!* Ҭ0CBI75$lhej@ghBY(N %ido@.^c'-?@ ;c6t%:u*P3%$H3dЫqqd}OIia828(R&Hu^nabTȈk~l?Q xloP j1o=`wLXDd10b‚jG2p1o̔jP^cvFy9 PSBط-pjOxAozx"ٍ>[ӁTiUo `&zcSAlT1܍(8hv-}]D D@:9h-^hY^ePh UR:.@?_b+q4z^?!Re 퐽A׆Q2,Zpj ّ鷬 y fTBO. /rc lwE$Gٷ,$nTR'!9^n6Jw;)9'AΦRz b+>q%+;Z^@Ȁz9Di.s(i~[9"g#34TEu8\u\f;Rc#2* 5ٱQ`0Xq ]_ >- 5w+dy މ^'9pQsF`r#,c† O#z`;DQ E?pDgh44k>N3s !re6. !E2%A\v;tgsxη,'w"EȎPJ[$+1h^/ ̘RP P_%Mu2&\!B\q<=_HNsʄ>U RskTPhATlL/X@em3㑼Rs0TVCU]JNĀHO 4œ=eG*5'!FIqRx"S}CX;C so] E `T933Lc !Yܹ+f^Ӑ$G7Hًi})h;}p sBP xR(nJ_ -(5~tkZV(f#k B&!(ӗ6BErqf3d#F 谖l!.]9˅>#G_JV!YJS ߡ@ߡ^<^y\Db>xКnEF0]XơY0Fw!2ic#4 W0*eOɑ?iھShMok܏E(X*\CB "w;5)ءB]NV)ON9~woY' 1͖|m }lA-?b/3]s" S'@- E0jH>phqlJN}8`64#JaQHx9B[/jȏb+&BmB]s~pdM Rn| =Qˆ= Ptz @C s=evAD d݈sU 3 IDAT/: d4iVGdulQ 3edQظ_AHM/Is()17` VJ\UWvľGoBlEh8T{G1;^6a{25P%{2&`4k#>&.O'?B!K8Tr -^Btj |#`* 4g(0 s = Pڍ/hZ5cDUu:LgQ4W0CJжSjDIeB! /(B/E /?qO݁IT &pLI!}g10t8b.a'Kq)* Z߯m;re*{b 6:ռH,˧G㯥<ӟgVDV ӽ~J 0"ܿSP< /u} Ljz|4Nx%R JHc&rGV tmwxk` h[RYAJ,!!:MJ;@hR}$2x3y{ؔщZ*!o$Q̯K|i]0@d F q$8(FqG(+9cGEbQ᠍`z7.&y ǯW#mHKQ;&T wo1/WʼnѲCx1ڊ39Rj(cӯӕo'2`Su$eu;S}'%S,I&|xG-w9/ gx^ˈ1ocj ^ *3bnB*y"z/G N%63 &l8wA<?xkS87I~!Wh1mvD-j$]pwaCƋ T;wofEBޙ7㊔sZ-.oq YVX 2&^ZFU|Aș71j4ܸ .eл\Js|>*.H2 AJ|}IăS,0{r6QU,F E #\@ @7Tc'&7#OP^"eAOT&8ZṠ '%Ϡ=rD1DL-P<P;=FcqDy#."V|3D)w8Z2 ^Ea'[~&VjjWPwh8|Pv{3 JM̹[YP"१Tt} -?[TGnG @ To <̭LоBCeZм crK%!KN, GwN,FBJpF85"|av&+SYke:x`)a 5(n\m ?~!xGuKDq'ٻKıN7BV#lpyE!~=0A"b|] p>*yI(."UXKPo%ӉyQer"N*$V^>%I퓜B@`aT&Pce/x-W^fH_ߘwF=f npHT^eWqF+iL-]hJ'HS fP=)ϜAJL(R̲%x^%ȁ9t‚DE$@._8ڴ9ʒVP ]&epae`;/cx@1 oLKsfQ+ĪAp+NMWБHyd}#̐rHȀ8޴pb3?!Q Ӝg^3&&$W>Jl8?jŒaO+kT 77zvoiO=:AC5Ar*3=cP E{ t,i,.I3bDP؄~w8?Z[Gc@MjM s taz+oSnLNlό#鏠8=yIq<)]3+w4PGJ!p^*b^ϴ4#lBhUHeح}<H\qQ =FeD JAǢcHJoFB@ڀ92r"5릅x0Nry4ϟ;hO@[Oe"5=Am#KŅ:ÄwL-)2ZWDei0$Q !X(2)+{Xʊ9s ź/ǭޣ9vD0G*29bmP##7¢Kt 45B,m6w _ A 8])b)u4gyHh* ]xa.Y2m(S &$J4yszzL py=%1.k|CM])TB2p~fawWD&Uzv /Z*s.b I|7".hAPfq/zӏP]l8W5;}Sb 4uh#?4MC ;M]86L%a )1DJŀ ;) B]0ua(V)∜ pQ QVX#PO.뒟i"EE `x|,#ac߱/*.F~d{T^Sf09Ս8@l͠I]bnڂ`Wo"htP 9C39}e4ŠAk[F(;#>xHx@tCFODe!LTx@4qS! (if@ (CwW O9v3|zέN٢ p⺤ DAg!H)mA\fvgb .Hw a72>340ٮ %hW! ֢ j ž| feu}C#E%V W#6=h 2n;sUw|zŒ̑7.o pO@jESX9 3sϟwh!Z+En٩&N'$!$AW>ۏK_ĀƜJٮc=czz{OcͰSR{({1D]v2$&N<@q-dB7;%b!+*-niWq2<) 'Ab{\٭2=mŽ|yŝ9spY^2`eV^T2O,f.|o;րCwb6rxEt~vԖ$9'޿Ғ{zs7\ .qK3=d1-so;)`r-;W3a=ld`w{X,{>qt<ST'bL-qy i 2W%ӒUF_!qƹ8iuIpcTnTIME@Ņp!wHDFAAwYr2Q\%?( fV_!l:8J;^Hs)Gă 9ߔ{ ߉ʃ@21ѠwLpKcI3F)X:#rX~uX_awyzӄ/epw1+2gʑL0=FeݽةJ%5f9Zr R^&`4'1:4UPOITۖ{O$__5 0/ =N+ICL_,8&4V#s7vڹR-s,8mP۞ܓM b &s;N*dgvtlZ=t8 o+3#ule^l:C ﹇Ta1AQz4J5R\ďBe|sk|#/;J[B3Tmܭt0:#菌(T|qϜAsj iN-GsPSXSZvR c 7 P)N< ⁔D&'@ᖯ]UOR-1^x7@(A9e+݆`  U+bcۿ+nʩ*1w"e|^X2BT A*J0<~k0z{`X(vN_H'LN⟂Q $iO֙'e!eD`ۀ1#r*)  ߞ:0@'Ob: ( s qt:Azl[v1eV|4Ⱦ'c45_oL:~| wkgADe$E. mkI0&S^ k*4&xfżpykXk0k#O/L-wf}(Y/ƹBmafϽA VBwDdhs{eFj<  ya*x0T}zf{pD=|H?7ѵ߽oR9p}ʃK[*:3Q*/N0D4wE|=a[fx5 Tܚ$cWůp. O:wnU| D46 PW^ub%]dH@ 6.s ^"8zIUqC-ca܃Ar83&DSx4v"6Q3`b1#ӕ 1P5 [BӂG&%4`#ګUٝ >̂}*;!ߡvAH\>6oO((Oie@=(7`$~K@&9rG45Gv@5f;Ù{#ul(GF"{| MHÉ3ˮWG|(Ѹk?~"Ph+/3tJr-eBشjȏvN(G#dCe-d61Ϝqˌx릁BF5~G{c:]t2Wb({y`pD6lzt* 9d4^pcGҰ˪W[jpf\/ 02wmǞgfg/Åڡc zC(Ggf l|@JLk x;;R}dLS=ɥk߁v-Sra"v]$hw8pT2#>Θ)eZ1szI =O׶-1\k9` D B"Q6 " a@ң X BH#ʯ{{5wu^!7"YRջsY{9|A {=xfe/_”Ah,[BiFMp_S1;n3&!l`F GۑL4TL ΄0y0P+r#JuN0+rُǝs#1=R(l۩Ee&WAl oYwcZG|GrBܳE!h ̾K4APޮuKY +1S, rz9fw MHFxOC锂) ?-vG&( H!T#2"!ՊJ`jVXE@L!KzF]/pSv%E*:#ߪ@ݠh !!)Dqz@GЧ9̧ڹlw,efJ큖nwwOlDF{%/VA]P lG졞^8T -$Љ܊2L@'ֹҟfqpQ hBMxbWZm(2iX6׏h/1:}{U9 (횜^+jI.լx &,ăNl{!$FkFFf CX*!o4`DRM@(L8ovKKI;CW>$TD7Δ= QܤIQ֜)> )6hMWY-i$9S(̅AI<灯9g}c͔tھ*iXiZH1F=i1 =Qk+ٸXE\.ǥǑBFVA햩 a[v`7GoyEJW~]9g>ceƇ1 8hWT2CohT?vob|b$v}=KG!A6OsD(;Z$iTu{e[k##u0EƗp!fXp#C)54!|fy4mLpYi h<>e9a܍6Εr/t|uIXEz.,mcD9Lb#M,\[/όE@,B<\SUJx4lyomȷ =wl0`!T=^3m%$= xbr|0$O3 OJ.X:H-~;7H]Rm#$94Tq䱭G3x;ߩaP!7])0faSv14)3nDvʙac &tH!RT%x\63 cBg]–k"4x5ȲP ZO@IIJ{:)95ωh)pdMRmu P34Ȥ CE<(lm,TB}/x2#H C%?35L>?] I%* ogޔo~cE,+I([m`0ےg.rvS4Ӹh=0L=8BF*.# +|0mZV}=)/)>]_ ؔ[n9|/lq>C2S5j7\*oGmU)הU.~$zv>3O3L.qn_! Ap?xr8=qDovEqJ hȅUV6PK~RB.ĝ&|]̬=7vCwdUFai@IKD{lE~%ۣKN!,X&| '"0.5ʯgc{L@|F+7ФxVŇP%o"wvF*٘t`iEhufϟ}͍r:}b j89<DL'ĴP9<= oñ@_h/WQ'rh9tj0u#;1ëOi O\@ǔ)+  !OAvGߡg<ڂ(\%"[:Fa.Ul(4giJ\9C=k^C-%zʷƤyr5p`J3ܭH|cD=ALQNgbҎ"=|Ⓗr E?fkS!~cRXD:לO^m7OSqozlWxd-Bf Mʼn*yp֙sDA RFψ<̤5ukHo9||{wA P+ԉ[W_-TG,h6e"#v*dI a6 G{R <|~|]?\ݢה`&r|0D3b鈕9fqCkbdH1ONdVk}3SVcĒfg9`z߀J^mi3 bYM7E)dkSJk."1dk# +Y~eoG X"iz9YU|S/Th3P 37csé)(<{`'v| ]JunA*P2L'ft ; grY^ϯϬ[T MN%/}^I%MUpnx#$)rLvdHo66 >mgȩinAnvP);|P J֌ Œ{Ȟ8. RaAز\;#y4%:?xSB]=W3zK6cf<;̈'ƈxt0я#m >kl#%R"ONd5Mܒ* O`GG-cA9ڴ+㒌^* y]KXMx3 ҴDO6{H"Fo?vh;{d <.r$0IOIsFh o|; g`vM*WJ)%W0.&O!DIqcyTg.6Cv32pTQv B&|gC`bru80 ~';dAѐIRrmC_2bB"B-8Rx q(]MCLP9;=܏ APZD ?̽[mSt2پιwo`ufz#Y! 8!}Cy2oo6~'K&MF))veKhvn֒0C&V:GǡVN&!Gل"P*`~([yl%Q#q9ːjIIV9H~_*Kh88Fs{H\a,nz<+R;`2˒zC-lz:oAK2 sʣι=:rjXa=;qL,-T% "d{JG8*[AF:V wƅ7@-DY+ВE*/C14Z+. 2=3e;4q$-tO])2f_),)*tCTBwhW!~J i1GS x'B3XwZ(Tь6~5`!9(@&ٖ'`>P[]?cWF 2u9[#D9(\(ȣ+Ik:?Hb9]=̕tݣP%f2RFh|u|j/L Ǿ*gv pf$38 =*¬F[|D}O4pդߗ঩N9'H"cG }\)OC  g2 [ѯs$x&R)/\xhm";$"R%:X.[{O>,gy7/S5eSғ^r>CHiw ڧCRjڝْ )M3#pWYb۸1lϔjNZ~ڮqS̎6Jg0)ighhےvol[fj,, =G'RGqZ0ȉ}qd(gB6ͪȈ`}޾yRv`:S?ReK%(r avF`q5R 8Cv Jk* Ή{J6g[FHpMn0'gEс\:!USB1Ocč8QX#cu2/a.Gƣ1' lWi{b{NE#72aSl冖Bp9cTN;<<r:?:;ga3װ 'rB wQc} Fz)#wnk *bGL o")B~&T OޅޞGoexB\a DH7BKU )g!4vl1ujTel9#4z$]?ԭȣ%I|hY7@לW~T1R lEH`[e /qMc1C6l%DRq`[YU(I5!@:}_F-VKA+zr}ekSf" Ke*7HK%n 1PVai Áf-Adʅܲ8׵y(/LI5_BXd L2=n@=̔Fc$5F='Bv}}SV9 $"=ϷCxB[;8K"9t$-d˖#Ֆ9Q*`W2DQo8%L IDATUL45vg-=XٞiS-T l_P/2Oօi` \;ۅb3Mfm;rs.~}Z'F9VᷜWSrS"itm8l2[Du55R >neɪ"()OH Bߘ >6SpL!R$ nFN%ޓP̽q $c4&'pora\BF{cu=w|rKXb83* ͰXVu}LOX_~{.B{zУ65+0x^S!:%P L I3*f|~Wzl/Chz.2s·;2gۑQk4`$D *яLhkB3\4pU)lL55=Ƙ胟ֲT;`ⴰFˉMH|ƨsÿFޮ?~g/0#T`yhηg;/ېJ f*բLB!(l[ErcJoWV(g6mϽ9Y-}b5 %KՆyE 8+0T;aU'͙]~+GiFa.4LćS'+-PŸ=YþJrGy'kҹ)HE jp)|}Gѷ&pTzĠoB ӏLdm'Jw`{#^iH 5;ӗ0A5b8^$tHbL[:SemR FhܠKRgh-tLwλ 1O3k+cQ笸W&0du-Fk Yi r[-oۍ {0ٱL!$,TLjI!x6] j @1yq, `WX;Kزqw.FRF#FOǑp@]:- '\vP Pa}K?P+}e4n{U,7 !3[sJ@ aɕ]?-خni|;_x{T@ʁ%CemH]LtkLJl#EΣd4LrNWV{PdlxP:t ȄH58jR;T9[-@aT~)Tb n܄ʉBۋBH!K[9J*$%8lnL^k禢jsOKAͶ6Qk SM*< aȜyt#r,ckz Q[ ݊Sl,hsyA0x!F,Gt @C,' .v!t[*܄|M̐křĸpm9gh!D6.yQlحX(l`;tpY?A TK%`1,5Da:R`s 4Md ey}( c@}P^:I X4z,:l8{ws5sS22 .Jm;rN6:y0*+@8 F=ZqDH3jF4xDaWD änFˬ+9I7IFGGHB#nW"?t(`tfoZ^/Sg%h^z$3oFed@.)jqGN'ȶQP8O%;d WA+gݏ.H]Kk z#8V9m4bvM[Dͽ h=ӈz5eNO4"ھւ|dnlv͟V ?B^LqIVB]<7 [i@c !撠;>yl(\ؙ%2@↔P[3&XC xRОkj1Ҹ cP˙ם!PP}e{˹Q( bEP "Fb͹Ff9)L44kk4ĸqT!;@bVJʰ)#7pg"Z0ZJh0в}#=bҿ.mH#It`ke )ݞ) _jaYy =dO3n.VHB!7D[ =cm@bMe%-$ kY9jBAS72}!h>!,mDz@ ?&)$]J@ <}P3@xoʛ 9cy?{>CoE:?p?ށΌ϶Qh6V;v\Hh#}:K[1bzb=5R#?_ ŖoCޱZ4O|'ng. q @!BgBb"sڮT@3F _ř۾i#[7U6Q;jx>s~ 1t:grhVEVpݩ4%iN{yx2]bgl7o/l1'f{h l{ʕTrJ$R 'F*IgǏ00_rH%\運WhǹJ)ʠgn"7&K<7d)c +HvbP* &cP"{W8\xhwHf gwQ(En;&=X.i6Ex!=բ}$Aݡ=v4sCGs G>zx8{ V˥`m_Ѫ$}%q~޿{fT4quᆵۣvYe j=akDf`%Zf|m Vaʓ +4F@S" ⣥S c"mp'0HDIXlH;:7mg&f4139|? 0Y ᮊe8 TrVU,i54hA|F1ZҿxrR ްBE(К UيqcW}%cXS&Q2[Wtx#=w',Hx_!#}/GKʔF񕡰c0):AfV[(Dn2]넾ށDGlcO?w6b;.zyq;d}>~<2h$i">W ִ aKS۩Aԉʧ/1O1ąk-))w`~Ml(^p.{f-~߾EQϩ4Fg5reKSGv;V*$(o3NmфG罰3Zr _P1tFdJIOŨ:":aLF1d."~:eaa -- W M} _P/k~}91?@;qzOednGkCtGiM/YPWՆ@gv0TpLl('Z =[vAD߳uS>!.q^Dw!_s zw}{_zS?]oJ"@D)?+`-ga"M(74M H)E"D%TYb-8i{**|ʈ}1щs3|=N YQ =s#=R2|E2:[GᜅIжZUfL4;{>4wY1[3Lx /J9S1V$M ՉJ:=7X~0Y jD9BgJ`aQfxTЂ"T9QFrf%s2O/s&3CXc8XM 0 DkPUΡRiWȽ rݣv('lMukBȜ3F2dBZMJJ; 9&€\ƸBLD- JcЂbbYbt9aLLmл6% Tby2r租]o3knv?K&Y_}!/ǯ &G}RaܟI R'`*;̌ 9bә RB^]^ݿdU3r$AZIz`Ƥp7 kXPlzSG }ʸ;zOVN$WK`clipTT9AK!g@rK}2MI>t ^@e{2=@mA沛EcY5 ܹߙ(P IDATg!q:HW=%"w/%("pm{/֓= C@d(2%B 4zgc;PҠWh ;MQ :8zLi>VV_J0;t]hթFoN>{yXŧo]o?CdMܴ0IL]a">+gIUrady-ɂ)1nBzVމ~h+9O T"z4AP+,,'b\+rFw3¦CErBb=A!3Ր=ufl(N3LgvP t+ /\n\)٢TRr` NPLFuh&z[(D<DP=(̍r0DpfB"sTZR*^rp+b~џs53f $ɴH}de\Oľf@98ؾ*}`){Ʉܩ7nMB"Kr#E1>q& W!)__:zs{Rñ+RӉmauyV3eGA!e0WO5Ͻ<&6u~ӗs8d@|߁ AG"<ψ% ;RI~taRxrH1V M1 Fzb3; Ego̓T )wus z]c-@}S= o)D *Oc0Vh(?Ӆ0u ܰm)\hLNd4X8'Ѡv +<3YHh\w;rw3\ $q!qk$/gziw6L˝Tƀ@pkF@̹o*f cT!=gO@|rJ@=*Tjzs1 Cqŗ*mc Mހb<?l_N *F#0LA1k36`ZؒI_}>p@ICx/yʉcc@2 A+Ğ+qhB *4XOIdD]ş}~Ffl`3_ڷ1`n:8Id!}'Vx ο]b\8zZYyOTYΥduP]ka0 ڕ}0[fIxrUDOZ赠e2<~89.:>租MzgMF^#  }d#>Vށw -H*B'J׃8/*ljdK#>ݾ= \5U*nt e{4RvQ쐕LBW{ ?\<=l]z@ EBl;ہZ TDg6s [P 4;/1𖸰@Vv"Kڍ'R392ts=2ȸC/k7[%:lo3P4ٓb|QnV{x`<>!`0) -i_1BX5{Wo٢B:[6Pa oL1I8)<>n$+m WQ&4Xw'G>9:_0HO?koǷmcC~/_V~/2mzQ5:| z`ph%WUAy\}qIrsӄ&2AE8J 3{NzPLd; l"B0F$ԗ-H /!BX3iSӊ$o1lyV6 *_\*06>fUYWC`=}NsӊN>Ľ T?O,(ۥjvEЫ(N@} %.bk "'=[' V*- 3%%Fo/-$3 c` ~$y+h#rkK] G4|sm|~دϿ͇hkh18ıt6`@#."wfw8Hm7X2Qx9\AXS Uq{ SΖ"S9" (4:+~K#4DXʜ -A!  T-)0(E9 "e(X!!F+T0I,Ɗ[&-7Z P1΄TtXj UL^A=† @Q':#^bs*duf/vf]׎גe4*F0J6kwٓK1>k)t,*[ ѬFnjZYA P,y`em2!P`:o˻ŷMz7w#p/qaM,e$w<=)G9CXqђ${tK WD1 \GCӼ,y޷J&g}񟓏{1/$6 !XB``d 6 la/,ˠ`Xyacwtw8DjȀgzNH,ݺ'3|'"G]k(y7؍"3h+(z/VZ9m;h"S4OLFEd*2~'xendaNjN\.tw؈MFB5HXۆ-zP$hmws.Muf1HCL/' 0=&GHo0$hLw, Έ~6>$o>*B 40صP+# ۞=2s=B <'fe.8 2tDfKyDǶARM !J1)b]NEH1hNa"5#vh UzL 4~ U(VLfIl {9>q!7s=Mvl_!>=}w_xO5v YQ3ihî;P"Ɖl,1veU "&DѤtP#ezTI,#HI$ A jOS$9 P DZMVG@dDi-NOGw;qRo٥ f XGLdT`Ar:X:2u|NA9r̨Q07O73߷Z+?}š=3s ON˩~,~j'x?ɇ ){HI3JI&C!Hp5mX|2S?nFhFU2*O 1i*%[p n6$ Lm| ӷ0w$d2S ="Pt'tWQ[K{kP:;He '"p[G~w):GSw#2ǿpq`*=TFSZ!TbwnԡR Ҙ@n7iyyz i79rIG&i(f&& Ŕ'h4`̡} ^c*7;xq![⯬ǵQWjLM SrC%2~*Kw@H/@AD( C8;/-ѳEhG-D̒\;J> l H q[2.}[2?Ctyzhܣ@LnR"w'dʤ3:{ₔ,H@?jlm[xaE8(P5 4$n؎~G mO!@q $̏ѩUϕkN;@6xI:С pϧ#|zDvOdzBcóS03 !M8fzF鎽A3IvqKBrmb)_{ '~~wI4,B~GWr xX6|HkP$baMP)`*)":f§{P {2@5x?!MxyԱ<(_.n0rDŽޑ~=kԑXY"J$Ύ{g0z:&9ɽ;j8sT'<.K9ZT<+فAYSa($@G?dʕ.09nanSرSDv ʥw`fCl C\C;"ąlr;DYN;^))17(ۇ|w:"3g~w{hg2ޓ^.4꘣YD9RF @NZmfmefyU*<E{7-B@j"=L_G= 70<3fqF^/nj̇k{'Ι"B`/Dar/Z(qk)` Ǧ"сDІ'I~a#0ݠ'Cx?Ayq,l6$8Bd{Ay@&Gƍd8yQJ9J/Qa_ }PA=R|SO爘n-9[dvOߓ^ /#+5Fdg E {f!܆Q~.mJ i'~FE|rϠڈP$Bn]1 q B‘%|:͞mVzcҐ15y=V :'2B^=_0~Z%Ҁ CZ:FM|bt=/2*Mݙ*e7YS#N"h t3|*FN X J'Sz"4ԬhuJw8B0GCEXT*(D)4C@{HkTȸnn׀>BV`ԯx.Omv z:C3`)qr-׹O-0\RmpXҐi!cœ!rԶxGn3kPI[IHN_*Wj2!DFqiw7x.~i>iܝ%d :m:8 lɄ0!; i;Tt6kBQpVNiggvYFLNid *pJ@(Š]8>s@D쬑^]oUw'eoA D`@ʼn\lm)3@{ }.t@yBu -~FEa0H{ݪCvYA!\ߐ9BcDɆTAHj$ͮuԪT)gA7vm:l]8m.(V!o}6o8뛟yܷ}J_kO4J|A>T_`:p A(OȤp9bu%T ;>2J#%ж%ʼnC9+Y0LE [%&ςz]j0jts :=`<bӯ!jd Wj9d$,DӁ%N2O>Mh谧&h#]əL7N2lHC+E2a:^@t,[ ѥ a$NM&VLs]nG&Rr=6>@cb'g:Dǔ"dT CtdA6;㷠o}흯?ړO>JYk#/wxl/?l"/"OtN'.Ud-'̸z;IDAT#MG%GT 22_qv+EH>bz 1 )ٍM2 weK'P+ p\Cr(@kBԙ.|d-}nnpsM՜֜00N]kBU`ID& bF 1 :`-ak`mI-- h gͪ+Z)p/RQfEsZnn8SX39,`ǂB"¿B6{cD{3=V`ސ^~g~+/#wzq^h .In@E~ # g: U]j0v]:ClHxfZ`V=1)Dyί7C0 &M@QZ"n-a8yډ iqdQfE@3(F/g9`ye3&t/L&oFi1pP!,< x=OVHDlؒNv"75 Г"lp2d6 Ҟ|'oOmre=Zoql /<}#"E?!z_c"~Bwɲ{3=7C**e ĬgHd "BH|_k}߻ lk/߶{ŋ/>{uI0 Em EM1*DwL>w1X! r^!NtϹAԼUיʕƊA]]6 /ȞѳBP.*-ds ݿ?^ lG 4w۸ŋ|ȇg鎎ٙݕ w}nyBnb:NvA^G\3̽p{T:xhu7RO[/Fڄ㳰9M,`5s "I>ܑR yX#9!9ʹ)%3a(5cP+FQ c4_a!1U@Hl qJ*2^'h8C|?D!%N'h.Q! :M[2@n{yZ+4{O|S9< 5M[6z⽀fxa?Y ! RR[guV$1 dֿ2lf!!\dI@Bf#._*|r7F .fa6eh4!2ƛqfUiGL$1ʎޗNTL>'/D@N_-=9UT,,UE=2R ʰ>'o_Ek~bw/6ySCڏ2>Qv\!E5Rv><162!<.PyQ`P#AwHn% Sk>rq)+R=AA.V8´"⨒0bk 'uM4Q,*+F 甘@4kt)y&]J$'BF`&Y.WLI[9&4wI'ޣ 2`E^Aj $_/ U \1?1kYHtT|BOW@H-zhZ|3G.`^u#ԶP]ﶹ9v]_kV`ʫ;E~짇hOw^uc* (5?rE#rW'h]*LJ4K)9Lv-ZH{-?_ ұ͝K(Ǎ^![X&XLeR6ӹƌ}DAD /̣˸k}b'S W@sblbٳͣ"l-l؅ mvǶٟ~U\Z+}uOo~:n{?mz?S4<^1/Օ܆0=B.b"2S$~.kZI/*m2WX2 Z e5feIZ$7 W!A, YoFOdPXMBGq3~&[TS(5^LܙM<;\:h(j 4fk[a{j_ǍkWo7Zismi=gpVzHgRdSK]\ԇLAp̌1. Z1B9]X^RzH3eΔ'vi$fZ:* !Bv%#.1#R~r~(4$]_x\dx.PO!(>` f1 i6aܞ+qV`d?M#iPϴ{[QI]882K"ovL4l1YوiyJg-z b7c&D`fj |TT'=>,Fb2h#Bz`w1]ƤX:K80`*2Hw B3_%lCa6nf{_ZkO~׽&Ӵq1"-…V77f-;0Y.'nO:TGw Ep-V&g `AF# /~n!XƖQM A  8R8LicvßyQE0hi9)DLX=P# Ul#M tzn ƺVjC0C=4oZk5]VSG?6]h[Wo UE%WT&,H\2| gʜD]dž,{,Eq7z53jϤ+[Oj٤vk_M=`^xb  ̴@ drQ0 :XAlV`[~pcc8{g`8 9`Sw3mk.hf֖"?lWc0(/[H +t2^Lu<if<j jdqC>`~op9T טFZ+ؙ{ӦNM@梉^N1~\k?gN33iW)e[:^m~v<ۆsG|)e׍7OZk o*zf|s*xk;;k`yvXG??b׏kdF\Vk, pgNkV`[ |3[(GA#LV^ƒ#M fF=^:cF".21b:ZkZS?y#[hϔH' ܲn^_5uZkZkZkZk5\D#IENDB`clementine-1.2.0+dfsg/data/logo.xcf000066400000000000000000014220761223327513400171450ustar00rootroot00000000000000gimp 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.0+dfsg/data/lyrics/000077500000000000000000000000001223327513400167745ustar00rootroot00000000000000clementine-1.2.0+dfsg/data/lyrics/ultimate_providers.xml000066400000000000000000000256661223327513400234560ustar00rootroot00000000000000 clementine-1.2.0+dfsg/data/mainwindow.css000066400000000000000000000016601223327513400203600ustar00rootroot00000000000000darwin { 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.0+dfsg/data/nocover.png000066400000000000000000001223031223327513400176510ustar00rootroot00000000000000PNG  IHDR,{sRGBbKGD pHYs * *otIME*90QQ IDATxi$y.̾(dIs_˟u#Q${d3=]U]UCn535 jNMwWUf>Fw)<_!x|ţqZ~ύ=/BԶL߻;8vN{O*z=Y8> >X6_<r6:(Z~=0\sOY+Wͭ =x{7ߧvvqvwq]em VWE &uavq%OmQ!1JAvt@!yaxxhxn0[Ma \vV'{2`ks3fkh(zzjyB+pT+S{jc8h" # G/'Ox 2a8x-1p4f5%ӾA+WVWRy!3 @Š,<=}}=5SeBlmm.D$j6玏1>>RJ--lmn4>p9KFk̦EC @՞slAal՞3-_]žV?#@?~x21'Lyjhݭ"%G0N@a@L'̋ ^y> &9n'i! # #eMY7,wĐ(akw<&!3pkO,zNŁ-z}1GBʠl)D%Jg̬;>>F8hbc}u!t =[{2eSͦ| GJ9e>ŚQt2h߻G l 3#!X͗a-˸1X@rK1S;>>|xmxаhOAl~mFx>`-,1 k l6dY~"![ "|~<"DR"BD2BE Bc=f8gcP@88)5I`6132,Z98 #Gt;fY>z..:6Bx(Q 1/.ep,XJDRb:xk-!#땦g[)qttN!0+پDD_g0\ K9YaNfA&KH&!! CTsL[t]=t]ZmtZA3@"A zI|gffgqܛ7"lo'1O"^fs3qXYa Y@a x`Y(mvM?ǝ{qr5' 0<:rҢS5KFr#?c`uuStW|KOf'Jad24BFTҔ t ȍYVZ>$Yh&:vv1>nݻ,~l:!Nf}DZ8q9?.09<[=n&؋М̨"KxQ}b  mGnf NgUUVDQp!`~OGq$?hJOPְ?F^@ۧnnĔA'fX#CN(Qn\ܵ|1z .2y;X]ǝ{wo~Js?:jobXmUۧ~nd;D} N^AW՘odI M@eĢo1xa1fQM|kŽ{ۿ} 83(03a=쉟 ">u;;v; zh[ A͖!xy SI2*&`b*c%Ƅ)+aY`E./9 NGwm:SA8vw>~oqY ͺ^9/8{,6wnIy L$"˼ac]3A(Pq'qa MQZ#En >s[x{wu\I$zZlI+iXB x_2/Lzivvq9=z=Z~3%U_M"jgmĄC}Xd$բ&RlYԜ`+/+X_[`V ϋKNDU俘e!Iv` f0{cq`)u sUh`q}Bk[[ak>ƣ).\6mwf F % k?z JHqj+}tzbJN)hba+,bm7UTZ0}Z}u9TY*126EV2Ҿ]5 k 0::'^2.|“&>zRa= |@t\zk{/fU( P+eVĈ@$$"6`Rԣ5[UPxN VN/:XPe]e^*Sxf8t{{ koU|ldkj+a~ԋ`emN^ 2 6|5CQb&&$σ* D2 Fb9f v1zWlY4ѓ5H-`RJx[Axx "7`lնqڎbySRz/p5? &;'! LM4 !)yRUߩLLKa8}ց̐Q5^HtꩶHSꥅS֠7"h8:8ƙg?_>ί3,Op)w_TϹPv/\{t;[PLhƥ aC#.IH'H ҢaӼCΦ8Ss ɅI5fn9UX`m`U|Ͼw jȓ%Y6JT \ޅг,,lʅ+XYiD́h! < +4v^db9)3YQ?$}Xչ-C 1M@Dx0$>tfj.[(?^Bڥk8{ ~ï%WOS @$$sLƲȁ )zL9brs Q#Q Xa^2=3+U +8{4x񧹉$:,8hTgb-]ϩh۸qjIcYQnUt\J#މ !:-u& C:lp TduVWv`3 V`w c9`u}xK81o=(񌕗yOu" }|KXY |y?rdyj&L̄MRUEd\f.\VŽd$Z]ʞsH/xx8/[$|˴la &?/kV=u\&+}mP̢۸\$ICԿ!>K35O7ztNռlʀ0-Q?e/ Ancv%+ n"BoFW._FWǟpxV}f ₈9X&cW_gv6w/aE+dk'EMCiB1KPA3 RU].!h ʔR2fix)?בLsx2]|*]Iqĕ/Vh|;wNW9T%jJx` suz]-AJԹ,ACH ݮB%\(MW_1X^NS8y| @b4Xb~S2n`@ST%VkPPyAvfTw#sAZ/Zѹ _<.]W|UYVfE ˻$`f!hAT0-v,"ɘNCXٔpS3T)Ǔ%Me!R΁OZZT Ս> gvhjd,Ngg3L'ScjXx׎*/"Ν=V+@e`EK'_uNb B@bÈeEEnS հqŃ30ӪX7iV͊Ⱦ: $](X9~VV{hu!^`O]v'eDK_g~vلZ|S bLOhp˞w#5V`I鴉 Lҙyj`ZX4)4a{cMJ7ANv1<"`>~ܚ%DdLn>SV5|يj=/ :Xn*Pl\vg-+UҬ+5PF(J0dzN{?/aY'=!o)DE{xy\x~4Gs4n\dPU*SGx<Ň"L&SD2*x(-H)+ĕlLe_US/{X񓕽*qhўg/fV}` h|o/WHKͥvy/A(2K.ZAC8j<< R6L\^sg*FSG[H^Ǔa'*UT!ˮ)!{%ԣb`H1p+2*:RD@5OzbCEekj$9]sx ƈs}m7݂@(zU uU&caZ-R9>cz?#)1L1Y W0̊t6Ufc0d.BU`e`Ynz˕N_Bޏ?9]Hi-KH{|ƗA 8+RW[h4 tlLZՄiv2$o:A#496IlfRJFK\QubLLKy̿6fՊE=As/ŕ=c14f (ULiXOb*+A+/~{8u B1mrm0NDe+8QZ]TM嬞{v 0ѩdyp iԃYf0}%KMV,Ve+S0WGW8J嘭%C|ǥKA7w?y G)P _|hHPt+JGPX.ʛD0`qCUT=aa6t&ٜ"VDӬi)Uzl*7w)klЋ\dW+\t%uqq>3p]mJ(q:nn>CMk`YŞ XU'6I>2ijݥ.pR8w<"BP^GraR1m VDIufl0 4?i?zTkfj+@d.i`%b,޾8NH=iHak;?i'YÞ5Pkg:.nAdi&a!^paL\YJGSuj6u|rVd ]>n4QʹAC* Wt:W?Kn {z?_hO>3+\& xt.|W jɪ(а\ GE]f bqeae^T#H$ lj0*5]O*C GI8κ^^U}?h<\z /E]r%|p:c*hMF4@P][=3ZTi%V̉(I[k6-g[-^zqV.f#@+(q ۲ß=tm0p4<@ ?1Kpӛy3.._D\jJ1pEPuTg%Uqϯ4]bFi{RtwoY5+Z U jNv6]pjv 𰾾=ICRF2jsD ,Ba0E#%pJQPKv/Wؚ\,+ Lu@&["e-zjkWUxk`J}i6= VABp!ro_`K\%(J!Q0'LMs[r\i!ؑy6^1jM:JKVo*A5[,zKưL}/_%*ĵ^:IB3.8(|cF$kn7TwVILjpbb*(W; XcTdֻJ_.P'`7zJ#ʍDp^z]3axlHBAJr{ ºĹݳɎ'iNl.+m"mw B!'biq)T705f2IrF̵cjKSRB|Ż(<^x+;)eN%ݟH1,Bܼ~`%"[aI4m*>EQV6?SL>"2 e9ro9lL4t^73 XJ?U*FNJhO`gw 3vUҟGD8 urDo+M _ xi٘HY蜫s10Lc],6*3Qg_ D2VZ&5Hs**T뫕 5Nx趻Y15nm9i({B._y:oAd^Bo\t mVJe`i\OYҼ͜tdQR%hR} 1x6'Ɣ[&M5BZ \ X4 nm1y*jHl3 ±/UjdAϣH@xAJY5+vZe ϲ hQԍ iPEQ)+)ՒKkحD%a5BO\d`[h}౔R7\ kކ@|2' XQiQ1 q}_;B{`)FR(u_ru3U ck@'nAd K( :X 3StKM_aT l+b0KjV8<߃ m_Neńt+f^8S0p5 V */ZgTH6jF\Yꮫ]+:<ꫜM=PKu6f]U6w:tZ v^xO^I{m9SsgCį^zh: p4 aJL@iY] /iII-gKjmP+`D|@6'קX[ÞP\W*49ʾӊEOyx\ß7u"V#UW\LjWtVyZj)` g0o{&6Y& R6}wA_JjϢۓmqDjĐ &A*3ǩf-l 2~d26vOν;ʵ񀵔:^> k}Rugg'VV 5=lKڋ6dBIO@)̤<$RBxEE,,BE,Gj dr,9CSRƠ3+U$y Tm3Ut԰K T4>gf:6דƢ,f̖$\qv\N 1`ֹCܓ2N^K_-]w-i>Hhs\#~(8(HؾzSmr{!0~cnӳԅ+R7]z3YK YWfJvNRcPʤP5sBq7iG,3C$9I ol wZaVtJQAJ SjaF1zXFsh{ oM57E@%.L֑eĬ$ HOu`KJ?R"l1DjR"HS-ŁajJہ.Jr\cLkW .{x?\m\2N+eaX'^h[YvO9j\R !()Z J :bsݶ._*DfIgB<f0 yGڅil9i),C'eͪ#39aPJBM, Q 5$3f ,4/*pLQ^p!nKUt "_|(ͱ DN9jvk(cH YV]pEN`Rb2b2`6b:AJVЂh؜qz7sŔ"^>5怜Q݀jonQT24'z mp-b`.2%v^!|ewidG("Y*)@(B8c<a}) 676Nnv]0&0K=QbW_1_4{ǸLag&I۶?ZY8{ V+8<:c,hX,B6U|9RWm!\X$1XMYUr^%+(1YJIL&S֭[db :,YR({󱱾-lmmauuAMCDG.ZoE+(J"ث~qq(7P(+X0<ͯ3]ia)$EW#&fV$2S,fsJu` B0xܽw/WکNckQs!V RH2=:!ܹsac} |Ϗz-Q2n(3;#`|'lB>f*lL^@RH 7/Y(bYKUM`4,nLyUJnu¥8 g hcpng rJ8"%L-zgdmJ ̌`VUzȈ" I%ywi"vBj"a/6rTMA6c폰Nq#o!454#j;TRW癘.LE*zrA/\WPlUd$d*~?:/~O2[oQ LZ_ \,(%>e^˜YR 9)Ӛf㏱h8\"٠5` %K-/+4?zvРL杵lru 0Xk`fHdyxxmx9i(AJoȸrz1+ rLudlczKm$74F,-C*s} D kDsB@J,ԙH-=fl?pt4?%D#L4PJk;E_GC2?/ ן^.S33*m̺Sn9aU؍Ej{Y-?EGHT/ʮal(sLMI9ƂkjIi~#լ%^@8K!Jy\ȄUzB `IixWPfj2Yrp8O?l:CөԠEx=uAŷ&WK]H F%0… RC)hݱxG~HhY.H]ꧣHY*eXL$yXHOh8ƫj%^Lw<*{H " ! 0ծH").IJ3nݾg~孈dW.T6F*Z١,K.e˂N[[w{\ӡn˨aU$ŶXEl{5h02+Ʌb]Uv[7U6pnlٽ̮tE1͘eèZ91[hJTJGbxꪇXUV1ٺגz"dNYOdx~7 %K͙RFJ{vw+!'ܖ4 L/ށfmRJI>nR>8uu{ X[]`f!&VՂ x>u^|A֖hfK2f\O;!n[;obU}`ϩ̌~.Vs<qL#+T i SzYg8 IDAT#n*1R2CC'gɜ 2D. \8wAZL?kHV@AtCʛ, (aE>5)Y/Nj&oAjtzUx;.^8(}_L xt2ӄ3'eYeS9HIm%YΟʪulrڡt 0"Vd+Yx\6&G=py=}6Z \8;Z a?U&- B8>eE%4 E6%?rErdž;Dh4ᄃZRMW{\Uƕ˗0NqV%& CO&X]]AO,3$m%yo2pw}/֪ p~)Y 8'}0^@GHO[FHUϡ<8;; ,<5v,\ӽP/̩XQӌgeVp,9C_gsb;3㷿(L>&2nwVOD c8~k %>|ln~ } u)%'XYYAO&)8 sqxpelnlX).L(+NŰ5i'\ ;D6u`&xɚPrb NF;Ok1IR0|P~kwJ(LVˣ}o z-B…R:G>#|G}6fQXmҥKy666rˋ1x0 g8yp<JCRN{l F ؈tz 7̓v{bk N{f2UJu[~-۽ VVWkzƼXG&`5(m*ڑ,P2=nĂ 6PvT lgZǐ,!TǁbGܙwuT>^W 3:YUCh~~Ư`3,Sd\Y20!e{Fk2"u6&)uAbf= ơCYe[U2Vv*mhb ]n`𡓧Ke6?;&FL`%2$"̮Ez9`1ӥ ՈՎ eK,B+u~}NO~{q>K^*zJf~{λWJζ1֦$da{2F{ƴdʸ Wx|{sVP*JVvx E.f& ZwNc r޼5 ^T,+2M (D+hY7fI5 RA ã#QXywYbr 6^,:d'y@@E#~OM"XIf(!:VwADylVy >jugx֡U"yce(B(֟DSΞ;gU?2ptG fY)ɤy*2C%qL xqf1P,)ktlܾc35҄e{+1B^u ?߂(68!JQ+i%=#ݻp(*s+!C^\:O gZσ*)d)ČqJV^s[$dz)ϚPUˆ")Kfi-RԼrgUaݓ䵶uA\MztxqHhxDVZ& DLyӟe``0PJ ^ ,b%1CGGo,'`kC5KJ1PLNDw8~V|/UdϨ%T=OdWy- 2YƬeVToku@GV!A^ˊK mvʠ pxphq0<)O? YV*Y(Wo?9y QE YW]E hi5G8hd֛V.Y\U]q0SL[%2pUlZ:Tc$;r{k2m X s.!"bY6<ƑH'L:-P/iV[($|^BNt]M%WZ~fVG2421 HR{ $x뭷0L{LiBn1^BLMtx@ I`iQB*В%'rg]t 4OpXp6Kol+ǨYV ViW'Y/Ru -e\ͩJSI,yTŖ:mTou|p>660c6{>BCQ^a3o4A묖4P5X8bOW֪/t`!*;t1~m2R ̄+p\z_ rl:ffR#fMywdȕ(S~Ӵ#.`gRktV"+p<9<(}i 'ֳFWxZ͌4Z\6њUNvfj]FM!3,e[~E]u~46Z*WrtB sC#.@P)Xɦ`3,g <g Ga%YGqOh֤)x|/P3 611_5`'qf?m6elU:#65Fo.F_|VѕY+&Z)5LA5f6$W `CZ6ٽ$fCf=߷xISᏬ1m*,P즣Q ir)g7%-eo]AêmozueӰtf`:@I{\xRCp}O:r3*,9 gv: XԟJΣVygaPIA)a^3,(̆ Y5ĢF'EzM\ay㰸|jYSM*yÎyez%Q۪YN;+կ[Xl {zY66ӱ7c%e1_nf]a0p6SJg TdP!^xUu }DH ּu6YkNBj:,NNH3g_ 3?UCaF3RٍלXfNqX:KCgqP*`eE"MZA<raR/}\< d5m2Iןx 3c6!<}{^ᢰ;pT!%$aB&lLyBdbNrcz4}Nc2FOqz$ۚklC(ZlPg/];gB3DGq󏌽Ӏ0kVjOlNp&VVWפ0/J#EE۩s Jz,}HUM-ִX$=R13ڷ\hta ^B.Ipi1Sxaeev( 3J_ok}%m}}ַY{;v6Q\A•< ๫WD4C B,:eU ׿3;%1+޿=qgLo-ba0 dsy~6Mar1 \dW4.r:67qm1U)i[yQ#Z5H:W{ǛA[_y\x $&92] b 5I;`Aʢ'sl8+L61c3{;oצ[8,'DW8{40{xPFI`*0| .b0ӴH`<9qxtT0+w]|;|'qmLgE \8ΟN0Ռ`~;?771v,V:dp}J qGn8RmJTS8Y۷oecڨ;J,Ew_w")hWf w>NMNͷ5*╗_«.L)+%+7EB~8An<*i6;M)C'|p-?zfI F ܸyC_Dr{2l\/)!$\nƫU{\Tr};`*_p(~ ʨ<1W5֋ .7 t ;&ƨyУGGGX ]U4}}Qulnn;,K/f2Ǥ5MZɗr2,ڸ;ژ A`;zGgeaЫKX.*#y'FCSD\<ϱ0-Gn_7}Wi+I6`0`1ۥg۷?oe>13==32`lbfm1m‹l ڭJU5o*I)OZdEFy{ 5Jy40mӉN ɉ 4 D heNy<웝(N: _g5ytp|L<Ʉc6E,\ӡAs)ycdH/\`jQX- /]~`ii%$,J(U|&6=\, LqULgr7py'33ߏz:$~rW64r.58u:nѣSگjܠW5j' N9UJ%@l*.]bʕ8²YUßy̨AX}\}kU,j4ԧ>6Rb2'*3XD}ja vލZsY؈3!]=;ffpj8} N9 [z@:5:RvF4z!9ggNq~Qju=@Uڃ*yΛՆf;H2qqDOhGjv47hi/^C8<>vcVȶEU+'VSqXf*UǦ(2 Vr$8RkҬ}&"N[NcccػgvVNSF5LNc||F^?-̧> >+糿;yda ȼaA)ݠj`ΪgHj~ ̟gMzT)nI4J$~=e}@ ! ^o++h4Þ=3ABS!P}xVVyh۸zukMt-LTwa r";Hf`ƒi\a6$EꊅB֒\@1ŋX,dMϕfZ |7! O9 fA0VAU#~:^eq%5kPeCԐ~ffx3yEViML{qXDq_H EIj@ހ{<5ߏ=Na Can~l!! E+vߧ(}3יB8+# \r$ 9l(zW$Ӂ&x^( qeaAb-^]DD$Bא J:dg7;1%*?'OڬLs&vldi "6%W& Xql,[UvQ`596xFnGw=*vG)d0<5s0ܒ$ IDAT*l+\F\Isd3{>مcHjUDQ 9 sK|#+:-Mo NvJxϊ|JK3}2(%-/fA!ET,0J#+D3"I$˄ fI ?`dt4S{>8bJZsh+SC)M$ ̃*vڞq8||3Įr^#',#:rkr*HXI Օ+Ш8V(&X*ږk!kou+ Yp5]HYYSx r?VV5#JeʊS4*<L*ހ= oqnM(>~Ǔ˼GHI]TY)0ܜ/}' n.%\={l:,۠!.Jf\,B stHi̦j J``;sF ET<$9;֥Kb"A.lrԐ;K/ّ-;/?epU[eTΌ( +'9>Ho2#oaOCCVZD|N#+T FtYRk+KKёZF70ofGqڱ$O,v]՚#"E#M˦8{lm-5MUs +I,*-mfffp?츧Vz5P~B9 dpZIEbs-%yE1>V{jRd'JF&UtpԹPI_A e%DKj*%Z6 Z#~+EM\D,pxjlWF2їc[>\h6$V0ڲ.v -'H;iFg\Rraޏ|{I|)W 2#XD GQe wZm*~ٝw)93|~H@|îʌ=߯|O^Z%ũ*X$Ӥ[Rtod-&ŴiZ$XYZQ4YOV93f }8<kXo6wR~/_C4HՌaQQ;m3lrFr4ta¢7,|ǭ݊xO0 R(7s{=##rZfI~t|\jaS"lKy뎋AIrЈBOR2gZT@ފ(cG"9G>`4a7$s 7$KrVWaӧp}anƲWANe$lT)J ؍i"}?RaW4;8q$a,MdBQVͽB>L w޾w}fg@2AKscNsϊdH XAlh:0QVM5/Yἕx/[+wpiC34x!`䰮W^.&8$3Nb !X[wѣ+cDe#7 Vhy>RP*|||wƥ˗qII TR^85B>'P%{p¾}V+׎jy-'/',c˱N]O Ȇپ rUwvJGm&ƼO$csHW^zIܡpWZi|YNBw$%4oZZ5)Z%S\e֡JHvdN+'9EXn#+pXC<5M}mP1“|# X>2\pf+H~- gejpݍCnz˫x;X^-mQ_195={va j~M$5Ofvey\A7m lMi`\ ,@*#eVi(KRM%9s&^C#dc.]͗Ys/_1:2 Qlk"TY6*V -nR{ \`y|D*yFǰwvq֚X[[et:z=A$G^G^CVCQG^8ك33N.)<ה";hKvŗ<W!]AUV(LAb'ְ,M䭔Oq*Y]t(8,y2.$ 4M}# U"^4R(U­.ld2ȋM\damΎ`v.:t+ BAB(m=3j^QQխ%AM&G|wki7<񴭳.Cy,}];t'|JFM؛}do;p?fGpr]1Haϳ"MO0NWt2QG,!YHVI0o"Q^Z[woȏQ_~88D6Vjq= Ue=G^2̭0Fi'wH((E¤ڂ B‘\nͤÊjmܪ-˛>`^`!N~ؐՠ$Jm'`Ѳci^>j*'Z)/O:ϫkgn d>D3H,);KX8>#l7#*r,3,r+%Ses/0l4Xte3bzu*~`>Xzt<#IJ7P3ԷRO;^[8"$W.mpJw0ڕd=|K$BeRT*{ OMpIHe>~7pcCguhkR B.EPE@ە 9ik[tU=-lآ&gfe<|&y0'sO\ -}vT,TNˠȚ|F R2tK3&G&kd? 3/ (+m̐QNk8 Ili%&n,$|Vҝru+ U@S-OLhSt:Zx'ԀU0DY}f{TjmAbm ]]15F"ݻ "%[aʸNkJJ5 ibbk4a(cgѯ?Z6%a:ަ]̾ogcz~5}UKغ(ʥG͖±irN%h.\e>3[3r3C$|L!%0솖1s+R"/W(듦dK8$L&"a?o޹N&Oѯ ]FCК2hm҆p|8q>{ih4LO"*kCfZnI=h5Hp*DYpUf1%ُ[."!reb|[D3얐e҅5TgU1ԲqH;{vYt)C8}悒LH=oi4۫Vp H>c ZG"VBZ$#O.m^&67pWȖ$ssxN d[VN.`ONpZ?.i)`ٞ_tɆWoy'^C{$dRFl' 0Ir0!VL,;"Bن7b-MI+x);6Rzy4Dʕ *=E:+,.KT42+k J2,*9%tE(ptl EqV !{:S&GZjہ h4I˂ROV{\ZUQ(E7n p|t%_v+kh[08ተIf$I?QVŃ_ /l7RPfNUPM=e,cY%i(Y.Dj$>Ks$7Vo`W fW,idF!\l~TM-*ٳR`)$b{Ën\nfH^RXUcƓeco~,nh=w& S`Q %c.G}U+`fQaYŴ?X %%V9xv&=ϋϡGw:C(6"):'O}+3Z2 \ ]&6Slh(ؤEp IfFԇ<ҹ5Yj)`=!dwU{:7$KR!ۚ# ABO)+Vz]%՛_6T)ᦄ+~,,,> !@( ݘEOV_*$q9v. EUa-r:PV`T8s\'[N{0'²kSZV+!ɫD `9?Bhguȣ%mht&OIZ4U;yx׿ۧ'67];- ymuhE#ܖ jem;Q`f~x` ȪdLqQacUt$4D-LbK,iW~'Ng"_A?%W)M/g"TJ*UI ?Vǧj޶A[V >QbgwpR)Fֲ.bB갠w2% >jTOw)P4[r8k&S-n+@5?)e2 о0kvMfúAi;yB s/dVL@wewdanm1X~y;Q(Zl*JĪ3($-6gkӋꪥ{l0͈^ ecG1.V+t gDfB)%tFm*& %$䊛sze̽9B&EKU'̦!'^1Z/i+.mi0s7C <n I̓R5y}4@s(n\5O\Lg w+YfK”pVh]a/Hn+)9v:Qm]ТU𚦝&XِI&V<h/\>& aNG^l&`ii _y+Xo UK V%UBbpQGA-|Ε"qV:X(w"t6Fl˜aUhҦ2rݰ=}Tc$ a[ӿ|JEWDeu IDAT*a+6+ r wDھ>W -Q2X_c?Ҷ&;@PE/tC1Dz82Ʋe6d:v'u?RȟK0"t{u;B(MZ}FP?Ca]o@-Қ/p>FצXp:l"8"b2&93 R"؉  r1i\ŭo#0pi3dl\]bܒVJ,7y^gkx]&n|k D2e"agq8tց_֝k Ve̎2X;îQ:'S|b%bu`$T96.x#ŔUZ0s0GqADYI) 39)zcTGlcF(@*Ek$V;^0E8uv΅$usP5?orۆ(,-^Wzk+`f.5bk {0Ϧt9 ̒VW;Įv݊5K jKF~#H| y{j" 6 Z4s"YyH4*_~8"X/9]Bdb#2VZY6m<;G|G1G4t]j>-Cp,i*Z Ekz,w%Xp꜕K-CLj^Di =@ y+6!}ڳԲAUbK.::UܘVhšƢ8a'C@ BS׿/DfsZM8굋aa@^^=>kǎ&vMV輢F A'%? K8B |`qDEd@ TUc/˄ ̒5[EmĦYNgC+ʏK' b BBƥ+VH<}u$ٌn{JeHLRb(x8R3&Kw`rvphe/Q.͑Yxnʬn-iI=8`\Lc3dnS_9@{bcFbB4Q-쟴* yb7yHTs.Ba)<#'`+({X{Z fDmnoXv#G *&ik YݠʙUN ,/-=Q}40>56 XXϹbV]."MXSDZ b*t?g+e29[(HF0WLDe kɜ% $HUM_heBY`^x^-t[UTo5Kg<Z]q0?_ڃ8~O`ktZ]M[Vb(Re QzۉT?Npȥ=YrnT@Q"QU { LчL8Oew"ͬM?R3Vt kX-7"bt: z?Ok9M+-^FT}hm1Ss49VetV\7 ܹsC_ÙwNWhF3Qlm/L8L8ZkT̲ڲOrY_sIb[kc6\c:y<AFzYDL@xwwD$ev1lE[Uy6?_g5R,/:N;@jJ($ ~V e`AQ+w\Y9d}qQAPq"hKml1p &A@#̍!T/_:{QDV0{x7AWm\[Rn>a[]DIE:E1Rr%X, ح6a*H@X,z7< 0<&^'KO*nWS-@$"znުϞyyd6{t,nTEPDQ0#"lsHw'L=(Ix+!z>V\  +T$]`'XD6( WɪT&݋8="^8#mYW43dT*ejUc~]Nܠ@E~FQGPj8,As [UMT'=T|w |##Bz},/%3I* V\V(:t~Z˜CcZ]U56^|D-NC`y xW:kjHr1EĒ EVWGOQP6mrJ(bsHD+}8ZsF`iѢ}y<v잂{7θ&,Zl F- O֞öZ,,XZ(cE!u A V"R|a2f3-)$GhIY0~_ +x#/@4pKV[uSinfF6u8, CS4%`(#n}(Vc R9!M!X+eaaV!Kȶl!Ĥ)~.C"1R% 'TrE׍F|k_Ʊ7U*'q5ٶbnAtrCa]kJBiWh[ۿ;LMaia5GC3`~* ]Uge)` t&CAep' WcPۖMC]na,@""Ds8yR;4@;AoUki%GRAt:x?@كX_m 0kBi˶>l#6w!@]! *@6Ͳzy2ZPDa ym2Acg%54XS|G@A| _}A\t)QI=߯93>ºQ`猴 W?^qu>Iq *hd aWZg#_9\2UX+eƾ`gXxAk'1|"<_| 1#{#K%PDh5x1VVVb%Ƴ73lJam6b6Vx^̃<ŋOcXZ\'F ةx/:D-`uuc xrV\đ`J!-9R c"xL7ϣ45#% [n MvB"8 w瞇,2r$;dsxS0E6b:M"Μ=y.^_{Abjf Uz"}`:Z(JF6Yيlؚ9Z!5K v$ZIl2iի|B80NE(;G.}Nl",@wCi\Ks(\_Ǐ~c\˿ƽFX L@Q,GsBy C>ހLW7КI1i@vyB(D P3Uj)1i>ߏt#DB`}}xI?J V)SwU7cz|]Ԕ-kbqs?/_o0>6uO`bj,8Ye+I5ګϊ5 ;8+.g:-ք?Hgn< {y=4Qόd^eqcDOB(p9Yu*'Gc)U*Sg vq`Z a6`qi`smJ կSM1#bN,))X;DQכ&r/kEW7]a [.)"I?v؃zv3;P zҢvZ쎨,m z+O)f(DqG AA$#e"s%鎆@҅0 p3l5*-L=TuRRYW׏N'?,>$Ml$HLg;1%x[,hx6&ӵ5ؐL$. 9 !MIiAbXW#8w<~i<_ܹw _潚9Z20fI酟vկ?Y|ӟDC(ƧF{bD|Aޒm`*+kd `·FsV|vbq NZu!Q2TK2*FQU(v?|?'ʫGE4 SmhK[Xb.?:~_;wbtQ5M8߳ff8+*pVVmGX(ndłb x^cSŹ`O$VaX[[K&n~iP"Pm֍4Bdn'OO?q|{cj::FꘘˁK־"H7 l, T^% ֆh}A|OVɰU؋uX({G)])PawΟų=N9imGUۀuG[򅚦VO8z(>ƽvvFGXc}=m.v_ ܪ4z\s̅=ENE([)8s4}|}ٞI\ ` XZzֵ4qq*~_W^G=0k/>>ƧFVH۬1Fb̛O>$b`S/[3LLI^<^,(MS TQ(2oS's+G_ũӧϝmGUۀuzz o+GÇqG߇V1:x% ،pVJG_cKK 2v9,_&\b"@$U|t:xsk%3-` X7giRMk><^9z(>zo \fDhuad|##pJCJMJV92Kum eI$=yhQHH b:4M֛_Dž TNݙ&"B &Z~ x냸A NFG7fŦscccCλp;QfV #u>jZ 2Xm< 4  #1`K4 VB< h['ĩ'qi,,,f?r/;_@ Xi"6wnj}Ө77x;wwމ;wz9>uz趓=4>L ae|σWy^:cvE`U,"ekdXjE"01S-{Xkbq .ϝܕ9c_Gϊ7h*6Pm՝ S.BqCe qui W.7=wcطofŁpރ9 #cE3ϯy|GY,SR:MraDPy9m0ǒD$;̌^E.]ܕKy]Gۓ%$ P>@ XۏWaE]Zʘ{-^]" x={o^3iO`׎]1SS38F</,-fSEdM)DAB*זu,/-a]Gݑ:<1YF4Nj%Jͨ ^ YX_qEz SӘ40==)LMMc.ځq:j߯}^ȃK~$#D" 9ED0!aVW5ammuaVg& Z;5*jnnA-`jj .]ړ_ ^:䨖$WM΁,{5bA: QsTMRhnVVQ{v$.\6`<v0 ޽Cye|:iQXe$[H9"mRU*c'N9 Ys"­Z=FB`euSط?.^ X7c-@lb,nϮߜ&Eal 49^R@Z۽{7WV6zvׇz0?03=zsS ^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.0+dfsg/data/nyancat.png000066400000000000000000000023251223327513400176340ustar00rootroot00000000000000PNG  IHDR"ZbKGDC pHYs  tIME  kx&pbIDATx[ E%k55u֤ 3i\u-:²AT 4o"@$a n;K>aNľBHu!cuMdfS>!XP`lG@A XPιc愣ZgD!j掝semԢ^4%&'"bU9 V0PpY!F}C<הza1y6j֞w6Qg磶/+e1)^SPh:lP5!Gp1{B%!ȽQHK jVXPp-x^]|<<Z@WFn[ו w\h& T֥\%q3H~ < /\==sۨ$] T 'Xk <7 O5>u | _U|={i|\|MHx0,kH!aUD?g cJ0fMm@2׹]YתG_yI*~Gښz4-'yK&'Xh R=k q6`8_1<M01 6ySIENDB`clementine-1.2.0+dfsg/data/oauthsuccess.html000066400000000000000000000014221223327513400210650ustar00rootroot00000000000000 tr("Return to Clementine")

tr("Success!")

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

clementine-1.2.0+dfsg/data/osd_background.png000066400000000000000000000212651223327513400211670ustar00rootroot00000000000000PNG  IHDR,a?>sRGBbKGD pHYs$G)tIME" IDATx}wgFBX" cc} \LFHP~S(F=3=]kF]>9/lA"ɧ0o俻L!BC'o+gM%n7~3ɗkLt |AANj`wQ!+Yw]$gf.y!Nt@rEI28Һjwf Q g!|BR$%=?$EaıJ!頙`\v$9V I7.iZG~I'a*{hk ղczР?Z3IXLkOjvɹ' 2RIp(J4$5nH$͙pcu@JԔJ-y}Fy 36iǷ!%]"yT B$H`l$g$]+ 8BhTE;F"i&+xg#IG%A5G 7~)IBc擙0W@p[AwTu@t?CriDI: {ע4Oŝ${;Sq5R.8$VL;>q<7n?DS$IzVh{^JRqy?(/G+x DŇEJޓf$ tvZqsuө kU=V2V2B{%} jM~L~Iڹ=k0./L]ynN<IMcIEr V:IO}pr v {d y(P%Sy1 ͐Y(`j- O#*s6$R6U%Ȫx`\qHƼէ VL>ܹJhVlU=AϟM5W. !-㳂m[8 VYk҃4/*CFaGj0ތ{Kƀ*gݭC0j 1-V1 JHӼ#iw3UбdKKLSw6~(Q~|'-Q$TA|U\\jfj vtZmiJYAawL5|2D >g`\/æzSEr`@[J5旼@y`\riW{s?|9i՞( ƿ="Arsk [A-&We碋|f`\9}I0̒կ~m,%XkؾLMRDn; ͷEW ~Yټ T97wKpl~$-6k:t$@bxpk|k]("zv6 鈤Ttw$k0v -/@tmp$O9%57|؁Z/+∤Ӊi>`Ufny0&=g|o:'i5t=`vϘԑ7#y̦-yklc5;wfVi/xY}p]+/R?s5;ܯ c}HN5MlxWJAq_ ýS)T,wsqjXJg֘ cViϡ3vӾ,"/LdoOîy>cOs`t\z$ϙY!T ݵ>kb0c3v4 |F# trݵ>$Q.u Һ%FXQIH^Nn迫O{gGHZ[u:Ԃ/=h_,FS]]#۱{^ s퐴%y.̴Ȍ.:oA(iG s7婉Z3n2\zM?@f+ yo$ Q58sF Nj}fk3SA{DeimvU|o55c4c~{H~,z*|{;c4k5V}I_C'j0BEA =rbo&ѨmIw)!{Y$4BYW}MƮh|fjԊPʯ}ȵ[) 楶\P}M+5溵?sxu|Bd4 ;-iM$_n[dd߄>J䟭$j-ܟk0G>9I7W5;KQI!i%GekE_m;XċyިUc9?75wm$wLr8Er_k M,g x9c{ߙӂ5y]3^s;6ק;9Z.es5;rXv.;0L3 x85WN.$$k0]*0瞔B܃6F}1T dDtd Ƶk[C.l) hf e >!BH뼰VgbiQo A|I3d33 OW۶VSw Ė4 `s Dk$otR+&7c:|y(dS>+ ~B A׈tNjEIŨܭ6\,Z_5WO4HIΕEMF7tƍN { Ds' ¿v,1,DZ캹x ؊/*f@܈&5b !=XY$)Z'֚q烜z{/͐&o՝r䧉m^k:f\]0c+(jp]tSg!Y T{uΛr;SsRgXC=ۖIJ򰇬#3YV$M |if7ù9 NJ+{k͸6"io.*W/?kS5`qכ^m[)~o,'H t> >L6XLq~✙]YOR e$v{˜B68%b^\ ?zIO/L+I҈]Hct)j0n r4H/+&x0-8P#H 8 I_`Ndf{3J[$F'kJ'8+^* ?y>o]H@4IlwQ,PW2 ] 2!eu. Lr_KOJP]MIB)R+$D+ݸDa[kb ($OK3w}kFmbh5ڻޗTZ$O|xBrQ1C$xh5Łj4DF^0y9 $k0H_rюa1uDRlAR Grj8$.pn SHor55Q\RsKu}(6%R.钋rޢʧZ IvdPj35#"%iT>uf9f{ʟVw-r |?$ ?$YIpYpƥ_$HԎ\Y*NYwj~U0ƻ!!yoϊ#*"].8;hfs8%bԊBmC.GT $_pfLapbi˘w&HϙkD#y32`L4all/d,(e*s.뎙ێ6L4(3Qkw#~1t2ᅬiJ@GlY3ſJM"|xBAf$ۉ@I&p6hL? T|L/Dݍl'[9c YE4! !=L cl%$o9@terXU.1qvDR96<_k cjf6nW͙G ؁cbBw=/LY͐]"XN8LӻL,c{hxMbT]6ZwNҏc9Kg`H^{ɇ> Erق;v <$ϛd;V 1I_$9%Izef;u u϶DPY"]~tk&9]7XAKޅ@[|Uu8೴Mk?w+XS]\A0Uw郢7/sF E5pM"aB ӂ!?|` !lV𳇺{Bs{EbdK1XpF0`wHnMK&ai*MT Iu_+S(~B C~(9_wܔ#.Ŭω!i3vHڞls13|lˢg(%>x!;whV gȊqz7yv;-7;yy`p-єNs#H@(D /j|g!FfoBft"  ;)@+$T=.vxbڷ.?Dc1nw9,Hrq(skJdeF&-0kf iߡ'Cу>b XC!KtR/v }+ %M֬4v4t䋍tw}O<M(pu3-K0ϚOCAb52Ø~>Y s8 MotܡهĊSva1'eڠ@J>f;cvٹXu+!I`E1Sb_%$72{߀1!`cgY)Y^ \; 5ۜ H;Z}ۯ]W}d_w>9eIiPI;"4N:P,NUL}?KIUӨHHyCN7ƤL"G3+4ɳџI!=3sGs~'2%rKd'9,B8xjЀb)̬y>!6_&<&[Y+:/wx iŒ2d*HXub@x&"7(i2d؍q>)gfYZͺ0C;I~VQIh8͝c1 n"9Mv=7JQH4LYZ +HfD" ߩڑgW2o3c;✙Mu= 8.ڡ ?ǝ}:\C E^'oKjxuQ{UBu+`sīiz̦W^bcd(㸻0a$2q #'zxv}^.X2ld7yq< u(dȆ J|Z)|}{o樂mJQ=$-Ht \/a\Yޭ%GAv  cmB^Y<&iO*z Ô88٭9 d)fVcf$[}"CHJM~A'̌]i؞r >_'C[_5~b҄H>o ؄*Ds16e@6+ fBҹJ0j?R5f3%/lY5??I'z]a[)NC6Uq%)t05 ml%*ƭoDi]ؽȦu9?pܧ{ >+׺ʚqjVRM=&bڛLA{.cr_Vӽ8bt0&)/5[UNa$nI(aX*]/VO3mH_HC6)"hdfGcE|;=?AV|J3:C4,oG~YUwG6sN*gQ㎻*21 nd3nW-0}&xbf*^21$k3ܷy;)IDATХG= O~*aAhhHTu?1wv *%o}R VU0OJ$遙UmF| ;>t~93)`ϔeN%=zxS 0cfV9hj0:>pSaTnϝHڏZI.feS~6璒>ʠ,qVsz+L @XWaV(K'fȂK3$ %oC_emiƤf6?(AkI3]pL 4&/q%quPmY06dUxk z=V1Ϣ)Bp_q *pS}ũvCe ҧ+\/YI,6lgY灑>@|$Wl&%/&ۇtm$-ϙ&Vc:ԻUY^F~J*<гRL|J jB0;_As#4_@rJz|A~/KF$~TF29%\IENDB`clementine-1.2.0+dfsg/data/osd_shadow_corner.png000066400000000000000000000006451223327513400217040ustar00rootroot00000000000000PNG  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.0+dfsg/data/osd_shadow_edge.png000066400000000000000000000003201223327513400213060ustar00rootroot00000000000000PNG  IHDR hsRGBbKGD pHYs:duhtIME-JtEXtCommentCreated with GIMPW+IDATU!E"Jb0PZЃ/ Vs %+OIENDB`clementine-1.2.0+dfsg/data/playstore/000077500000000000000000000000001223327513400175115ustar00rootroot00000000000000clementine-1.2.0+dfsg/data/playstore/af_generic_rgb_wo_45.png000066400000000000000000000172601223327513400241560ustar00rootroot00000000000000PNG  IHDR-~ pHYs   OiCCPPhotoshop ICC profilexڝ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Чc3- cHRMz%u0`:o_FIDATx\yx3$I&r2 T^sS4|EM}E]ZC4JQ>B4 r%M 9EyoKUYϳמ{^k_I
Z%F;&M"IN:hggGܾ};PRq'${ҁĄDRTXXիW (((>x!ԓH$+hi۶mDJJ C^j511ÕŅ(8g*Jv҅@zyyQT ~mٳ69c r̙l߾P֫W/4H@OOODV8j(ر>>>d|?ӓ:uzE͊ A[mSڨuHHu%mz}A _FpӯMJ-ʁ@:{=W3Sni7?d@pttDծ];lܸr >WZ0)"@T S3Q&GD%!{&Xg>{ paȐ!a~"`ر?~|円pqqOP[nk!D_ iOWaoo]]<rT[HuŐMsss|f1bb !~˖-$Lv˗9`~B{+WxrssIݻw'ÇB5g)SM]=z$I?ccc $ɳgRTښSL!Iݻxa(ݻwdft2?p |z8>.q@E d2-#'OcXkAJ" 4NH:=dBPjk0{J/YicccL{:`Ĉ1cmT;v,1zh444Ν;OXXj5F MP*011C+VŋT*1tPL2E ??Ze6mlllp]!?00{r$&&bI=p;=|q9XdȐ!}B@v@qMMM֭\>I.]BAA$ z-@"A੩C pt|@svvܹsѽ{w,]'Oƅ ZUZSLPYY={jgaa;vHHHٳgZCP"<~"<\ B"ۋ  @g9 id@k4.؁i=qDk⫯իZ T*[PCkllVטSN-[ӧPSS)8X+tssΝ;1m4$&&n-$OZJ8p olڴ V ?r*** #6o"]K 'r9!? .sba i7/羳YmqnYwtYH徍iiٺN ɘC *=JS~@ؿӪUH{EHGmq $)$''$ٻwouuSSS!$ T̒%KZU\]]Ivvv\hR3gh񻹹N? zų;Dx= t%@.[,FUu(6H  jgG/~QQk૫… q͛ }ѐJ?V(--EZZ Æ ѣz swwQ__T( 7Nk===TWW#88uadd\KΝ;c̘1Zc_x1***PXX/;;~~~J9(("}\\\z-9,ks9v:It ,LcRx~=R5—=qz20zfM„ lll$Iˋ ڵݙO|v۶mfnxyT*Яw}Wx[ON zzz$9s I_H$LII!I644pϞ=fPP.\նI[l mmmy ki֭x͚5$ɹsޞcƌatt4KJJ^zi_$~x%28kgf=;?{cR^\ڑ_2to;t$tFFF2<tZ-ntvv˗Bsذa[laMM %Kǎ| ITjA̚L&xy 괉ec23δCs8ڵ+J%i p% jZӏFqh@Bj{xxJ`LL }||ŕ+W^y WI7nԃaaa5k0##ĺ~޿gIENDB`clementine-1.2.0+dfsg/data/playstore/ar_generic_rgb_wo_45.png000066400000000000000000000055171223327513400241740ustar00rootroot00000000000000PNG  IHDR-bItEXtSoftwareAdobe ImageReadyqe< IDATxklzc; oTǠ4vR Zb7DC[T B ]ZUCq(-U(HKQa'j)j7U* ZPu\(U!y:q,דYg7=ܹ=slD|`tV{ qpH$c߈X ;>g/,_@mmTWWK<Whtbq4ݦp---fttrz \mjj*,,AG3(3 *T&(, 4%A.accBi+ޡ=8uuuSy6L ddd$gKnhh˗}! 8e heq8/` 6$oj/*rرb4-m~FuԿ477_$;TSؘR58j)3rČOK,ɛrN.N/0a:hԂ֘ynKp#m9YFjjj\28#]6 x FAG֑H>G/q W,=OJ|"&?W~{zb!hU pE)x("w\n;*b#ܿ;l{Ȉ)B֔m)RkKh#0¡Fعz>O&YфVpc1cJR<=ay%F.+wHGe/ߑx O r0ocV@U{1vd9ypsO0 9K3::R+_2wl7_o܀J߀{aΗ^6M_ƷWl3{s1|t?h*Bֲ]bv&05mleijv%m4%O\P-CX4RZ~>`aI'{J;)蚣gJ{ ec2+( Va2;%~]iK$Mbw7m#5zvmH]oA]k o;y` 2@CO3}L4@xbxB(1{";wt#{? 6s%6>LsmrosA{b.Lapt'U<%O)jPuai0/=,lK:6>f"i#S}pü uyt dκ;YHPy dBK.-{Զ\4⡉M#oˁ3%C_fE ٚ'.<ZA1OE?AqyF@e`Ip?+c'{o ScVzhƖvL~ ڞw1p6|G 1C7IId\Js<-CwNT«BAz*AE#N? Qv8m'`5YwTIt\p*at>E}4]||Lc慕fMgfEػNiR ־0% fcn=hcQy@yC ʯ5$Sg6R߇ygڳxcI#rp/ʩ/NX,\gɌ|bhW1y.N] VE (-PcZf-qW=֙~?XL|CěXe}5C _14BL~TC lECi { M,Q6WI ].Nح2uNa!cR+,[^ 6w/ij8dIENDB`clementine-1.2.0+dfsg/data/playstore/be_generic_rgb_wo_45.png000066400000000000000000000201511223327513400241470ustar00rootroot00000000000000PNG  IHDR-~ pHYs   OiCCPPhotoshop ICC profilexڝ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Чc3- cHRMz%u0`:o_FIDATx\yTU 2ʌZ,*hYbf9i| B4DpH%E@ĘDYD.{POi^kssssE$+HZFw<hW XURRmp)TWWCCCmR /cڵkH6qlxx8%  K,!4$l n/\$@/55bmpaOoHLܼy36χԯ_?J111~ ϭ[b>RJ̙3Ϭ!ݻwǸqPWWP D())?w,,,о}{eyyyLΝ;#33@׮]!JQ]]cǎ:::r (,,R nܸh׮*++\( h߾= SSSܾ}h"ƍ޽{c\t U}&т X\\̰08q9r$kkkƝ;w˗/ٺu+IHH|2҄cǒ$B1$$yyyܼy3=<C=7ohhgy~\2 Y^^-EnZt qTQ jJ!j[( M#@ЍŐ#QPPX l۶ ٨FQQ[[[ի(**z+BSH1A%L.X&1ľ$KAUjc7agN}Vdd$r9AT*ȑ#1z ==߬NNN#G- dmm ++'* fff]Wv`gg-Qk2V0҇,֐ĸJ ,QU K2 mZ켰no؝ի ݻw_~iU/_BPsy#,, +V@ff&=^zI ۷7nĖ-[/߿@6ћoPa߾}@XXf͚jGGG#((OFvv6bFUVgϞŅ \իqpttŋ#GX;nǎq tu #k<^dI?nϱgxfpcwL},oU<~@|wx/311ayy9?NDC dIK.Iiii|LLLd޽'-[L&Iuƺ:]heek׮$'Lv???dYYmFgggvܙǏ'Izzzy)3Iĉtss'L@ %߿999-YQQѪN2M)zx?Og.s| --yyyj>>>$ɒ,$&edtt4𫯾"IZYY 2ӦM#I>|XH!I+++߬e˖$#""4iI[-/""EEE/Bܹs&?qD&I h&ŚΙ3 CR- r r_,ҐH \ 2 tAT jL# } lr5OB+"##򢢢sss 2'O8p@MvϞ=#G^^^P*} xyyԴi|-Y¹s`„ -طoZaaakkk...Xp!|||pVdk׮joEbb"Ο?'N 22?  Dӱw^!A Ch7M!4e@qg x`PCK0XA/?Q?VǩSްS˷ _ &&555裏` 77;4i*JXm\]][LSzFF;㏛_}UDDDŨ !$$'N"~_[nnn(++C>}ecسgσU!ȿ;aܹOOO888`ƍO,23]|c.rlEz%;ʻHOěc*+zwo>CsȆ +ZE3u fee$٣off&w7)M'I*fw/_$9s$:bRSSI/$3gȑ#i t߿cٷu֍$ikk9s066θ85ݻSPUHYXXH'w`+? jI ܶ3/pW(P`e R}v!& GPVvU) ̞=[p7;n7oXd2̜9S\???#99R0b 4\ΝѵkW f_Ϟ=ѧO444 )) 5j6<+TwޭvޡZ^^^zYH[͛7eeeχPmnŋC&޽`D"|puux%7OI 'gs­};R878%??Y9d.5g:ĚرcRH%uttϞ={277$9fieeE'''|\=~z0==]7|Cԩ}ח(Hh"fffRT2%%˗/vABBȜ糰 OΠ 900`vv6,X@]]]>|X-4fRI+˹mdz,K>W)z :u-,,(~TطRie޽$D///rԨQ>IrƌJϟ|ښL&1Ri_7daaa ||Xqt~ț|9s1]ve?/ιé-0$u҅$y7odHH 4 bo`cq&/LL&ԩSQYY'O_zϟ[HK-YQy0tPO>yw*JtO5ev{81@)'A{wwwؽ{c;BVVS zquuō70n8TV'!BMM55{XIb_,{UBbxN>\l333gnFRCF9d$\bSSS¸8n߾ N:QT&أG(̙3Iۦ}Y'W@`JG}6@644sHrfhj ֭[$TUUA"YIyT*!accÇcܹ022 `+0ת*}6RccD[[[[ m ;q"%{SIENDB`clementine-1.2.0+dfsg/data/playstore/bg_generic_rgb_wo_45.png000066400000000000000000000202221223327513400241500ustar00rootroot00000000000000PNG  IHDR-~ pHYs   OiCCPPhotoshop ICC profilexڝ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Чc3- cHRMz%u0`:o_FIDATx\{X~6 Kl.xA!LS3K֣yI2c v2TD #X"x6?'m$3IAMhhh=Cc7RGn n޼Dk׮5jjjj[n*J%jjjjXZZ^1qI9`aa<;v 55w [[["33SԧO>ѣ L8;;A__'N;Xt 1Ґ(r5 ={Dll,(Ξ=QRRrM__/zr2,,ܵkĉLMMe||sA~1T*ƍ {g4( _~intt4RRR0iҤ}y&f̘,>[YY!** SL%K퍍7>@d)J$'wRZ-䄗_~8׮];;; 55.\@VVj5R!CMM n:=ї3gV,oر#)6oCr h?6i=6B.Go(=`ls.(b|*tuKՅ,--JOOVBrr2Ο?9ss&hTCG&n#aS)l_n! ">>>CLL /_;v //6l&8q;wF=pԩڞ t݁``JǠw_N+˻\Yq#RKXr +++N:]vT*0a HT*Oܢ"I:88 XXXi$?˫ղ;wÇѥK L?W~Lޣt)Ld='Oǹ|QQQe1x`ڊc1A =6{3=0hˁV{ n*܁ Mj u}->-vF͡cǎE5mmmf,Yqqq3P\\ pvvnC/QmZJ8p0_|;w#āJQUUݻ7Pa͒ox?9;;ذazjDFFޝDii)fϞ pssGwXs[|3J|[unJk)Ǘ]Grﱼ{cg !d2n]A ZZZr I222R#‚۷'h۷/I-fOIzYHꐞN"9s$m6ՋǏ}Zi LLLhhh( z({fܹ4zAYOx":!߻woILXXXHܵkhWƊ,Urr8߹qq84 ~*ϸd٤45oȖѣHɡJ%h``^zyyy$QFEuhmmͮ]ѣd_uk0ao{y$9e1Ą$+VP___pBj6mCCC9sL}||H  mmmcǎZt/]$ӓ,**bSS{٢˗$~d}*9yXw9*h/f7~K 'Ғ+V`yy9Iܹsܳg5kp R .dff&<={pʕ⭢Ύ[neFFwͽ{rr}իċ/Y~=K. e`` Cd\`Vy9~mu9HNN#SRR|] `HHjfee1''sΥ>+Y߭dѯU^O=Y⹍g~wm^1jt҅δD"2 oCCC+rFys|֖!.éH7CzpE """4N{ __?X\r899ի3f *+C瓐~T qz`<_t^F`BBŋ3;;|S }ȑ ȩ777ҥKsСCܸq#K.Ti 9zm1A6mI~ۼ.>}z 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Чc3- cHRMz%u0`:o_FDIDATx\yXպ !PAҜ8TlRc]36*r zsG AYPfDI`߉6ܴ2=<÷5~;OD {L ЎO'-P |TUU_[nɓ'%D" 4 .>/hqݻ)H`~wH29I"""z!˗d({!D(0?V9<2ڴȋvtt IJJ`ggWWWʕ+\]]qMTVVagg8TTTnnn\.Gnn.^*Է̙3?y&rEEER J/())T*J%ZZZHFFFpww$ H"==MMMzsB]] UUUJ埾ƒ$/^Ho,t^~$aÆw$jVTT$MF4iI?]FMH /!IJRjfffO8A&I;wVYTTi$Rz  I:t9J%.%F"(ǖ-[ ///V* 4fرcR0c TVV$1rHcǎ)bcc 'Nv hn$!...P0`<<<#G^ё5 WWW"==]o-BGG;T*D"iH$'kcc# //3fĉ!333dffiii?|BP@$aذaPTA^^fΜׯcѢEB?sE޽ѯ_?HR$&&B,#""hmmH$VgRUUg}1ك3go ~\vJ%mۆ;w"** d<<<0e 2Xt}e?_[[d2 jaaaPTXz5<<|g˃9fΜ \HQh$ahhR˗/cʕ+QQQ:XZ[[addhooVjjBSHHZZZӧOc޼yd jkk (55jP(XYYɔ`ZZثW/Ξ=[#GO>h44hm߾}IP'22---(&&&-[FBZ %%%\z5P"$}Y.Y /ҥK$ɴ4dy+677gmmm=IIIIj,++5077|]]]ILKK#I;$Iooov.\Heii)Irɂ27 cvv6099$Ⱥ:޼y|WYUU{O<I… LOOK#1onׯ_SwA_P>,lFq8::"88DZZ,,,0l0$%%uk q6o,l~~~dqqq􄕕[a011A[[:+WÇ)J%N>lL4 :E CUU`С_IGAll,Z[[)`nn{0@z==RҞzxA sa]p6g \T@>a qaO`kk{_-1֯_dff7߄Fyw kz|VlǴ/V $((񈉉~={ 8p`f-ȑ#PjjIqx;w.np]QN_LbXZZ ;MLLhoo rsJtss|g<3Eb@&Cb A/+`$Gls b܌^Fxb (//X,n݊B455v킓ˑݭ$]NmmmH1A"@@,’00 ٰ27»_Ď=m[P(=z4:::RRL>3f^^^011ѯ_?y)9::ڳmիW/8;;C.mDHpw2n0\ -H`eF&hBuC<\9zvn{ÇǸq+Wt+ގL<#""5k ??G#<СC~|ظq#\Zi!uSO᫯±cǰ~"22 ݱ{nԩS(,,ĨQό3GOٳgb >upwwGjj*paTVV",,L1gΜ.ǏG߾}o_'0&rġ|I=Gغ]LhbRk$/4y9(44TYfeeZ=zVVV'|:0a ;{l!K #Iss[j zzzț7orݺu@$Ν7!i֭`yQd@@fmg[[侵3rtZw"9B2e ''z̙CBz7n$I? K/饄$]\\ BxZǫV"IݻW tJ޻w/+**K2==]O~$ICCCڒ$njIF.K,CP$T.T!T!'HaoABqvpm{r Ӵ׀&<2G@,ҝwBǏۇb„ xg?dw>}:0uTh4\vMٻw/1uTX[w6 sss}]9s3f ΝۥP\\mذvvvpttϣՓxWWW#%%N'EAb֭wB \I7*Đ)HRⲇ3; R0 mJ!uR`=Cѣ {{{ ;\?v'(gϢR= J"455 X֑FO41g:u[e;4==7oƹs琜Ǐ#::ZƘ1cRz .Ğ={rg t/֎p 2VcŢP71ZM k8y$`pvv+WTO#>>xׄ4too.'{in%`JKK:x[o5燽{-b!G[l󑒒tH~ix{{#FƍVaڵ]<!1 nnnOY$Kg923 R98KqvY.MeK89 f}Y?%l'~Ʀ{$]vٙiСtqq!Iu:u{$}}}dd\\\c"I!5,55$I___&%%Ýt ѣoKYlY INNN\d Lcǎ^^^³իWի} zŝ;D(P RHלmpޚm(wT)d;J% #܊è- .c $ZXX dXx^!!!Dzz:ӦMøq:>>>PՂ裏bĈhooaoo@c  ҋw?:<#6mx Ԡ B_NNN]WXL7DxW6Vᜪ .h-ܺ λg38%|, ^15u6LXJN]̤ac9LizǚYA,,,dPPillLSSS>,..&IΜ9hmm-o :88_~ 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Чc3- cHRMz%u0`:o_F*IDATx\iTTWj(@ 28[N#bM$qִEƨ(J b|h)D[H@(D "-F[ {?۩`#u{OHgdIt6mڄ4\z˖-?|3A?b$)pڃIճ٪ @BB>O>@^^0a„>P8}o}\\\0lذ'9+o 7$qcJ'''VRST*T*ۭW^rH%#n!}b Lɰ/]GrXҪl8wp}o~Ȑ!=z4q6qU444h#<<QQQƭ[pIt]///a֭ݻw1-4}tݻNB\\BCC{~ٳ[}SbpttqEdff"//C isq%dffĉ(..ƶm=z3fhm=piٳ>I氤K>̡g8>.pWx"7I5}XWWǍ7ߓV!;tvvf޽H5j0$$)))@gggӧJ+++$KyhZ2fmȓ'O$'N b~~V3H%%%eZ$Ç׭[Gd}]d||PK'VUU199Y5k֐$h(>k %W}3f \\\Uw!dggcǎk&O @Vk$}dCBB0rH킂pv@' kyOf'`ˀޖ*-y{Qe>i3` g8iHII8N[lڵkZ,\WWV555 K|_#4ܿ$I[[[.^IIIׯkɷ'"}ǼwСC_"@W r9pN ~V62C쥆}]ҨEsO$ÀT*Аd^^Irڴi@sss!|ʊNNN!I&$$2=K%*3փLή430/g<>׸OY?a=ӆԮ)maa 6$cǎ166 ܲe G)L(rJfee111ǎƍP(}x59r|w ͛7344ׯ_c`Ϟ=ΐ1 @8V׿nݢZfFF?#j˗/377wG-1,,L޶mkjjx p400`||[haWWW-?=TJήb0|O~g+w̒IQnmݟgѳgOR8_H\mjTj$ɰ0SLÇI]oٲe,((ikkۮ2J?ӧ޽{ Rr΃\;\ν},uԓ<$1chչ$SSS ߹svj.%}`X#Q \k9&CH&aΜ9™3g]T-ג\.ouⷒ%.]q|AJdM%p}mn2_"?7Kkll7|Z;3g~&I/...}6^uTU$&!BmmZmS1gOIFBrߏ5JpĀYn~RMSLP@Fd 9Ɍ :uwA^gٳ'j=yd牜'/ZB{90XPP@Z@`N… ;ApI.'񏦦bSSSGoڴ 騮D"'N}IVCP'NĒ%K`bb2N@om`,ٍ.Ն$D:J=={pHMJ_'IENDB`clementine-1.2.0+dfsg/data/playstore/da_generic_rgb_wo_45.png000066400000000000000000000204261223327513400241520ustar00rootroot00000000000000PNG  IHDR-~ pHYs   OiCCPPhotoshop ICC profilexڝ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Чc3- cHRMz%u0`:o_FAIDATx\yX 8AdTF +c7)LLqJҮCf(aI9bWpVEdRp`AAp8>zz^{_I<V @@$o$>)zD... 6ɓN3 ǡ"?0e!jI Fo߾%?$HfpΜ9$Tf.}iCAr _~~~$ɠg^oMbccreVVV(,,B  HB8;;w*kddz jw^۴iB,CT">>@˖-affL'zSN!)) `bbvA.C, IIIGee%ʄƭ[ #F.GP-[L&CJJ JKK ɓ'\p* r ߴiJ%kkkYQQrv҅k֬ahh(F*7h dQQܹCҢ?ITTvL,..K$D"Wɓ'* ֭ accX DBkkkDEE!44[1/^ ===F.cX8;;UVܹ3mP*ЌʕFΝ޽{#==`kkǏ 0`jkkѢE >jyccccccj ã677Gyy9`bb$iӦݻ1b=+JH$ub|tjTVVBTBECCc.,,,0|pٳ<;O?;wbժU& 3fD C$ QZZ>}~={0|T*(JCUUq?L۷_[QQ cXX9Rk߾=IrѢEBZll,$ߣG6jܲe 088$}a˖-T*Hz"IZ[[󫯾CJ,++g} ,?g-Ǐϊ i EEE癗Gի3㽱1o߾…/Ro߾Ͳ2^xJ|wHLII$=== k׮%I&$$ʕ+y5Y[[s/^Lgvv6#""h``/RR199IIIaJJ ׭[G=z4I233 $ӧkߟ422fϞM۷/iccB\/z;6l/RX^G( oGXX1i$b"++ ߿?K.E\\ PSST3f@T xW%ƍlق@HHrss!!PZZ R &PTɓQSSعs'\#--MGA~~Q711:m۶/vЌ/5+ W C4@+LO̡aw=>ݛA*B miI+wc0qvK:P(KK*FcŊ8{,RRR駟BV+Azzwp1J` s6g\Y?!22Xt)v؁DGG7|jhhӧѮ];t Ν{^kQjdJCIYIγ\^šK&RGL)dEEHCCCZYYqܸq,(( I\Btppx|wLLL|qGD!ёPa_9Yh_ &c_0h?%(((X,6l؀,TUU͛  p%ܼy?EuuT EI K abJ"< %7нs f ||lٌ>ز\>}FTCbM۞g\M `cc^ XXX,ݻ#<<~-֮]7n @5j~g=z ֭[G@~#oߎիWԩSʂW>|8k8::ӈGjj*rrrгgϟGjj*<" ²w^=ɲڵñc:{kko {8އN =r_ip1v+4K+#yt0(00$?^fff۷o3**fffˑ$ $$ !>(($ƇՋ{˙El߾=SNT*\|9ښ/_&I3QI%%%ܰa]\\ءCFEE$G ɓ' ...$cǎ͍3f I&޽Mkƍ,++{:/_;|~>QS'c9t,ggx6p=㸋 ܵ< J3cNÇIC yj!HKKcnnntN533#I6x#""_}6L4$y!-;;$ߊ hխ Eӄ=ƍ#I6 ͛7Ff͚ŤFcǎ%IR:>LjΜ9)CR= r r_(ґDzpD"ZtؑZԕUxϿ !7}O+ڵ ĠA{ӈV:t( Z-@hh( ssqii)`ll_|3g }Ř1crrr(oʕhݺ5lllp!}hDauΞ=?\fԩhhhoN'!ӓhR2" l jbmq :uHXq |4jЧOvݺu`:;; \HRꫨT*E6m*q h...3-p.]*mƉŨtׯرcVKɣ777wXv-rJ_޽{QRRYf|Oo,ҳ0Ы-92<}sg?^ؼ^6e#y/wHdj+nYM :::$I4ʷ=JS٦M![ .$Izxxp̙$7هTuD[ncccyA2Ą-Z>}<>3{*p:u"Iq̙B\zzzr]vJh"w%Oo,V I!Փ@W(r|6r;T(6H6R#6"r},\ s§R &cq"//o$hd2L6Q(**BRRv܉z`Zt:t;c'z:$&& Æ k C+++uVCwAWWї |||O>AII all,eggפzܹBԔ!0}t"00,88j84'duOy~*fۣ?{=?rHד$G+++Ȉ!I1hnn.o׬YCkkk:;;ĉ`۶m,ƍ9x q߾}=Ց$'M$$l2P*… $IZM6ߟ{AAA-wءuZ%KH'O=}||͛7oAK$###xR99|&kS9I od7o~ͳ=qx?wYҒ˖-cii:Uطo_a@X̹s2--QQQܷo/_N\ި~;;;nٲ.]ݻy6u[n\r%.&Zɉ `xx8׿AZd.\ ٳtqqaBBB0@2e W^-<W\aVVgϞM8p@-hͭ?XYp|U0 6?"umWg+/xx.=غukD-#JVT*mm۶$W^MooopذawIrԩd|~)g=QYLFSSSJRG>j(6)O.X(fs|v #;ny~FrBD\j 8Q^ǎIqqqEq.\@2ķ%`SlnV4B2 'NDEEEap%5R(6кuk|'x7ТE ̛7JeuuߦE+iq.;ś҅!==xw{v튉'>߯u Yx뭷wMBˍۦb「 ]߯_?A )S 0##)ǭۇ ֈ@m.bsɒ%LMMerr2=ʍ7W_}iDZ#>|#oӦM#u}!꣏>jf[h|sWg̘̠3gΐlZ_457`ŊHLLDee%$ ^ėLفZ\.- YfdƟAչVVV`akQhhh( A!Xj@wbzE`=IENDB`clementine-1.2.0+dfsg/data/playstore/de_generic_rgb_wo_45.png000066400000000000000000000171351223327513400241610ustar00rootroot00000000000000PNG  IHDR-~ pHYs   OiCCPPhotoshop ICC profilexڝ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Чc3- cHRMz%u0`:o_FIDATx\yTW V)VH[ZڶQQDLjHwQǸ :Hh 2$(,E~GK‰v'c7rϹN}~z+Iu8rHVWW<b N>ZqIr\z5jVV9l0?{{{VUU׮]#IٳvZ͛7Y]]ӧOsrraÆ6(JVTT򹃠]vKDB\NBAsssիWY^^.qtttR\.ʜh@4iǏrʸiӦ6+++VUUKP$=eM2L8uuuɓ' hllFAss3+W/gx!jkkMMMBYSS#00;v@cc#H_~%T*Ұ~z<|A7o4't:b1Z-:ΠE0ϭc;v۷ѹsge &&K,6,--qi`*'abb|wAff&tHMMży ꘘ5wO-[޽s"%%o:2 DtRrxzz"99wň#XXXnN!11F^^}ҥK(((@\\@yomn%30qD?~'NXBB@^^P'<<{~B9  e}ԨQ~QjǏGΝT*CR \JD";m=4|++ -ށS; H!3k|~#OZ!SSSHҶ Kvt{u~HL9 ]=_dff888K)Cشi.^+W`ɒ%B`m:;HY <{'X 'e AAAvZĠ 5jsW^ѥK]믿\D No!qōCNjܨ>űkfP0M屦9U*MRdii)U*swrrrHk?}ӟ(2S1$r ^f8hkpЀ!3q1| 666(--X,-oߎ|ף{+JKKqU?%{'j4444}O?[n۷j4ivލӧO#..aaaܹsh}!""ΝC~~>|ƏuϟǥKBzDjj*pqܹsX>ɓ'ZK.8s &[zB*Ncg9Dx*~G.d9Ʉh&kxy6OͯGaaa$?ϼڲN-7d >\ $IZJH'Ifggs?x ؿ~B{!!!L~~>I[n@???>|7n$:99$)S=88$YYY۷ۛݻwSHC !2))M!SR2GOf.f%1uo'"? l ]ϨEcik/ɓ$ѣG?3L_ɓIXH2,,Hv֭$Ƀ? $;&<+(( IkjjhvHHIrFN6$hT~!;j-ZČ #S$MLL@wK|nUMk5|wӨ$@`` ܌]\\e^hhhqojyi-)j-STT$o|AhgϞؿ? ' z¶m0uT\x[@WJ 0[nEhh(6oތ{j?ÇQYYE |,2x:KT12(CxSx N^k.$d'ܳi lr$kTnooO777>}ݝ$dG}D… IGmu YYY$)d"$d?~ܠNM`mmMKKKx4hS3K.}Gtuu… @v횐Kի#>[l .b._jTj$Ɉ3Jƍccc#Irٿ,Y’POUW&ƆRs4iZӃɞ3_<s nƿ1u.M3$\FFF}~I))) ~...m۞Z.D5d(Ì7С%Dv;cqWSf2d2f̘={֨իHII.zfϒ#/^#G~Sו677˴Z'TDDwͥiZ\v x뭷mtثW/̘17ѣw)~ˤܺu 'NDMͯP$Dhhhnoۈ9h;v^ksN 'Ol9sH}ܹs%KJJHؑ1v w/\@KI ؔ6mBzz:jkk!Ht: \\\0zh,Zs|- V (N%fffMJ @2ZwzIENDB`clementine-1.2.0+dfsg/data/playstore/el_generic_rgb_wo_45.png000066400000000000000000000177241223327513400241750ustar00rootroot00000000000000PNG  IHDR-~ pHYs   OiCCPPhotoshop ICC profilexڝ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Чc3- cHRMz%u0`:o_FIDATx\yT~2ʨ J97EӋ &X^)L3 'H"E4'T.]d4< 2Wkuo{GDO9Eh@1%eaaaHIIAMM 444D?NDx0sLcij$UgJ$h㗘.]JWI@5$$M@/Z$cU AX&WI-1)[lASSS֭[J򒽽 C5{5l0hƆuuu⊊ ÒoJ}w}m*1J_*HL:::(,,vލ'bĉ 6˗/GQQp}ʕ+())пwFqq1DaΝ;cٲeCEEakk LMMM444`5jf͚,]<L6 NNN(,,=VXR`d2\,˱tRѣG!ѽ{w˖-6nRUV͛R)$IE" ԩSqI`رRL8fff)SPQQ:`HOOG׮]3gz@ͅB_~ B^Ghh( CEEHnBII fϞ>5j;Ġڵ_YYb˃B?_mmfk>p\]]qx{{ 4h-[7nCԄcǎASS󹪄}}'~ ATZZZBPmuuu@qq:rOccc3D"P*dB###AS Je7_֗Nlٲ)))Ux`QQ?SݻwiccCmmmfggsӦMLKKBRR I&Rx***zjrJ]vZk׸sN&%%1::ZK@@ fbII Ǐ׫d#ٓxY2**OV[ƭ[ŋ%=tpp i ^ Lp`;vH1b K. Юo߾"N4I#8m4`Ϟ=:o:t`pp0ϟY9s=aaa?~SN殧GYzzzjuE",XM6L [چ G--/CCC2@ +FWV_uz@pΝz:jJ!K$@ B=u&H.-i{cH:@} ɇ72!mmmtttaʕ+X`JK ~Q w ,_/L 񈍍?݋<$&&~jjjӧaoo={䄁m$#TaHǠvZOG4L5өS ͪ*Ύڵ9YTTD,** ?V]~$ikk\ꫯ["1 !ѐЖP6rISf`s;OEEE022BXXrrrPSSbDFFEEElmwʵpP[[" C$r dZebI7GY#h˄69v턛S[҂[q~Tcwi]vprrjkѥKy )YZZ311Sվ}{tرY|C$i"bHXC#&(e2N7G/0g)TeFsp~뵧^|~0|pDDD֭[khh+WP__쾾>BBB5kƍ8z(:wG>}M6!44nB@@@3AhҤIصk c6Þ={yfzׯ'ZXXڵk$ɓ'LJ$YVVư0:::[nLHH I:Tbl$Ǐٙa)S|? O܏`1Q!}c_2|X =J=z3ի,((PI,--BAAA-H266_$-,,:1Iȑ#½\dNUUULNNnַI2**Jm\oooZYTT\jyҥKjLBԤ)I (rrܹhD%jI +ER(Ѩ%vHl>@W!S w㆒X-TЈ#h}!;;9r$}fH"HrLx sT ڵk޽{:::Ԅd.]t9@*o߾T*EN:555=zԬR4GGG̘1]vŢE鉓'Ojf^t ѣxoq㈎F]]P7 n̙ػw/>|l 1UFx MP }aɬ]:k&P`e[HIIxxxcǎjVVVظq#VZxO?*3ٹZccmZLAAرcŋ7s 눊BMMMsBR^m6L2iiiJWS30`" Uk?QVVy [[[lڴٝErc=Jq|yN;O (w s(9^=]&^5 _p141i&`vv6I222RDH,QM}aNHoX$ʹs$>222Hϓ$SN OGU~… [5\\\H֜;wgbvQ^X__O'''ʕ+ym}eo=M_v\ \MMnGXܺ@QY" 2t* Ymv>\s\ƪo U*HLLL&Z>>>())K?>|xzݺuC= x 0 HOO9ƍ Pw( ,rtjs?>PXX}}}a,kkK,L&kHO>NNN cnc&,LN^՗9Zxg{~vCjy<%/Y/G}ɺ27OMMMn:VTT$/_C1::ܸq#,m\d ^ʄ:tׯo1ښwfff&#G>R׻wo2((YYYxT9 a@@cbbEH$׿7nPT\b[ .077}3g͛`… #G;;;A`n©5W97Nd>}r]61&8sN|ppp3(~T*}ꯪRi}FDD$7o1cPWWƍÇIfKַ` ז~2J?I&-A`a ors95 fq|% ?Q$Dv6p< JdNH_C F`rr2gΜI///ƍ_u겴&H7nZ-Ȩ+!1׬YÌ ^|IIIܾ};ҮJHN8zh9 ䷪}!amyXOO$Sc?n3gΐB@tjj 6 ==ՐH$xQdF )Jhii GƼy``` `+0Ԇj6&vm*q^RhMIENDB`clementine-1.2.0+dfsg/data/playstore/en_generic_rgb_wo_45.png000066400000000000000000000177531223327513400242010ustar00rootroot00000000000000PNG  IHDR-~ pHYs   OiCCPPhotoshop ICC profilexڝ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Чc3- cHRMz%u0`:o_FIDATx\yX~3qPPȱeai&XZiS:\'JTp@Bf` 9(p`i7Yϳ8{o^k?$~E^H$F4R)A0_ @DAA]vY\xJmr`ܸq>@RN Jm&Rŋ%N$El^n] =Ai$md$'|^߶y>ayf;w5gϞݻ7pIApyn݂ ,--qTVVr9:wBjtrNNN;wկT*1l0#%%;;;!++ P(兢"TWW dddrssTDz}$ɼpttСCQTT;w.FqƉϕc Dqq1[N4 ܾ}`PT Duu5QUUZF =$ lmm[T`aaaknn6˯!H0h deeرc̀Z豀$>]GŌ3舌 tjzfjyR BaݔH$xJ ojj*$ >S >FaaaCLL Əwww^CZZՁ@*Ow^$''#55Ȕ?2X[[Cբ ڵkD\.qhZZ⭮FHHzbaժUFJkVVVm+۷/|׸w QZZ*Ç˗MݸqcƌKļiӦ3`Μ9d8tRSS;wDzz:t:`HMMEFFFs899yО 艧6A U l%xbA H} 튁gFӝl*d9?;w{b(~d5\4O=<==_ 5,X$;v -a<#NmoĨwYl?s$'7dƌ:tQTP((//ڵk^<666"33 .Dv_mKaooӧO?L ;w35q U1>5KلKg4xpL2عs'<==qرc{[t: M8˗/|+ )% ppJg\tD& {ptA r|7s=f呑۷qƍ:},պF㟶lL R B hf}θWYphk#B4 C"::7R 4h޽kR???8;;n};vNL&]OMMBE􄧧C :t@L Mj5:w,JNL )I $p7^f]jܭ5CcJrѣ'VIk$`l޼Yt t[aoo;v>êUpXԧO$&&bغu+_ x0i$l۶ | >slڴ wȑ#{#** )))@~ZOhh(/^ ???瑕C.]pY\t ǎ͛7rJBӧOcذa/:.],%Ʌ}iwO3x > ,9U;aRD3^n\z5I244ݝѣG emm-u:_xwĉrJdzz:~jBW_}ųg_gxxTAgggŋ$^zjGQRO>LIIi04w\SrӦM dPP5@\bϜ9C^Ç̞={+~z`||<d2:y=k׮Eq pve@ L pLNgR9l {'ߙoy2h~(BnY@\ź#ټl{߉I]9s&Ir@L˗/$(L5kH4wɬk_~% ).\dԩSy)!C$U*)oߞzoÝ UJP )H(ȔP!J:VxNA9@e PW 3Yz+dF ۙ7=1d ..Τ,!!W\-ѣGveGƍ=z`„ h4Ͷ-[@b„ pssCccpuuE||<<==h"/2x zpƚ-[ Aqq8F111 jl=<...X|9BCCqI&-[PYY {{{t:uuuprr† t|طoPWWضmZ-\b6n(!2s)H%7M 3 J7}/&mFItj^fwxn4Λ:9j(h>.]+V#Gp9L8W^(''xD[_"662 .l%|饗m67r9jjjݺuǏJ&o~ףG\p/n݊Y۷oD"AW_ƍXd `Сh׮mMD s J dJrs)f%u6n^RU;h?!P,g[SXi ֙TFDEE"** !!!ZFQQ{{vb[quu`@vv6)S >>AAAHHH@BBM৻MRpEx1#7N}GEEJԺg[nغu+qlڴ BIʼn CVV=v 8rs dJϠP 2? jᆧ=+Qb a ݘA#braܸyaji]\v %%%b4hĵk3gܰ0dgg#''G}}= bbO>Xz5؈@=oFRR0tPQhhhoj!//{T*Ş={_:Q#F0i|BE%^ocYz51k,8::bŊ̖j)<ω 9"_ĉUBwi=2m*/džә%lXBCChHׯ_ٳEgggp,))!I7t;إK׏O͛7VE!!!`ܹs1cP066;t&滻$n:Ɔ'NɘFDDp5kI&%%%ܺu+}||سgOő$ׯ˗ >2e jIX|xY$$ Z566"//WjhlJǨ gI뎿 baa!IԩS\h¸n:^vK.mVT~ b@J%'"WZ˗/ܹ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Чc3- cHRMz%u0`:o_FIDATx\yTͰdfD))b5525똷 *F`USԳI*"BLa "lؿGWZ(Zb;}oHr 4t_| ;@Z7hhhAS{{;D"郹sw1fh۷S"@?Ƽl2%iARȮz#XfggS,w-Ɖ$9Z `7|Vuy>a~z,moo777Bqĉaoo}r!Ο?˗/ 0qDܺu {[J(**( T*\p011AII J%T* nݺ,ܼy0661<<<`nnD@CC R d2磼())AKK0[nAV?=8{,Z[[BV_R((#I^p$yQ,;;:%66ׯ_gyy9I2 $ɫW$D3f Iq{I\~=Iwo$ITPfee;F!ICCCYTTa&L IW^];.\`KK ϟO[[[͛t~wm j%D"iH$$pttĆ  ooo1{hZj JBPP*++T*AC #6oތ!..[n-qE=zPSSؾ};o+Ibb+BCCѫW/xzzC Amm #466nnnCFFƿmpXl!˱n:f͚^z\RD#@HHlzŋ1a="077GVV^4Ġ.]D"R燼<2e ѣGbC*"22hiiH$VgV1c \;v@rr2N< [[[\v 6mڄ["::NNNB9IaΜ9Xv-Jh4d000V%@Raٲe3g0uT$$$֮] DZ̚5 D$!abb˗/cɒ%Ɂ*++щ FB!nj uRڠj!agg  hjj͛7FTWWZXXp@j4T*`UUIrɒ%m,,,X]]]@@LJJVeYYmllyyyF,//ٳgI?<<$=66iii|g-_\),,$Iz{{UVJ%ϟ?O2eCBB̧7ˋ={CH#FǏ'!`@___*JN2$e!8vg֓7m"XYsq,:玜$>{݈f701̮ɘ_2jQ-L$I;AR'O&Ij,$'n:dll,>#I*JAfΜ9$ ϊH:&&&vh{$ɝ;w;}t"Ν;YYYIO,ZzSN%Irّ$AАzW E"H %I 5WHhنv#C|t8&zȅ\ZZ0\91bq&9r$|||k.Fk?'m6@PP1n8ڵkΝ;؈qƦi\SS___XXX 66GԩS1eʔNub޽[l͚5ppp~Ս իHMMŲe:̛7Z7nOPȌĐJ:R#1dFb $P)Zp)ư?pRg#|i.&=EUU`ذaw)GGG;\?v{!(wӧQZZ Tgy JpuudnnnP :мo&O'NUٻbj[?|HKKCJJ k.>|8T*Poܹرc"no Wz:`r,W(E3ڀT XhkY=bKǏ&MrJ ~)؈ i达NHii)`JKK:?3۷/vܩ ~aÆ :u*RSSɝV/0x`[Xf m}{EUU-Z1b_߿ֆAOsҕXpg84JpK8RoKd뾅&[Wu$mۦWnkkKՕ$L… It $)9s$E&%%tKKK aIYd]8???3.\Ç VGѓׯ[[[#CFX,ҥKC1..V^ܺu+srrg߿o\f1//O OOOFFF244wiӄg[[333ظ 55^^^LKKcQQXQQ lhh XXX%KPPpoAǾz8rfC.C2KRt?}<5T١rS_@PӓtppH$:RJMqP(8a655$͛weYY𿓓﩮L&RiwW^aEEE w(m9f%",b|3#7qXKdMedd$Irȑzez"I<<t7lpQDLDkfn4vjKc!$0{lرcz999HIIS(Ncxb3]tm*\9W㗢DD@iQc&h꫈֋<gK۷o HҋJJJK/_> VbNoKH#FJ`bb"ΝiӦq~X[i:Hn0ad4Ɔ+V`vv6333ynڴ 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Чc3- cHRMz%u0`:o_Fd2,--puu|ܺu c"##ǏzzzJhmmERR{/H$ r -- pqqR) )) O.\PZZ/E{m9s$4ԩS ݺucCC8j(_~eIheeŖIW\!IǏOfaa!Юߛ6mbCCI*666ʕ+lnn1cJ,,,dAAKJJԨ]]]棢"G__AXYYI 1-33YSSLONTT411T*͛7ƱcŋJ nnnTTڵ+===IӦM#Z[[3888k,?#IN<믳ӣR Ϝ97nܠSi"[ _꠭]v!22{쁓 Ə}_~P(1ck׮#G@__J-ҰuV̛7 JL9s_O?www~- غu+~'lܸb322={ 667oą 7obҥ ;;;\zضm"""m6t OaDJ 00(((ŋ1w\1_.fffGcc#J%```]]]k$R)AuyB 8,* J}ܹsѽ{wO>AUUJsimmm7Z㻢"_Ȳ2i\b<{,KJJH ~~~$>mdkkKܜEEE}iEEE裏8c ;أGVWWsժU>}:2AAA$I{{{3=z$.\(f۷o)O0@%\!T.Ѫ$ ߂4h0lʟ[v BaÆ.j `YXXW^dz: T)LMM]ZZZ$Mah̗s|89xC~9׎dx4+w0[[ӷ2ϰ6>BS?G!!!$ӧ?.366fEE=Jccco)(5J&I~b8uĈ{Ǿo>? .]*ַ|vO$ٻwo1֭[\f Ғ.]"I= $Y^^p:99O>{ÎkNqDi~4G9͗~=WND]˹ ʭlܻ</Oc>Ç$ǎ HOOg^^Z)SH"XH2$$DMvÆ $}WZEe}]Ŵqqq^|9Ir׮]j$vb+D,XjӦM#Ijjǰ$9|v2ZZZlhh0H h (d;DC -|yI0GFL\ TV0Z TM> yxxwVۻw/`ffQF᭷Vݱc;L7nJ%E]vƍIqeeDo>~x`ETTZ^pp0aee244nnnj򙙙r_VVD|df͚JG4 %\!\K6RRH4dֽ|'[D$hۺxf` hZkl|K _wRkHuذa윞  {?z{%ٳgA0h Cى2DE)R{=/Ɣ)Spԩ{2LQQQWWWLLLi&? 8~8vލ۷oAAA>|8rTCHpmp r9 d֏(!zh 0XB܈~zE'Oakkomm+V@LL Z[HW#e9۹_z%ڵK-L-͛7cڴiHLLVzHC `رΪ}?3˱`#`oooѝEZ&,K.qb9N=G.;iyi?zM޼߃-UܶvMMlhhh0++$c|SSSh4Edsss;Ɵ}I͍'I8p>$544Ν#In߾nnn<}vM`hhH}}}x6lC3-zlcc366cǎߟtvv>s^~w^ѮxtgwT]%@ВAS5eQ5>]Qhiy9.ͧ4& 3Byy,F۝{E[͛7ܹxXr̞=[ހ 99{Akk+0rvr}􁫫+m1d )) 0a\j]t/z///(//GAA Ķlll:tS/Yr?aaaH$;w.ƊnRBLU±ƙeb;Fcͨ<|Y#[&Mbkkxחa.]8p@$'NH411ݷ}---٫W/8q555G-~~~411'-hKK Iw Y^^N\z5uuu)/\@T*ܺu+yKuheeEkkkFFF-_^t\${֖^^^eqq1U*_|vm|$ɘ?hmnJߪT\՘ʙS9y M lW<1_2qf|fff\z5+++I)))ݻïÇmJ\d yQFGGs͚5T(jp۶mLKKyA;jr `pp0CBB!'ٓaaa bTTxH&>իWT*>D:99aAA_Α#Gr [dvv6-ZD]]]tYUTRM9 N71tR~ˉC=sab---ȀNoiz,A/θv_Ի> .;Cc ^"g;~Ĉ@rz*-[L[NrWP9?71LLLrJ2%%ǎ-[8hРgv={RLIٳIrS^8:gΜΉyX__$bLH^~;'9OH #׮]$B&I|ɤ>R*Ǝ p6gm`---ε]Hu(T*vuޖؿxIENDB`clementine-1.2.0+dfsg/data/playstore/fa_generic_rgb_wo_45.png000066400000000000000000000201031223327513400241440ustar00rootroot00000000000000PNG  IHDR-~ pHYs   OiCCPPhotoshop ICC profilexڝ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Чc3- cHRMz%u0`:o_FnIDATx\gXT~ 8H/X@ (LD% sQ#`Lk g O4> z1(*Q#/MAi#JysĘu=~^{s]e I<@>0@ ^_8{%gAAu!)) j% 4 `ddHBh4j@*I@"SN4i:t xśuڼy3R)T*oߎ,\7n4 ЬY3t oFEEA `ccI*'$$`̙y!%%%fT*FK,ddd<~jj@ffs_^~ mCesg2*Gsssm&&&ϸ{n&&&[h502*Aqz%^aSebN,߈ꧮoƎ \. 5k/b8~SQV0T,L>戈C_N777J`j6 ([,O9nni~o pƍ?}J*?ZTVV>9 B @ +`S(+Pà[Xcb:߶mlllХKٙZW^ 4KKGJ%,,,~ k,M4y,ylt%h@ dF )d ZXjjeFq:vl+p~#wܵkWnɸs_h;DGG#33111ғꊍ7"::}233^ Dtt48x|WضmfϞ ͚5uV;wNBNO`` >3bϞ=|2\3gӳC!==gΜA^^>Qan݊۶UVؽ{7ڴiŠm?Owv='$P=vϾ$(K eJJ U*0$$$j'ߟ$ARIB 6$SRRt,u… 8p #""XG .B fdd$ ...TՌ!۷o|d߾}>qDd~~>ݻĉ$I$%%[hA<{,}}}iӦ$WXALHH`ZZZ+**eeeH$,2=ez1y_ONɊyxd+ׇBzSilܷoI200̙3y1cƐ$_Nlڴ)I2**J7&&$C?AtuuyH[leffׯɓ:?cdll^F"I;zu &Λ7OT>׮]0a5 A#IW/^N dF)`(EsZeX2`ʻhgUy ¦1k{c_=z@.]7ʕ+G^0f~ǻn:aмysۨŵkDM6J9<sww=bcc8r^yaгW7oaVg@+C@LekP~z}9 {{{z;;;\7oFJJ *++[n<<|>===2=D~oɺ:t@dd$>t5k kZ1QRRQFaǎALL D"ZF(--Э[7c,RXs94WL?g8#}!xwK[䯞C3ȻɂrǗCji֨6''$WoggvQ\8ٙ$y]OHj]2%o^RSSIiii$/nnnLHH`rrN:L`nnNsssl8gGW\,)|L^ Ϛ74w]>lGGGFEE$Ɲ;wr֭ܽ{7WZ`mJ% feeq߾}Uhjj'ٙv˗]v%^Ε+W[U۵kǍ72::;wDP?iii\bӘ5kO|h4ÎmԵkW̞=UUUP:SZ-*++htu ӧOh{-̙T7C ͛7$+5ATV<-IĉR9, &&&ӹѲeKwnnn@qq˧^yje 9((O3SV9qD`˖-LDWWWo߾녆CBBr|(6m5WWW֦}=,[$UV=R׋m"""YXXϓ$?a7RBCCIrMݾppt!!!\nc}jƌ\f ===iݺ5###F`ԵkHҳN I~YOOY$uhj ɓo,YgϞEYYNFuO͓~FFFpttD`` O P_Դ+++kJRsKVW+Xz]'e%<IENDB`clementine-1.2.0+dfsg/data/playstore/fi_generic_rgb_wo_45.png000066400000000000000000000202021223327513400241540ustar00rootroot00000000000000PNG  IHDR-~ pHYs   OiCCPPhotoshop ICC profilexڝ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Чc3- cHRMz%u0`:o_FIDATx\y\U~fDF1QRA^MLSuY^槉I8㈊^Eqġ@&E#x@?OJc^}ֳ޵D$ q>4x.uNX _U*ռk"%%jFFFϻ/.MMMDҥ NN:m0@ .D"!)N}I^&iIR0\vHsuupP(M!ښµT*ev(˩T*NXL򢿿?R)=<<(˟':#虑!tJ/)puXXI/&MD %:88~~~ׯ+++ $7xmڴFs/=z$VXX,FCCjjjFD"zѨСCP(=aXZZb JQPPgggTWWCT"66111ظq#R @ΝѡC᭷XZZP(PVVX*899… زe Mgp̙3hhh*}vHVwuuuB>L:Gvvӧ\\\fTWW 5555rRZZ KD"i|C)jjj0yd茰[nJݻ999 PVV;;;j;EEE ɓ'e5 MMMzsD#'9666q7VVVѣ] ̓H$ ȑ#ꫯdP(~:zP̚5 ddϿ| CBcGӧJףGmۖݻ~׮]٫W/:99镙2$$fffappuqԨQ477gpp0͟ K,--i$JGς[m A߭sχnjWfBjnh|!x#3q|l۪U+(233{n$''cΜ9O͔Sl Eʳ}aBg 8bVyC^uL0Aopppŋ?O$ 0k,XYYaj}^^^@zzRVl|;m??@en1na9HHRSXSSysδgϞrd~~>잸Ij=+Wdzzcb#1mZ%v`߲fmJJpttDuuPRrJDFF* nzC1dTcc@=L RRb# llbN١JQ8m wUuV_f;n(lݺfN|شiΟ?SNK.;1|aϞ=µkpi8tqiO> fӦM)1a'g+ֱۏK] 4U!O8pCӧymǓ$ $HݘdLL 'I7̜9$qF!/77WĉzI;$[o۷  Fﳠ@ҤIljjX,3I2((HHXQQ?Ȣ{@ .$%hӪj¹.:l Z i0~{fourrz(իW/3(ǵk`?yfݵkBCCѦM5 (((tbccQ__1cRx{{0=z/ 'kgg<-\...GEEv ]s 7nٳtLLo1L!L)L!L~~ 0ͬ\q m֤An%݀+Bh?f1uN@f+={DZ|SpMruuuJpvvtqE{xx1{lK.Ő!ChctҪmzz:JKKѥK=DK"-- {ƍz/_}^7,, -gyv @rA.!nyۣs-̚hPp5$Mx!CA:gpt4d#83gDYYǧ|@_ǎyyylaIz̙z2@亨N:aʕ1b~s45$j hwwwTTT`ررcbbb@$ 3xTVV н{wx{{cŊOm[sOQfsXiv# f|TVʟ|3?5gwWs#B˫fffqI2::ڠޞ;vX,100$ɻwO>$/)}fp91b1333I_5o>;vL&̝;999͖$8sL:tHh/q;v/^7n7oǏ$~6!5tuM5` m/æmõ-Zܹs,XWRphZa(311Ann.RRR ě7oՕŌY^^ΰ0zxxpÆ ,--eyy9ccc9f#~ہRJݺucaaAzj>>TՌgDDGA ݻwٶm[=Lj~gq}Z2ё9993W3;;w1fsb;Lر9R)>L>۶mH\'bҤIСC兔̙3GXXP(e[???cԩPըԋ 277^C@@ (bҧOH$teIӦM{Vؾ}{߿ǏKXXXŋs!qqq"v҅F\εkײgΜ;lҥ\b>3Xr͛z 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Чc3- cHRMz%u0`:o_FeIDATx\yTq3(6B 9SfyM!4 K=1kTp4,#j"̃̓*?VZ(Zς;>ӷE$q), @ @+z?$w c.|Y^^PH$ 444t1ch\z(--d QTTR R<(JNNFKK r#?HW\!I?~\(KKKcׯ$9tPݛ$YQQR7pĉ$JƍׯpӦM$_z%T*e`` SSS 'N I$ϟ?O dnnnyL2$YPP|VTTݽLPPo޼lKq_}UA.""$իWIׯ{ Y^^^(H$m䑟 [l3T*1p@L:cǎR7JKKaii 1b mۆ`#** ۷o Ǐ?3@ppp;FALMMggg)))B-ZGFZZtttpD"B?O8::K,A~HRH$V1Db2331eL0"000@jj****{"77ֆH$СCT*憌 L:1cz GGGHR?~$?ƍhnnH$JBϤo֬Y]v!>>psr[n+++<33 Ell,D"Μ9]]]D{{ &3͛e/ďS1#Z[[!ɠJ###Rʕ+1tPddd7@VVo˗ahhhjjB"Yh$ \bxyyaX|9JKK)IB. cNVTPTc4x`̛78q֬Yׯ񔩮̙3AWQXXp6*Νc`` P[[eeeLLL$&''3((ziӄ:Ɍ[[[9p@[䧟~* [xb۷ŋ|\(HHoi<'|޲e )X[[͛7 e555ܾ}; .INkkyl 8vI2..*EEE455%fdd/-I$_|NNN$IWWWvI,(( Izyy h\\ {QAAALOO'&$$$cccY]]ͦ&jjjr…$d1cH/^dJJ 3339`[[[͛'I`sZ޾}Z.]TOaaC*o߾vׯ_W1h #''ڑ#Gx"0g#,, 022СCf f͚&lڴ %%%d29sF0=<>8q";-ݻx 1k,8::b_;]~~~Dhh(***ƍCAAaee^z }`{`hhv玓*=z@C݃@)LKڳBO/0{[ ۹vRT@P} c`Ɓu0r{$с_-.֭[D⣏>yN6hi]Ǎ2nXvi& e Fdd$V^]v!//111xBT*ǣo߾psṡE...1bģ\W&TߘN~a9I5Ѵ_{dN&rmzC mb3;;uuu;w.GBA???!zX\\LBͪCoD z-D /#6] Q\\ X "'' (--Ŏ;`mmbwԑxp8C$Zȴ%02&54q^&h^O>a9~ckϞ=ƨQ:E:'R)+tYi ;.R}gff33{W^ӧoD"K$;q7LK kH`bBL QQ '[Kl޳?] yÆ رc)+njmmEjj*ZZZ\!!! êUÇgQkcȐ!7|7ڵk 촐㧟~ѣG 6 ,, sNԩSȑ#+/ٳg< 6uǹs琖C AAAXߏӧwYo߾8v]'02}s/'8s$ݢN_UW1 kc&Y]CNG6ls{G ^c?^6mYH "I^t{dd$ /?[b Ctvv&k׮%ZZZ$3f}ܹBShh(د_?9r$)D5O|$9iҤKXPP|$r,$a5ٍ7$### _|IR7oI³\ NOw+HwVϏ$;;x,--%~-ZĔ53g$555innN=zt'---6662 >CR- HſER(Ю/quv]hQ(;k7n\\\g{";;?~<|Mo5;vagg///u޽igӸ044Ddd$O?ӧѣGcƌ]yyyP+[~=,,,`ee?Fu&ḯ@bb">N2χJBhh}*"@-LKI7j!C!RތB>OAӐK+M@/Z+cڋNj]TVVF0x`( ;\` ::: tY@*GCCR)llla:okk4'''pvvƒ%K0}t:u[e;4%%UUU0`Zؼy3cǎaϞ=hnnd1zh(J?vڅ[nDͿs" (g!X6'TX&hR` D[MU>N< 6mVT*_?Gtt4 i议]NcۅӦ#Wnu:bK.ݻb#9h lٲ3gDbb_;@rUJ >7nD`` ֯_;v~jQYYE<==aggoEZf}@P BdKKK?3;Hr iii$);w$FwwwСCtFFF400QFݓ>xn87775#dZ=zTM~РAliilʕ,))!ݻW+Y$W@K @m3X^ҩ;_ӂbK#eCc*+ώmii| ;̝?^/111dX`ZsEYYRRR 455gɓEEE044Ml2dNY!!!DXp!\\\aÆ6mלFYYE)۩իW$z}k8y|fg5ч_1z N/a~|as͚5&I^pQQQܳg_sѝ2zb1-[K.ȑ#ڵkeۙ}={~znذx~!9$$YYYlkk gQGG 11NNNLJJbnn.XRR±cvJ SCC\œ.^r| Œ.џטϹ7̰]aL<(zA ‚"OH{~Z*vfxx8I288^^^2e oݺE?G}Ģ"᳕=d2S*vz~_ut {BurVn*og>&QG"{b.CBBHƍS+߿?I2!!ᡀapaa!lrQDiw&D-d/95BV/mq{P\dd2̙3uuu8qZyzz:J],.YXX?ĉa``?JeJ)tzFN™XDAn&ڊ 7@xxZqРA3g~(I/...ǫ?IxY6@4AH{OOOA ?}}}b feeqO;^MɝSLQІڐ=5/brժULKK xQnݺ?;gÇ HrsǽpY XTTDvd߳@O;O&$;1= c׭[ϣLzQ[[T*1i$,ZFFF lR__OCIRItttZry 8J:w .BzIENDB`clementine-1.2.0+dfsg/data/playstore/hr_generic_rgb_wo_45.png000066400000000000000000000201021223327513400241660ustar00rootroot00000000000000PNG  IHDR-~ pHYs   OiCCPPhotoshop ICC profilexڝ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Чc3- cHRMz%u0`:o_FmIDATx\yXպ ؛QAT2㬡^lsȡ[Yb^bH9GpC$IcA-~n7>i}i!";2PIr Ew`Mmmرiiihii^S{{;D"z)̝;^^^{@ 111H$͏0;$yI_FDDt/c˖-#} OXܽ8h1Y[lAGGGї_~ ӥlmmѻwo(((Б=z4pQ  ARĀ`nnj999P(Dѣ\\\`jj R\jC. /BRddd())F q N> J5VO,**"I~#~"I$-ZD433c^^kjjxuՕ۷ogkk+U*X__Oooo>|BvpժU$ɂ?@ #I:3PTw>$YRRBp۶m$:DT*T*ժ{C$ߦ][[ WWWƍaر6m>C@$AOOOT*a``H`ff_|HHHF9s ??555… އhhh(533{[Qvv6r555¶BAvԨQ$ɀ׏ǏʔJ%cccvJ%.\(=z/_[A'oAZN{2//8o}1daƍغu+._0L6 _5RRRpDFFb3pqqALL 6oތ'N#Fr>&Mš5kₓ'O"++ (//ǰa...F~~>9lڴI1}.뺺رcpssw@ܒOs|`*>G4zgpt7FH^I66'imQxx8I_Ғ LJJ4SN8F%${=!Ri&yǜ>\bʕ+Rd~޼y&׭[Ggaa!Irƌ:c %Isǎtwwg ݔFtww'I;v3H_5p,++rvɫW_Q’%M:j:'9,>Dy{߸Ƚk>a 43LHH I;ApyVTT輟>} Inݺ$o>G}$d/utF>,+++ %755155U+W$٣opp0I200PlϞ=R:Ad9sFG~֬Y$I}}}ؐ$d T*xT E"H $%ſ5EzRؙk.7b[oiTւ١9^k9r$<<<Sw^FٳБL07n4{Rĸq`em766fffطoCFF<==3ft#..NlÆ BQ͛7c:EEEv_WWL;Z2CGGvqŐHt\ \ pQxbS6R> U uポsww.w1 ;;; ;!;N`u}}}ѷo_APQQT~---JprrdZZZ3X7;^{5˖-Ӆ0tW3gΠ^^^:YYYa۶mSp1ƢM z%ԛ;w.vލ@v[`З5m1 }*p> ,ШnÅ۰uHKKQW^Oj*$&&BTb…xzzv9Ώ.6]Bwz--AgNvH`5k233 ;OOOcغu+°aDGGkQ__%K쌍7޿ڊ.d1K9<9 <Ȧ?/r֥վSx'}FRuh1L^߬GkzzzB)lmmMGGG̞!Cɉ$RN~Iŋ|RݳI8p y::9MMMKU&I:88pLNN&0%%EGLJ*»>W\:wQ H!5@_h ֔\U2&}UpA}ORaѢE˸ܹ_樨@rr2d2ϟnhh(jjjpD{{;Ə- aaa7tP >jĉu )͈DEE;LLL}uo033rppM|rd2! """ m,škVyy-8r8]84j 9n>ӟ;12oMʔ)loo'I2((vvv444 *\@}$hk.2""K%AAA$ɫWrӦMٳ'{ݻwkYK[lƫW&Ikttt㙜jvttpZ}|$?hf|rξϗ9 -2'lÂ9 ˇmccõkײ$x211~)mb1/_3))\nN'n]Jox9߿櫯#7x`nذBR*I~@777FDD0,,qqq 2~mS0//> EAff&ݙò2VVVʕ+ Ν͛7 ϛ6mbKK XZZʥKȈ| -N?ry%vĩвx{# zo`H._9 FOOOR$nTzϷRimFEE$7oqȈ'Ndkk+Ir޼y|MVVV ={=ՕdT*zܧM+Wt {5Cnu^4岳L|V;y,#pA9rNٓO>IU;AWK}{"Jf"@\ & d=avǢd ASS?S~9:uJGe%[[[xajj+Vs]i{{+_b}xM1bJ~,KfW(xj5 0p@̜9QQQ:G):t%%%Iҋ.^^xMMCATbJ|飝/(;w.rJw}$-\M'3qD9dC\İիϼ 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Чc3- cHRMz%u0`:o_FIDATx\yTW,," mk(LܵՉ&FGqÈHTD"lRoP &qsSջw_H8zFw<||UTT_;v@\\6sh4Dѣн{@5d#۷ڸ+H21I߅M[K,!F RToՋoxcccIrHn9sv ~~~\t)===̜9~ 'O&RF;>>7wV Fdppp9R)D"]ׇ RSSQRR ̘1+J"33йsg8882 HKKCYYz8qFCC#66iiiaLNNF]]]/*>KKKill,999`YYG׳F'% ҘtLJ|AƍYSS'OÇO3gͤ$yX[[˛7o$lVB\d5jݩhد_&2,--urJŜaGaX,y]AVGGnbDDPƴ&oߞ$vZ`޽9j(e*@`ll̒L1D|)jhh@}}=S>>Fdd$K߿وQD544… ܹ3qڞ+{7E%q_M Q\q01JOsܚYԑ*SSSfddtrrbvheeӧ3??$O++7jb1̰cdff ޽{akk|\v {+BNEuut EI K abJhttq@̌O;{7R Rmovvv2'-Ɉ[dzbHXG3e2| Ota"/πK'kFl@҃߿?pܽ{Ez59ccc ,, k֬۷qI888hӧ:M6a۶m{.Ld#M2{3gp!!,, 1ho>ĠAτ W_ .\@bb"T*ѿ W\J‰'PXX͛7 `9z(N쳝;wٳg>p8\ဣuOE!MbLU8kx2'NgQPPI/+2333433{>_$9|pAˋ$rJo$&I-LJJC\j IڵSSS 6y V}}}Iܱc]\\ح[7>}$9d`@@...$ɳg͍&Iٳxafee5;_;wdiii>A 05{'8dz>?9!S\#dTTPE'366UV$8I^^^Zu{W@`hO6$K 鱺EP$TO\\S)t2QC#WpOL]ԗU'ćr5WaÆZuDFF,,,0|p|#Ghݻ0n88::b̘1P(++d8j3M< Xr%.^777 <8tV]`` ,--ѱcGTTTٳ͛7HHH+;vxEPb$M|\ \ 6Z!>:l w!~VOO;׮];VVV000;̢+ҥ\HɁT*E~PUUT {{{AJ蚚&ϫj8:> `ڵ+,YS-:{-9)))())Aݵ377Ghh(p%={d0x`aMR^ "<~"< (f>A Ԁ. mLuP=sCq?i򂝝V k^ѨܹsQXXpsskv@/MkiMy&N:Xtip^p!Q8XK1mڴ5& cT0##$w^zRI;;;>}ޞ$YWW~7g}Fٳ'ϟO<~x}PT$I+WHaaaٳ'yĉ&4&&&422GOOϗg/^ܢNC~:Ϝ9%: e9 WȟzRH$씰[&`/5lweT:̛7O7nw7& rrrL9shEaa!RRRcǎСCu ݻwG@@۷/z\zVVV?~\Jõ; ;vV.\bXhֶ0e ѿ9$$"| \]]JN-JLz?He2y3RxO? 1s? W'MDFC̤h``@CCCۗ$ɉ'֭ͅ[imm.]ܹs,//gN#F~ӧO9GR;v-h}}=I>MLLX\\L\~= R)Ijv/CBB8o<->>>$Rn޼;v d7a5k֐$gϞM;;;;111w6i/$IFGGTظY[*SLfG*ΨUq"s蛭⹞b?\Q_1tN`oŰ-,,~z>x$cǎ1""9x`a@Xe˖1==OcǸar-y5>|QQQle޽Ƞ ^~]Ϸ~KtvvfHHx!ᶓD"7޾}jϨ߬9HHH ż<pСMX 7o̪*޼y\x1 B#iA`䌪t1 dޡo?&^ȢaL)gtEk8pvv---)~TIRi:I3f  ǏǏ$-Zyyy;d455T*mRاL‚fA Vr֣,Jc;^ü2l'8Dj.CBBHÆ Ӫ{wH.]z- x۷)-Dd0{Ya=B NaW|ז !LYfΝӪv.]Rm%KKK,\#G/_J5ū\b].F4b,ލV&V__ׯgϞu]89~8222^Kҋ+ܹ?(/곘7ۦbN?opz֝?d }||j*޾}~ip5k !"9׬YCJT9s;wԺ&ߚٙj:$' 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Чc3- cHRMz%u0`:o_FIDATx\iTھޛYFEQA@q<LcICֱRlP1 5SSO= 1PDEEPcdFAf_ߏ=ƕV9ʽֽX K)yf8qXrjiiH$Ν Hhl帝;wR"@?Gd&Ic6u,s>IF`Hzz:bq=066fuuuSѣGI h4,..t}gڵ+I.\ I1...$IwwwvΝKbaa!Ir}133S=r1fddI񬩩acc#r9,XRcHϟgqq1]\\矓$Ϟ=˂Ĵ۬YHȠJ%ɓ'O>=h:G7oK///uȐ!y&.][[[̙3@rr2LLLツA0{l466bƍ(--x{{COONL>}`puuN:>}hnnƁp5899B޽LHh4=Jrؽ{w`ِdqUlԩ1b}7{j'A?}n= bAz8r)d i = 0p8N߱JBT*}vA dIgMa LQ 5k )) iiixVᓠE &n#~k^[1ۥ01" @ll,c׮]G\\^z饧POF=鉳g>0x1%'VŲ>dW_?Ls)f)srrX[[@vޝ̙3aII Yttt|[N^>Q$d 1$:t2 "?+z -FC455EII b1̰yf梾eeeرcQRR =5I'655i*"HȔeb-:rMFUY#73`fOiڳgJ%l~~~x-700 ~?kkk8;;㏄ 6-lll= XXX s{pʔ)lѣG 'O"!!!$L?(&''_~(l2A&77$Jdcc#W^M˗IӧO{``yfgϞ<|0IWj8qѣGNN>$m6!8zmٲׯ_(:AS8I?r q"cN'ϱs|*nb"#^aȟd"?=t#:D7nc 33SH󺟧MFBZ6l IFEE?3 o$8 <#I:88kkkߦe˖$wޭ̙3IMwͲ2য়~*`ѢEx3Hr$aÆQ(lhh… S1 UH UJ UE:RXѢTH޹2!S7@S=^ K^LkQF {*DNN,--1zhkQKvǎ???8::bPոq {n444`07okƈ|'8s 1l0L>] ??{*[v-`kk֒rpWVV")) }QyA`͏R BF7*Ő)H`߄".HE3ZJ[9 @ J WbŖkO>ؽ{VނX,r$M6aƌHJJZz+H QUUAaÆ  ڵkcǎ_O{ FUU-Z#w),w'_検?Ʌɜ\|/ 8(ug^;}GyBRJ~k:srrH;v*`.]@POdsss/_N… Iow $I!}$̈́:l,8va2k;\-\83pF5jVY^HOOiӦG"Jf"@܀ ŷ0gJtBؚMLL&Ü9sP[[Ǐkgdd 11QK$ۍYQŋ1vX?|ҖكW2@3\na5#T 41J,x{{W_EDDVo߾3gΟD^PPP鶴OBZ3!q|}鳝+(;w.l2fgg?~&i:H8q2*!{n>077ʕ+T9r[l /ɉj"H:t㋜ϟOߵ ~펅yȈ$ٻ$ |x\B/ؓ8r͚5HIIA]]$ /tПGjJvvv7n-Z6?k VTnuuu$[y:返4DWWY__@J[9~IIENDB`clementine-1.2.0+dfsg/data/playstore/ja_generic_rgb_wo_45.png000066400000000000000000000177441223327513400241710ustar00rootroot00000000000000PNG  IHDR-bI pHYs.#.#x?v OiCCPPhotoshop ICC profilexڝ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Чc3- cHRMz%u0`:o_FIDATx\yXUp\@).@"lsSu^Q9c EP(4TD!A!?`Zz-}y8{k]$WOSSSHԊr\~S"pn ]'NgϢb"HE@*K.2e *TR@RIܹs >JORž x_~$KRÓ3$9_ `lDDΚ"!5?_\rٿ? ] s|a_9zT"OJE.7nBHfc7TUcOt T$;wL&C}=ؾ};q tO?#աR|Y7BQ%?#uu^?nyGҡ=z >>ªUa;weee \.VQQlx{{ O~ॗ^zu-VRiM"ˢ}1:&lzڹs'I2,,42266mJ{E#\na~+yL ~3Wץ^{$sߴmܸ%d2$#""lY\\N:]\\?$Ψzxx~!=<<@,--e޽ >>>$ӧO f͚E9r;N/^L,//ҥKRK.$ >^ѣ$@`޽N5kV$d@@N-[Ftvv)bVV0..NBhhw!oT*$!C044!Eai^ o 2b l-4Y3Zx=j5@}5l00]@R=:]-K:e(JL0ΝC]]ݕ+Wi&СCBL-&O hii*0aᅦ1.]\|z={{{PlٲeB~e(44zұo\\\PWWSNaΜ9Z6&MB'|J-P!5$XXM`gErK: e dH[k@3*",\uk׮LfprrH$_3jjjڷ#GܼySmFF}xyy!'' /hdggu[[oS4tիƏ\'79GA}}=:tZUfaa?011Acc#MMMO>Ayy>|!jPܞ0 $D  ph><[4&"e{RmŚ/uY95j>1ለ@kk+ڊfU7yq;99+WHNNFss3*um3,Y E'csýA޽eee7oPSNSp@;Qm2wZ5i_g p6|%0f~1:Wuömaaa:,HcŊDy&?;"طo7CJ$L"oM6a8t޺ΝZ:~(++>|pvvFxx8lقX޽[ )>?(],ƙo9K2_ɀ3X͹?3] ~#_M鳷7H 6Lp$ɜ3fhy7o&I޽[vڵ$I'''>0??$pB:={, ߭ "HG}DձOIIaAAp޽ܿ?PVs޼y:$I{{{ᚉ KKK9efddp„ Y rH!3fV$A.\ܹsĕ+W[ , Iq崱IݺuRmQ֭[I#F=΃$LLJJzs@_xﱘSYєE0?cal}}%/ x3;yP;AAA,--;w2,,ׯgLL UgСeZZ?#&&&rԨQ톫ܵk?S߿=zб{뭷|r^$IZ-؎1ܲe +᥹166h4駟k˖-`޽YUU|VWW}֬Y#޽{7I׮]/0==]ّ$gϞ;0``igcXqcvpJ.py#Jtuue߾}I##P(r\/ʊ,//gXXL\ίJ3nݺ}MkjPRQr׸D"Q"A  p #Jl s/|󣥥:r#yyyh4ֺ>uT#88o&"##3=mSS@o?bݺu8zG0F "P)fLZW,:׏ǢQOJaaa!$իWLLLNXXH7Ƙ7o?ݻ ÃA"@#1F1&p&+O% 0!]CCbccI{077[b1ƌ333W^}|?ύ?Qx?Ĩ(dII .\s\j pivE450XLRǎLȑ#_fO#D ;vT.φdddi.ڢgϞMj011#%J?' JQYYrtŋѱcG,Yh4033FRD~~mR͛7vvvJP*hjjǡh`ee> Xd 8ӿ!C`ȑ/2ju9`8::"((HO>Xh*++/ի())A\\\ pttٳ}vH$`Ũ]P[[DFF ۪w닍7"88^^^(..X,Fmm-Μ9zTWWcѢE())={3gbѢEسgJŋ7?W_}]v˗( V\ L{{{X[[C,?pBFF&N(޷of̘K.w022bvr9,--=z{ā#,X DM @~~>1l0:u QQQXv-Ν'BSSLMM'''K HJgggD"gϞEnn %<<ؾ};ƌcccCT"##UUU#%%ر#VVV(++^nRX[[#$$={\.yiii/^Ckk+\"!00߿N; @\\h 1|p ICCC888k׮B׮]_I #33`9r5557n&111HJJҢꤾ=<< ׯSWWYYYm_|{F6spqqAUUuuuZ5|{]]{ } ݻwGLL <::HMMժghh(,+ 8}4:t~W 4M{rilڴ =z@EEVYM;v --MgDKK 0j(\r FFF8utHNNƾ}pUT*xzzƍoՆ9`ii kkk̜9ӦMCvv6BBBзo_ԩSرcq-fffx7a^Z=qQյVVVO 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Чc3- cHRMz%u0`:o_FaIDATx\yXUss<2*(Eji攦s(AE *r4SEE'Dd=@ g?yCΝ={uիW$AINN LJxyy }Fݻ̙3k׮EQQΞ=_vx J̜9oD>???ػw/R0tP۷۷onܸiӦaaaغu+0l0lٲ ___h4PTCqq1 Ap)455=%)++ׯ!ˡjQYY;Vgggaظq#llleT*sΡW^#4C ĉԩcǎaܹx'0qD;v FPPƌ\֊|j8{,iӦUUU*A&ie2>$رc(,,U"9d2z=H_5̙k׮ѣHIIRFVEcc#,XӧOc֭pwwGxx88` W\˗Q]]jZ\~prrŋqQQQ///|0 d)޾gQ$HN'...>}:MB`̛7j HKKC`` BCC h4P֭ WWWȭǑ#G0|paĈXt@^^H G߾}qu444 AAAFʥKP%vvv@UUA@qq1_5kرc#Giii0`zǏ#''=>?#x{{cƍ@JJ dGDD&&& #G^lWT>}:fϞ|ܹFAdd$6m$}T:/O@0 Wg )_l辏gR(H@hkY{/T!k#0yrXwwCdff777kO5QX|9p;jJB/%eHڠ}?c|駈F~~>?HIIA׮]-z4yxx{p&`eCxvY~qYe, b0''UUU d.]hiiIN:%%%$ɒ:88[>}|-MmVll,J% dM;f -[ZZ*ݻw /?{{VZ =\-H*` @BU&2衕˱)5M+ZNX _OCETT.]*F3gdPRH,Y/^ľ}Էo_l߾_|VZK.!$$ŸK/7bؾ};BCCٳg8K.زe qab-> /> ]tAJJ ?LC.]p dffb޽(++CXX;wbҤI-۵kW8pݺu{ږ\ >3qH!z:ʧH殊ͼ Lbrc$b +jI(44$2[[[3!!' &N0$ܰ0dVVo;vɓ|gpBŋ<$=zy .[ϓ$'Ol4@ZuΞ={2!!$K C$ӓȑ#YYY,,,44iIʕ+"XH244ԈwժU$;v?3}t={ĺܪךbziH֬Y'O"55@ll,Eސ <}3f@tt I[M5V[`0e=;܈@gS@6&Ghol$СC &ը+Wx᭷->PãE4'^p?#`᧞z 111E l{ݻ7֮])S --7k *Zƀj*`ŊؼyUw Zs|}}/ޝE {;8'縜 OrB)\x,<'XۏMHM8ynZ>&&&!In޼H *M}eǎIMMMwsI>>> "I޽1dff$MLL'N IFFFLJܻw=:5۴i#* +}f޼y*p$I111ݛMMM>#^|m6Qwg7-@!@P`j \skX0~ *Ph +ȿ-Dd?ׂBo|MMM3g2n6wn.@9Faa!!1k,~QVV&t:=C5ٳ'"}O?4 Ft888`رFpCMM "##QQQF+++ҡs=z~mjCR\\\ZtSC.$FDD@"7߄BCCXޞdpjc.'Wdk|&#Y׋Oؓgי<;U撣f15Sӑ$sssOʊO?4Iƍ#ىۯ޽;<Ȫ*vI:uTqĈ]Z5A5 Ir j5Irҥ _wz֭===١CsAhϨ(dxx8GE ; $ə3gWwaqqxDW.Ɔ ^~K/1_Ahπl" 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Чc3- cHRMz%u0`:o_F_WڵHRX`8^:IpL XQZZ_۶mٳgQ[[ }}*'FHo1c"@cK===x1'$JҌoCBB^* fIIIX,~g...tvvo/66$LشiZS>}pIۨ{}0Nhz=i:t@ff&޽ ggg`oo4AP`ԨQ(((F;;;#''닮]"&&7n܀H$ jLj;*++Q^^DcƝ;w`bbBthZ(JҥKpqqAnn.\\\"/_H$(//GJJJ!##ϟGpp08Tte455uCiiiӘzƫW&IΚ5tRT*ֲZ&L ILOO'~w|2p嬯gFFI200XSS7x>>>lhh~CC?caz}6KKKI۷g޽h^^^$I&ܜcNj*644}6n:͛7Y__ψc5jU*LJ<|0xڵ'{ccc桼<А7odMM @؝BFGG(8qD`XXccc)HHg&ٓDæ hll)S+x;v,8tP}]j|e˄3g@KKKP&=Q:w ///1P__zAȑ#P((..… ~T*\.ZF\\6n܈8ܹs022B/$Z-455A.#>>MMMݻjD"H$ܺu ɓb* ͺ{PUU%]^^???lڴ Ǐܹs[$T_|qP*ヒ0444< ~Ї~4#''3g?/Hyfxyy!>>˗/? X۷oPN 333DGG#$$uuuPT T F\[[[jaڵ?|033LLL~-\h4j$`ee͛7GHMMڵkQRR++;w|||p899W^h۶OoR)Ǝ gggbȐ!½{ 1aڵ ^^^XnOsss466044D~nnn066FBB0x`,Z666{sss]tӧ*E_jvp!bĈظqgCFvt^FyyySYUUEggg:99{$5k6ARR {ndRR˙Mܱcϝ;GHJ644$I.Yx]CCCI'O$I&$$HLNN&Izzz_~/H+VB IݻtR$D D33$)ɸsNd|||8Fj~6m6mn{  k%D_ {{{=V}ְ~ڶm '''dY<&#~ !zB-bj@RܮʀG;l _@9o<={bسg *Rp5455H733CHHBCC|rĉpvv֩Xn6oތBPd3صkN:H#44|\]]w^lذΝCff&xF+VϟDž lzpuuŋǏׯra7ղ;vӧ6%~0\dñ} {ϲˑx} M`L5NMGG$w}2KKK3::BH3 4Hfɒ%~$T?ҥKի/^,wPsd+Bҥ j*oܸA?~NߧMF,++mN:1::$ٿ`PPϞ=+ӧT*iggǓp(uAfee۷-,eFcS?6oq:3?a2LM! Ɉɯ8f?9qIA\qƑ$KKKdpp͛I ~$I;;;Af$cǎ iYYY-"ۢK$߯n@@Ir̘1:ygqq1pٲeyU &$ hccC۷o Lƺ:Ι31 C$r=H_~eH_ +]qpBnT@c-ޙ拒lJoŭoǡ:yȀ  wyp!ٰ0aÆAVRٿ?0l0;w@TL ]d T*ѷo_?U ;;:yk֬-Q]]-oذ:7o۷o#11|I 3gBb۶mi\ Lm !!׃q#<'Cb# CSo1oxmڴA=P(`dd$t:+.҅  D^{ H$h߾ S[[+(h$Z _hx+`7nΝ;PcaիWQ^^///e\t 8}4(o߾ppp͘1ݻw" + @I'[.p{g. zATh "~NgϞ3NNN:Xv--[(ᣏ>BII @T:v8gʜ|eee ...Xn;dV~ǔ਌}cr/qLe{ yxTVc} !UȢ/{0Z[?&Bt򭭭$D۷oOljjj~7g}F9sHGm)))$)D\x$Jooo-4455G__GgϟPK.$IGGGΙ31114:uJG{ljj Q]"~Y 2 $2=Nְ+{aRф;sHMh/1tg.ch&-: g\۝<{ELL R)f͚SiPRRW_4 1`r:um߫޽{CRʕ+P(1b2r555 ٳG ϝ;eeeχЖcnEA* H$‡~OOO15Ǖ&31$dSL?prU&uvɋgjP 9lnlؖѣh'RPȈ&&&|WM5jiggGwww9sUUUСCf  Š 9r[PJE>}nnnβ2ʕ+illLD˗/$j5wiӦ1$$Dq?O8$YQQޞܷo_ҦMI>ϘSղk׮-/IQQQ<֚+R8|>S83_{Wl=8]?öʕ+ydrr29pFEEqڵ۷oKXE155y1b@aɵRYTJ J$7dQQQ |tYsj}?dd'g]cT,~ /@?Iːu:w"4༼xMMMO]A`EG}RA/xOM-'$$ Xz5\Y}%5V!???|o U*gMM IͯJZVаظ@mw F'IENDB`clementine-1.2.0+dfsg/data/playstore/lv_generic_rgb_wo_45.png000066400000000000000000000174731223327513400242170ustar00rootroot00000000000000PNG  IHDR-~ pHYs   OiCCPPhotoshop ICC profilexڝ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Чc3- cHRMz%u0`:o_FfIDATx\{X͍~"Xy!"'EͣSJex=hYB(a~h - )"7b0rqu`~vyTg{˻7kگ$n#{+L&g@@AP T*/N]]]DxaÆ%x@d7S"@??ļf,"iNRzxʕ$ )t"_@>0{ܪU`gg}}}!::W#:::PSSGVضm^|EiWW}8p JKKahhwwwC,CV#77vvvPո|rEKK rrrrWWW/^DuuPgaa jZrܹsڹ `kk ߰E"b, EﮊFVd2$ɲ2* ܜ999uSV… BΊ dxx8ĄΝ R\|9]k׮W^ocZ666 sxx8/^HH$'Iae˖=0ہ1 E T*e2CCC#sҥ^AvZ*J677s…@ 655qΜ99s$?[ZZ8srJR0&&Fح2gϞ%I~,..&߿jŋ$'M@ܜebD*"NhZ( xyya@kk+tچ`ɒ%/h4R$%%a۶mXt) pAL<jZhwU{jo>cʔ)(++CKK D"L\r,Z聲 DV>r; Ȁ'R p+;;;!!jjA]]]=JH$Gpp0 B===HR,2ss]9J֑)---[zǓ$Ϝ9â"U BPÇ'IYH^rE'ijjի =I$j;o =z45 r9ϟOcqq1?N$srr̀677sݺucbbT*iooJ644$C |cc#J%X__E s)++mzJ E#B[ZZR1o 566 <إw@x瑒kkkL<H$z*QF(--5lii ;v ...6l ,Aݏ7d044Ǒ FSSz/TUU᧟~ >8~8 ,pرf077Giii}u:GAO}@*B/_GbsQ C*> Z@042/n܃aL...0`Ba8uΞ=˗C<ĚK}RS xߗ0u' Drr2݋O>wFEERSSK/j8qÇ#;;q?Ԋ?ࠍttk.c:;;qYttt<ףGO<ǨQglٲkW^~GbϞ=@ll,~mЙp#)>>8~80~^g̙ذa\]]q >}1c\WWW䠰F}}=n*e!CܹMgis\j_؟αq|1%s?d@.s'SUqT"O5WIwllldJJ {$-={6I>nJ,**Ͼw^^ի֮]#DO>~:7m$.\@;w܃H ;ʔĉ aaa $IΝ;$^kǎlnn(5ㄔ|qNL229D&iq~c3I,lɎUdFOt:͍!9B:u]:$IB!$#""tdI{%~$IA7rAJ:O$3yHg֩KHH`]]>@tR$r9 @IkkkcHH]"H $o|`tcC+aǯc"4@@ ?- #W>z74ydxxx 11Q.)) 0`|||0|#k.iӦAYB6L6 66=MMM􄹹9 pIxzzs={taggGGGՍ|qq/_SNa͚5=d-ZV4 E@ m 5Cf HOjT;#.m= )( H;K5:w!&Lsr&&&9r$add$ YZBnnnqy;>}J=z4T*R) $ȨT*aoO;h4pq@sww[o'|+Wj0-((@cc# 3 k"++ iiiHLLZd퍁 킃{n!}A Mv75M0e@P;\E7 j+=`4%_#?錑={6u> }ֆ%Kuhyxx J͏?Ɲ[]>,Rz.XV#}vԩSJOOO444`رFXXñk׮Z&ߏ!rĉpqq-[YokOsv\Y9]y|2yU0r!fټ4b2;dn4m鱴$k.z[[[:;;`45 "Ivttؿyݺu$I///$< IzzzBIˋB*6%q„ wdϬXO;%ɉ!!!LMM%?GՑ1b;::!}ᇬ%&%% v;Dܴ K Wm8XBf* )dT"y{&__BOuttw\ǝ[*k"Djj*d2/^oPPQPPoꂟ&MCnС6l„cs=cǢnj3tVtOOg˖-CCCann.ԫ:442 QQQDxw!dnߵ&0x̖3.ܦ3|o=é׫ ys&KRrbf>>olzזY%\> =hjj{N/mll_~IرcT*|DžL"[͛GI|7rKKK644$7nHcccJR$5 wɠ FEEw;00$̭[ёݻ{ m~z[oEggg155uuuj|gz'${- ^Յ| (1OYഒ?~JKxj<|lп0`7nȦ&!LLLdrr2?3z{{ jb1CCCYTTĔ8p6mNNNNx9۷ z̀gDDϟ?/端"2QQQ ={bD¿,))F3gn::ueyy9Y[[Jpp0###[nJbqq1ʸb СCo===u| "Ar/1a< X;>K=j 2H$6RoUK^#IFFFrڴi4663xU쑝Y]]-|wttdT*Q~+w[.l?wXWX2X>L.Si(=4 QQQ$ɓ'=S$ɬ{{UUUw i_GD+,2;3qY|h2d2.\Rks琕cV䆒-[___awV%n*\>3ՈtDAeyC&ى t"#F… - 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Чc3- cHRMz%u0`:o_FeIDATx\{X0 Q c*xI4S Y@,CK. =yK DE$ P !CPR^CSN% \n֋޸q#GxG͛7VvZæ&[B.\+o$ PRK.%d2VVV$?c`ll,ϟ?OLOO'IFDDYTTD\p!IR,t]]߁)kjj PSSSЎCRPv &&& ix A&??411aHHIȈܰayU-PLZ͚j\h p~q|dvv6srrHR؊8yd x~G$=)JΚ5P(zfddmmmtvv~@3ϰ&In޼YܜrK,!IӇ+CCCv I;v젉 $ Z ((( hjzzz43397m[nɉׯ_ɉ$y`MM 7mD޽r9[ZZ8w\_|AFCwwwٙy@```I&q\p!  (ߟr\H$9s&mmm9d_K޽PG___aV򢻻;P$W^i8ad2AĄ P7h 98n8uѣﺺ@M///-} >SLy@=@unE] @'T_ҥbDgh:!}}}H$'971zk8f3g2 888GQ244ƍFkkhZ7+] Gayv|Vd HHHݻ駟bΝ(**BRR^xᅿ\Qmmm8qSN=\]]1r3\D9]B~3c tp]sC]"K]޿M177g~~>@GGGv֍ gfyy9I\OҥKN?G~O]Dꋡ"@R Pt   K477Gyy9b1,,,T*\zѰEyy9rrrpտ|EhO} hll+ Ctu @,̜!>Sл S|[-<}ܲLOOOh4νSL/i}nnݺa  $E_ kkkXYY=T{rr޽l#-">T_ ]¼ R)vd*pK V>.V:nā<Çcܸq•+W+҂CVk"<<Xf p!ӧCCE||<6oތ-[ʕ+ Rd;͜9}9x 22 ,GGG ,, ǏGAAF|^|E]8q222" >zpttӧX __NurrBrr26'#N)q(Gt}I)jyۙbjs$/kxp/P`MM iaa!i„ 3H+WCCCs߽{7Ϝ9+V[jV= }67l@ŋIR$IRɈLLL$I3cǎ]\\Htssi{aaaaڶm.vknq/gx瘔T=ʉ'R9 >$ވ[]̮Nu;u\<}"IN4A˒徾$ɪ*,$A=lrnG[YY 2:IRzMgJJV۫V"Ivw$3ftbV^-`B˽GR~gcccԽ?6 E"Hu @"Կ"] f6M3V5r hVOT\sF@,jGƏWWWu۵kѣGL0*  2e 0ydڵkLll,1ydXZjƵpss)v Xr%N< 777xyya֬YEEEP^zZHh0xxxtt钰WWW#==̼yֆ4 ET&T_G6Đƨ.vJ3@ГzI P\ m Č.P*OO[n2d  RRRvH$>>7n\1` n߰a0b 33 SN L&CCC"##QQQ}􁏏O/YJeee055zJhj=C$7߄+BBBܱUY\YY|Z_m$s<nOY C[ӧOF!Iߟ 466aXTTD6mR8/heeEggg=zZɤ$9{lZZZۛuuuܷo}]ЖJ733R$I_FFFH$<{,I۷og@@ùpm$JkkkpΝZ.Y$oΎ>>>LJJիWg}VO?$ z_9,M|9X€lXs:6gŞ3=zp%Ifeeq߾}cBB7mD/// b˗/gnn.o>nذA+GmmmcpϞ=sLVTTt s.Mr& Zy&x"-\M'~\M2H\f #Gp۶m|9ۗ@rCn<<|}_H\`Ab"611aYYI>K7.~  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Чc3- cHRMz%u0`:o_FIDATx\{XU;\\ DV F&$u̾yP> "G!EAN0~āgg=k=w^{$$qX ` Ctߝd7$dZ) UTTWDDRRRB=stH$x'0g 8p7 I;vL&#n~'$I =A/]$cA0*33R{r1NNN&f~hkk6mܸN7,55/UnbbWWW䠵U,DMM $ Q[[ 777~ pss J%.\b=]* VVVG[[$ PVVfCRA& YYY-all Cߦ:u*d2zsss j8CVAEEE_ P244T,=z4IrȐ!LKKҥK)HHv?5kX__ςdHHŋJP(X__ӧޞ$YQQB^|^^^ܶmVYWWǫWrĈ2d[ZZX[[˪*j4>3+V$sss\ZXXG\xq=AAAD"˪/jFP\r%P.2j4`pp0ĺznܸ9(HhP* << (,,Dtt46n \|:VQ[[ æMhѢz`kkxDGGᅦJBuu5 ɰal޼vB>}VQQQFzF󯘙 ^{5$1j(CR_~0aLLLPQQRL̜9hmm֭[;HRXYY!((J?_hD466QЭmu:HAd2LoFFFthllЇT*B@ee%,--DEE?~p=Ī|ssljjbSS###ȈZ $|M`KK ǍG߿~eX^^ޡJ4MMMkCCC I[OWZ>[[}TWWCTbb\.Ird2fϞ 033 pIdggXdSSSC|MLLR3g ##9r555x1|… Xbhlmmnsp; bY@@.]fL4 999D=W^L8066ҥKq1ccc@kk+|}}/ٳ'r9A@ii)~~~tqqqpqqA`` A@DDD'&&0栛A7= n=C.0bv N < ,!9apػ.ɀJ%\\\`kk@MT=vZ8q?3/^ V:- kQ_Z-pxvajo}OO?Ν;QXX$L8OT[[;>}`РA8y={mSKB t]<5Չj6Fm%/^ȚՕ&&&Y(aiiA\=W_1##m%R@n(L!P">Y|8h̕o!`) (--"""apttDii)PVVvW{l>8 e K$t ɰCeY j`e߬­cVLL %')S`ԩ֛&&&}4|{ {{666wNNN044ׯ%NNv nT!er9eء7رWk.1{|[OOÏ1cǎETT._ܥF? ZݡሌĪUcسgKlذ/_Fpppl^z }:={ $$?>\]]cѣǨQ:}S>+;SN!331bDӧO#33Gyy9BCCEm>}paݹOPYd>t̑p)Aԏ¤(FW㵺_OOߵG!!!$^{mH+++NǏeMFtPy̙3|g{'f I׏8h .!IΘ1Co쁁$JFDDݝgbb"Ir̘1bbJJJ ݝ$yazzzޞ3f I~w8v޼y3 :;1Nģ}($)|X*tϦ(VrӸ׶Pܽ<9#Ny.$'Mt 8!Iۋ2o&Ir߾}bY{*3^r%I2::ZOYHӦMӫfYY>ApB={VO~̙$Iڒ$`t %2F2F7X`Bgd\^x w\4ׁK#!vjwCƍGtwŋakkW_|z۷oL2...?~ƌ3: gu֡W^ݻ1aaaÜaY׏KCQw #|mk'Ʀk@Pŋ$۷ɉDitvv&I?C`޽{;Cff&IRPO>MwhT*Σ3K,ҁ4hIё ,`RR0;;ғ:t(j5=<<IJr pݢ_q" n~Pຓ /_20V^΂)[)Kjbȸ}shL~qCRIII7o^(//ٳgk.t:`ر"88X=S9r$4 222`gg___=3HSCdd$ **Jtx7E%%%077u9::v^|9r95H$xၐ?66iCs՚j9N%^r'\ Nsyz̻<޵'-g@@أG򩧞baa!I^ Z[[ޞ}#GXSS{LYfښ&L`uu5܂j4IRXYYI\z5)IZ[la`` @fhh({Mܹn믿ƫV"I[trrXVVƶ6>t'&$$QظS({0:o6eL"fyq)/L?8arռvIܹsgLL _[\P*r<<5kHGGGn۶YYY}o 6֭cHHE|7@777388{/d21//ZΝ~(z8qZY;p@G͛G߶ۅwO#fff,))!'A`Mwy{;Ǐ'%$;%k׮EFF p?ɤ}jaddL4 .J`#0ƣΔf&S*jcc+RD^KIENDB`clementine-1.2.0+dfsg/data/playstore/pl_generic_rgb_wo_45.png000066400000000000000000000173011223327513400241770ustar00rootroot00000000000000PNG  IHDR-~ pHYs   OiCCPPhotoshop ICC profilexڝ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Чc3- cHRMz%u0`:o_FIDATx\{Xھשi:#:+48hG0lkhh8V 2EIIDC)I*Ru~[V6Fz빺={>,I<%@ @Uc= ;O%%%e$%%mSBH$›oӧ[nIڵڴŋI2IBBB&5҅ d 233)&5D|W `T*6L6mRBᙜw@&fffDvv6n޼)`رO?LMMѩS'CT"++ eeeՅ^ }}}8::BOO5558wLLLйsg鏜]}hhh@UUV&J4dؙn` T%6Gp{g|>}0x`7a=- pB!!! C@@]XtY^z!** k׮ƍqM6H7;vc O>~=vڅ`8q0`@3f [ɓHKKCff&ѧOgΜAff&>۷ocݺuX8__fupp@BB'06[? Hds>Ss2E0_a'YV|fn _LMMYZZʣGԔP%Cl}||HK,֭IO=::gϞe߾}_-]T%I{ʕ+ sij}'Irnٲҥ =J1III@gggdBBhii)!vAܿ?򚝯[n5LL?6޿'NL;I|d2{3}Rx^8 e*1lC># |ǰhjKy4++j}}}Z ,$fqFdtt4믿&IZZZ 61I2&&FxT*++ؤK$ݫIH>>>je{[˗/@0wfR'N$Ijjj (JXSS9s: 2vufC#Y* %k6c?񁭭Z5֬Y˗#..5555kn߾ psskv@MEAS^LAAΑ#G}YpϞ=w^TWW78UUUbĉ8uoU yT\~aƍ իh~ @.cܹoooaڵ,27_s 9ñgSp>az:'8+SY4zC6_s47o'`NNI2""Bܜ 8MzbǎIMo3gI6=$I 3gHaaatwwgrr2>O`llLCCCy8p33 ,hс޽;IƆsa||< (4@Rȶ .4oC.m|={2Vw.nܸB≱1 L3g۷oB#GbMtnݺ!00P8yyy_~hhh@zz:,,,0zhmQUU0@xx}455ҡs9rZ͛\B m4^hd2YfVHHD">S>)@9}K28a.ǗepBE?p^?䇙|qxf!LW ]v\bHsVT*mpdpp0GA===='IΘ12糰Pʊ666L& RiO}ܸq,..nKsNOyyu'o![9n8u$VC !I2Ŭ7n`hh@ 0!G-9wVL&ԩSQYYǏ_t joMMf,~tða`hh/ߕ* YCCߦkpkcKq:/(+hu4\|0an=<<0uJ{BNN !_E}yDI~@<'!m{ooo LLLǥKڵk/[帅tFf !{m1Lfddرcܺu+{j 9Vצ>ܬ6m}jhhJ_g͚6AIbJJ I. MMD^jQUUDL6Jcc#ammÇcܹ066 `0䆆ת*6yEETJttt$XUؐއ1IENDB`clementine-1.2.0+dfsg/data/playstore/ro_generic_rgb_wo_45.png000066400000000000000000000201421223327513400242010ustar00rootroot00000000000000PNG  IHDR-~ pHYs   OiCCPPhotoshop ICC profilexڝ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Чc3- cHRMz%u0`:o_FIDATx\yX{0(eVPh*㘦X_)9`Y_LEI-L-SJE/ b2sAe8ܴ{՛g=bbbVaeegggHOO۷}||D9s,eee888 rף[n\.GQQ.]puuq "//Zׇ;!H fff$7n<58{,GYY5##Ǿu֍ T*,**"IΛ7sϑ$̚fgg$ 9IҥK$ɳgϊmرU?,j&&&M,//g`` ;uD,)).\Ð۳ݺuks|/I2//qMMMK,..kX^^N??'XVVv 9}a]]}||5Tطo_q+W:u*~ӧ 2$op$H!!!BO<|0cbb o߾MGGGH|2CBB@Z.XZZ*NOOgDDZZYY=q̌RH$}+H$}6*++WFbb"Νf455AR;;`ΝFX[[GbƌHIIƍkk.,[ ...r Rx\niiA}}=r9֭[5k 00j5][zzzG޽ѵkWTVV&&&ذan݊?Q@T*NсD"D"BѣG`y&pvvF||<كu!** ...hhhh%͛d +WDXX\~] EրZt;6<cHJJ`XYYmJjFfff}+cUUcƌ!I9lii'^zHUL\k֬U ؐ$W^M,++ $ɵkJ%'Onݺƍ%Ξ=MMMcZZ,X@GGG655ͭM:400ݖ8}tVUUIaL<}6 8p[lAtt4!HpM1ΝCrr2~7\zP(\hRRRP\\#55-affx7A jjj`ll~ X~=+ ===A&!66矵N?hjjw aaaTʕ+y"ͥ 600/'''x?`jj 1~qơ}jjj \.iҤI@||hGCܹsqo߾ ŋP*9r$:w ###c߾} C"//5jlmmall޽[P(н{w;vvoaaAGcT(<733CVVVSuA9j\蘡gR:1~r@0N瞨 /n ǔ+aN ...ԩDbʕHJJ¹spBTx'P Fa)(3`׋a~$ BLL cΝEll,F' pssC^pG* |rCĒaw<+{I\QucΤ޿biiɬ,VWW388466O.| E/dMdYnSSSQ"dr)ttu`n% g܋bXiKڼ1| (,,T*6mڄlաpttDaa!.\D*&Q'666Iu ׁT&%ÞT;(KWsVf}維HcРA\Aرc/Ynll ///<;;;xxx Z=,`= Cgccenn'''_?Hdr),Ձe T2ڡX,xvU>y_z߯_? 6 ۷oGQQQq93<<۶mҥKqUDGGY ???ٳ_~%֯_"H M<?=={ ,, ۶mo Zdرk׮ʼn' 6/cٲepuuEBB\ׯypuuEJJ 222p!b͚5"X~;ww t-qqk<_<^ד_Kغ<ٸZHo?Gaaa$^{u+**x19cҤIź'N$I~bQic3gؿ~b{K,h24$zbCCWXAT(ISL{pp0IRTrӦMdy!C'zzz$;Fooo* N2$?˜6kͬj&hV!#'wCO򥄓|7Sɍ<̨¦_p23lw!IFzhdff2??_y`` IL Ii]~=I2**g$ X7$I  ZewFVV:uÇW_۷OnDD`رpqqѣRZ%ڵ =zTJx{{ QQQ?1eʔ6m\ٳGlժU=]p&U ?Uٳg6mzHPuZ2})$:p0j5O'l?ek!t{= Bp7ġZ"J%`РAv}􁝝 E@L Xqqqbqy?%''#?? ^@]]A@.]:uuuDߟRrǁ鉷z ݺuâE'Nkg={ԒgmmogΜSp1DFFQ0k,ܹnz8Hpſ# (n B,ʿGT TM7s\ђ8q"zj|駈A}}=ΝRw,Zw//6/sas 5vB]]]뉓JQ[[ ƍ1m4$%%i+]OP*0`֯_PZ wv _T*1|!C/Erk̉s|V 'pbN,8Oqڵ3LVyLe߉ `ӁydZ3n]966"IFDDhɉDϏ]t!I655OH>>>7oIm!##$KLII!In۶>>>fkjj»+5ǝ{ŵk@Tbaa|B&aΜ9Ziii駟V1f 6UݻgϞ }}ŀ܌TaܸqZjs۶ml߾]+abb"Oggg3F ,RDAADYm/^ L&&@xx8$ yxyy!,,Ϲ;0,92Stb_/Hl y瓣߆oF&mO0jZXD;;;Ą}enn.Ir@kkk}_SPÃǏguu5vu $ONkkk1UUUܿGfo)>R$I._FFFgϞ%IT*nٲ }5khooOܹi髯K.%I[trr1c˒wޭdh.hSN& lmT73zc3<ʈ/8rM˝K>N:q嬬$IsdLL W^6JR.^yV μy'3cL,鶗)9e tdOMexx8I2 @G$SN=< v7nQD#u`Rp3'9 cH7V?5B2 3gDuu5?U~:uJf_%[[[,X#F)>~WPղߦ1 ΉZĚqE`ԩؾ}V3g;pIҋ+W("JRߵۖRN?ïcӝ?dY%Kի裏qWI7nV}Ȩ3sښK.eFFyQn޼/S;fwwwT4HC?[,,,hx٫քҢc``dddT $M57ǣqIENDB`clementine-1.2.0+dfsg/data/playstore/ru_generic_rgb_wo_45.png000066400000000000000000000177251223327513400242240ustar00rootroot00000000000000PNG  IHDR-~ pHYs   OiCCPPhotoshop ICC profilexڝ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Чc3- cHRMz%u0`:o_FIDATx\wT׶1 ]T5( &DK\QHT"{KDMa0HDDTDb~{wXW*{|g}ʷr4H 7)F:h>ƳOnP@P@KK} ATBCC:fΜ WW @=d &߿Ў/1~$O҈ CBB%Kdt ͥH$j_W Im)~-ە+۷o_R쓚@GGppp}'C*  '''H$?~:u*sNHR8::ٳCCCXZZΝ;oߎ2XXX@WW(Jt^^^ʂuhD" ::t@NNN:%fffr (,,٣G/? o֭[ezzzVɄٳtww233P([oEB#G0..==]OIIql2FFF3228a^,ŋtrrɓy$l"&&&/$fΝ[|Q(oݺ^8!022bUUU ۷":t(r9߿uMcǎaڵ?~<OD"!>sܸq111___ܻwgϞ˗ajj \333bƍxKRD"{}СC˜Z }ő#Gcڵs{;ХK6? ХKxzz"-- {R\.;_Ukoa9r$.]GA$cڴimMM "##ajj LoAhh(*** )@QXXj:TwP(lÐ!C0ydGIIɋ'UUUFFFu[ڱcO+++p֬Yƍ_|]̙3Dnn.ѯ_6סk׮8wrssq1TVVb͂mmnpI888ZJ),,$IvޝثW/>x6l Z[[ŋ$I&= $)J'''у $I///!3*%%D$M @Sb?D]=,0|p8;;#22Røv,,,0bL:p5ڈ71zh455 YApAc03Su###DGGV\4`4iR6@qq16mKKKe_tIo߾ |*4fBss3BCC0$2$RM@,A"ACKzQ :9 b 1` 7%օ\. 4O>_O VrrQ0.LB, b;wh Of 755Q ޽;,Y___>}Mc-… Zfffرc'O"22>h0x` fΜ&x,:-/X%@eK.Y{q{O) xM7&Z@k45GJJ :uRW_}իW#>>;w.*++...N)JaqvvnU`JKK6'N,]T%4oP( 'лwoܹSLAFF[IrǶmM6!""ѮXr,X{{{!y時ERs3z_ΤOEvѧ4>sb ebq˽}X{8b瓍[Ȋܷq4۶ x5dDDZ9;uDΝ;$Tw ~g$I777Ο?$rssIZZZsΑ$T!Iؘ8hРg/^ܦ׫W/ϟD`AAJ{ ݛ tvv}笨 >|X+=XG@.!jB[7`0i@1$t@;SN>X~ ryY4 7o2nqwU]xT ֭[GqBciN\~bN5rܴiYPP ֭[  aPPGexU6551''}uttZUtrrbVVxuVTTpذa̙3U.l޼ .]baa!/^L=== tqqQg+sNWs&O?]6֘0mޤ_p@ZZZTj bSߪŭ n"=zzz;v,߿O5k֟2EBƆvvvOV"ĄbXs8q"+**Z§ksYE0>swq(hJ^ːzIj,!+;wc4h Ì{BtO`wj$n?}i2$ f̘Z-t5vg,--pB9OXTJUM%Җ:t'TlQ2KkllDAA0yd<3fSŵkgggwEm>Ihm"l<HOI_{///LNN̙3UVի\bK9oj:cǎU#AB$E 333YaRRw%|eD655] Ǐo ٳIrG^H3gN¼Bhhhׯ-B`FܹsFI|@dzz7";;uuuI;yL[[[5 ,l H*G?5utt* ܱ;78:IENDB`clementine-1.2.0+dfsg/data/playstore/sk_generic_rgb_wo_45.png000066400000000000000000000174371223327513400242130ustar00rootroot00000000000000PNG  IHDR-~ pHYs   OiCCPPhotoshop ICC profilexڝ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Чc3- cHRMz%u0`:o_FJIDATx\{X .\s**(HSQ-2S_RjvO-?T"SzDHE>P =Y~M555c$''CVȨg stDxᇱxb 6 {D"!~"|$|3A!^jI\?CDv9))$,裏K$!** &MBFk駟@TӍJIIP(vƍ(((#-[1m4dgg~AѠFFF7n.]*@%%%r]\\҂vpttDEE [[[bD"aȑh4P駟PZZz߁ 33f$jjjKs=G^\$g͚ERXPP@<|0055x޸q}!QR$mll 䦦2**?0U*U*[[[PRڵk,--e}}=ǎ+c~~>yYdzz}YSSsuuuŽ{ iiiILLLNV EEET*@WWWΟ?5k000$9tPŋjW6Ǐ 1+++ijjJc}}=X,fϞM|KXZZuuuE^… Iƍ#.[*i&K:Mt\\z=kjjө˗/sڵ fMMͯcaap=rHjZ:tveЏ[[[o߾0^!C`޽X~=nK$ D"֬Y &QQQp"vvvpvvy{{}RRR`oo'x7n8$Ik^Nt]GCCyB+Aee%SSS;l2655Q&qܹtrr">$3>>8q"Irĉ[$xNPyyyyB_ζ6*JVVV2>>hn[?<<< cccXZZ JR̟?&L@nn.vV1cƠŘ;w.ZZZ HFa;L1SNݻ!cppp@bb"&LBT*D"_ Ǝ SSS@. _}},--QXXX| =P K!3_b=!F=@*> ai8&DEbrwCdjj 777& [nEzz:.\_Z^ tZ*N]jr+ Rb߾}())ABBMv'J#55qٻ*cǎwCi/kz}á'u[㹗p37,w٦X[[*!!!0`-,,P(,8x***P(Duﶈ"1 3Cb$A`jI(XWf,\"JShmm b`ǎ(**ZFUUgggTTT //Oqpp|/ C$&ebXY:#ce)P[ `ci%_/-[F*b̙x',',,,~UBѝпvrttggg;;ۖէO_OK$H$UYwLĐd6zhe2R15U!<9-6xM}o~ј4ibbb?t[.\F1pyFFF"::6l+Wpq!VE\\>l߾?BCC;Md=S/qI!,, x`0`ݻ8}40nܸ.'ĦM0`ܹsEII F< 0űcP]]p,B```mD 4m#+->c2ء$9zcI~ &aJ[4/3MJ{-^vֿHXذ'Nϟh޼y$ɵk $|zc7[nP$9x`-[x% B;!Cĉ$I`hh( $Dzyy , I~BUqqqsN644) O;qNR '&pjj G~w%᩟bX(swQy`3{^16f>Ǐ$O~ tF$666$ɰ0۷o'I݂OW_\۝[իW VVV(++CBBd2.]joHH :3fI:2d Pa#`̘1hooGVV f͚e@. ^z/3f^Cmm-aii)rvvMzjd2\yH$+OOO6!;0 sLcmtltY W XʔM{ݱ?gt:!/(( fffիy$gϞMܷ1SNQR_~BSN`gCC ʊ$͛7ܜR$IV]v1$$|W  "I6440<#maK/DΘ1 ^#:xwIRo 45kǠ\>{=Ϸr6RS1y{l飃Cޞ7of}}=I2''fll,J%}?^Xq3 d'xanٲrܠggg޽yyyѣG /5jmư0^xQ'|B4h###ʸ8% ʕ+jo-$RÃϟgqq1YYYI&uJVYPP"\*C,eHbmqkH¡ƠAž}VfT*jTe111$ɈܜfbKK Irɒ%,//|[me2)J n~ꩧ:eU68q|W|*fxfLni*=0$ɓ' :$vW@p7իSDiw[DFЫ', >4RbqMDd2,Z* N2(CZZ[ظ3^{ ?8z7|Ju:2!xlq"_ kooŋgy111'>>>Xh"ȑ#(,,+A/(--ܹsRz'!Bss%Gh\HB` F`RR/^̠ [W\5kRI5ka8dCIİ ˜C/iZr899aXb0-L|{{gSSS/OIKLMM5RPQOvunIENDB`clementine-1.2.0+dfsg/data/playstore/sl_generic_rgb_wo_45.png000066400000000000000000000172501223327513400242050ustar00rootroot00000000000000PNG  IHDR-~ pHYs   OiCCPPhotoshop ICC profilexڝ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Чc3- cHRMz%u0`:o_FIDATx\wTWL Re,Qc?,!5&5ECLa)Y" ,": FW:"@f(ߟf{=y|x{I,,u^#^p!IlARIXܺ8Ǔ01)7oFcccVӜp͍:::B۵k'|600' ڲk׮erݺu 3sLR$ rδlv\ :t>K$73f̠4l)\N///w۳NyI2<<\(I_V{oooaÄ׳8i$d^^M}}}`QQ׬Yt`۶mͺ:$G``P6{l,))GYYY>WWW6ѨQ HNNfUU)ɴtɓJXVVV$?Dz2>}ϵk6;(^rxE޾}[[jICMRR҄ϹB_f611aYYYʲLLLу.]]XSSC###9s6m"N0eAAZϛ7|`޽I\t)4d FJE;;;*w(ʊׯF}aa!;q }+ !C^_Q"`iiYf!-- qqq000@mm-`͛7qu̚5KKǎ;p}! ߿Z \-µdсH$5롯Q2e pmƾ< *++innN\;w$?{XQQd$ܴl߾լ#F$Ǐq(J`vv6W\) i\\Ϟ=Kcbb 7ydo5UVΝ;,))7wTԩϏ$ӧO'IvޝtqqaMM #""tڕ$Y\\q&I*M dZZϞ=ST$9yd'X^^δ4@TT~@ *++rvvvCw [HLLA!77 r|^`eeGj:t(*++QI&!??۶mCEEPnݺw?A)`mm={ 999 4jgΜy)Ndfff[ VQ+ZeHuJ[WlB=4g*5CJ.m- iw~[0Z:!ׇT e``k")) W\V_ᝠA ]JZx Ka׷?elos?qA\{ENNbbb0bĈP8w鉋/>ѯ_11[O|:뇸I\S~˧R_133 dǎiddDBSXXHB¯U׮]#I:99=~6mwEmE.#j j0e4hffBb#<<YYYFqq1v {{{"==/|GhJ} uuuy] dzeb rHUt*an/;rvg۶4444KJ닱c6[oddwwwf H${I666ϤOW۶m]]D"D%q LW #%07kZ&îT@ܮȄ[{;cXק|>}0x`DFF͛-ʩT*\rZ.ϰ0DDD`qN8:hٳ'8 6`˖-y&5&L;w"66@HH"""0sLt{Ahh(Μ9,߿;| :vs!99J999ӧOбcG@Tu6n(Ø8qbm |P<Ťxz;Mz9^?%ȝݼ팩db]TE4($$D=Yfnnβ2:uw}WHR:t /7$322%&Ob\_E8q$9rgAFF'NH,))B!!!Z[l!I 2Ҫۿ?233aeeC0Iڽ{7NNN5jj5޽+۷5555j,,4w܁LLLpA_~ ɓrrrpux<ݻk_vMo߾$,^XCfhllDxx3"@'LWaHĐ!K`gX|7D^G!:> -^_m 7.JKK>>>-=zBpd566 g 哔oܸռv`رco=<< PX 1e`?^m%#s/= =<U .hxtttYdmmya066g}m 2J:2@*|.f#Tyy\JիWѽ{w{Ԋk֬zM ?$ES3Q.\vZ ZKjzzzȑ#1w\=0*ʽ ɆGVzIQ_ohhX @8{(7ةudIENDB`clementine-1.2.0+dfsg/data/playstore/sr_generic_rgb_wo_45.png000066400000000000000000000206661223327513400242200ustar00rootroot00000000000000PNG  IHDR-~ pHYs   OiCCPPhotoshop ICC profilexڝ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Чc3- cHRMz%u0`:o_FIDATx\y\>[TVJ&0g2֙, 0ai4hDZALKI=g]y>>u9׹u?" ),@@ N| WR.ˋ?ٴiQQQ55&˩":t/v @"##)H_aI2I H2My8>>$]n6׌6luuuIIIxtttP(p7o.% _`jj ޽{q d2<HHH@\\(//H$JKKCCCdff]vqJ%ѦMbk4sssL<"(..888`ذa(..FDD:u* FijjUVr jkkKKKdff /j皃sΡ󵵵O><}4R)pȐ!LNN]\\Hf򂃃YTT`رBYZZ t׮]Y^^m۶\hPTLJMٳr&%%qʔ)3f ݻǰ0Ʋk׮бcG2""111,..LHHѣGcxΝ;իJ411!vܙΝcۓ$,Ys| f||߿?˙-[yQQQOTܹ3Ϥ$48x`'MKOOOY__/ P(_|;t[NHmʊjjjd-bvvv:y5x16k֌2--۶m{n;NOObDvP\\mBT"** k׮EC?r90`k׮R̞= شi$ Ƒ#GcȐ!8::b֭@*֭[/%K\XՅe777]vņ -[  y~-LLLP(P^^ \z111(..VZ%ȯ_uuuԩw]aϞ=ضm"## @=0qD_\_QJ8qGEjjP7|>>>򂗗FDD=z@`` cǎСC"?ݻSN!!!,{Ɯ9s`mm-L_jjj@ZZ222p?]pXSC"H@YYYG֭舻w62 555BSRRPWWprr+ OOO ===`ٲeؼy36o, vԨQHKKéScP]]7oJ%`gg]]]ݻ{쁶6t邪*bƍ7o|||`mmcՈFYYMXJ ӱ~zX7n222Yf ySLAii) P,Y-Z@pe̘1<42 +++j* 001pv؁=z,D" ȗ娫 u & %%O? [[[`ĉ055ň#憙3g"==!!!www...Xb<==qaڵkI*S r\H߼yݻwDzeвeK#66V={6~@._~֭0|Pgdd$qEDFF'NĘ1cTuuud2п|P*P*ɓe˖盌#d###vޝ"hjjJggg6oޜލdhiiIB˗/pZXXX,ɓwqBmll+ twwP__-ZĥKK.*h۶-׬YÕ+WLի׮]ˏ>\r%׭[vکԧCOOO ƛ+MMM6 _ç&zͩ MxHեiH4@ k-26;7iTʁ@o Is'=<0f*G: RVZ'Oŋ7ojkk_ᕠwk o.Eww,Lߌ.ґqAT"&&˖-CTTrsstEhݺ5ڷoSN9880g3 :o|HJڮ>>:t#˛5k4k쿶P(ЦMY!311+++hhh4r5?MdďdbHXM#zdؚ@P7˲` Wbp߭[7_+WSS/Q???\zBVTܹ3vڅoׯ/FlQF!44Ʈ]0̜9T@;v pwwx˗Ǐӧ\Qdkk3g 55č7f,{ѣl֭ql5#;=ΰxHۏMd}'$ nf\E8xy\ɃݏH3;266FFFz ȑ#I}Nfdzz:{LL Ϟ=ݻsѢEB}/dIm۶%oߞʕ+ fff|2Ir̘1*}6mI6m=۵kXߟ9BGGGq̘1$PݻH}Owwfh?{+>x;='k8Kddܹͬ+c'СC$Ɂ>5ә?zhdqq P]~=I2&&_dKw}$E䐤VVV(B /^Lܾ}JǏ'I9Rl,**".]TܹsȨyر$Iuuu${HFCC3gS"HH?~5` Z5-R-vQV5w Lc7ŏ>r5OC}􁃃Uv܉,&LٳGE6"" 4B*l߾4hoݺGGG!&&gĉpttDϞ=Ul\ڵKlhѢq]!?00*rM QRR777_Xz5"""X|޽())ܹs^^^7|" c\9͑7.sX=Ñyg9;C/^: ҇5/u <&PSScVVI2""BDi0:wLkkkduuu,YBtvv9sHdRSSIjjj3gΐ$̤$} ߼yXPP iiiDd2 =B<5j_H>9L8K|b'\,jgp@jJdLePPIO>*eoI6NE|?-qGD;AWL}Z6'Ef} d2N2$$$!99Y{VRWWR-_~ŢEYi]]쯟FefsՅRʉGx r^0\t pGL:~dee-A/vFD?IPYYyYm(Jscwt"v`חƍŋyU~駯丅OIF2DE@吽6bϏp>̐$xΎArCy yƌ$a_9sfb^#eAAIvl1+~^oO8AI6GSCɽWZC"eI8\.s` 7I555:$xؚ_JMMjmmlpy\=IENDB`clementine-1.2.0+dfsg/data/playstore/sv_generic_rgb_wo_45.png000066400000000000000000000160141223327513400242140ustar00rootroot00000000000000PNG  IHDR-~ pHYs   OiCCPPhotoshop ICC profilexڝ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Чc3- cHRMz%u0`:o_F7IDATx\{XU; UZ-oy+)j*Z$QS1-L,˃#$""%(  s >iz3{}y{گ$~E +L` @ Ir1_f~ t444Ƞ¿9iZD"< B߾}/w^J$0c̫W&|$u GDDAAO\$[A0"//b/ə3gg1 XrZZI_scǎ%I߿0XӧO'݂VЍT wwwB&W\={HKK3XuHgϞJAuuuCGa^DRjp~$(++^~e;6VGSMMMCzAJś7o͛,(( .^jb 655Q&`KKK |hllСCQPPKW!aii LiӦ!66>n3Rؽ{w]ԩSIӧOBO:Ţ"Ûہ3#%_x|||FŅgϦ\.7 u@ 6,2@  5 zrA ݫ0do &4h266 /l!os;"0fXt{(211R255͛㭷ނFyg?fEv)4tVVC:$$&&⣏>Bll,JJJ_|+'ODѯ_?|wڞ'E5=BaM$o:?^fqSm2'O#ʵfaa!Hwwwvԉ seEEI o Hnnnζmۘ趈"1 5Cb$S6"LPrv/,hmm b 22EEEhhh@ee%bbb쌊 \p|Fh f466>JPRbVքHMt6&X{]3ߴ\___hw)I&aʔ)w ԩoP(гgOvBuvvvSO=gD"IdbwYl$u 4R)Q VZ]!<:M}z >}?d5 ѺHVVDDD~z\t GEn8p uVl߾W\AHHHEҌ3g"!!ŋ@{"<<'N@QQFL26l;N<ӧO#//%%%2d=3g //GAUUt`9pfΜnݻرcѣFV6|viv8})&ǰ͌(^#g7ףP+k kjjL_ˑ$nj'IYFNF/=11:t(}]]}k׮${ꥋjjjMIf{`` IRT222ݻ7I~~~=<'3~oFS>]EU侍3*xm,M9G%I]Hكp~~>KKKۍP&jXH244TOv$D~Htppɼ$ÇҊI:{ڵ$ɸ8vΝKzeJut s̙Cd'I91lٲ4 E"r _Yd$@aVn ܑ.zzCQ@s {}\ѣx}3f ͛dcbb&M&LF7nd؈ &ֶ򂥥%k֬S兑#Gb֬Y%%%HHH۲e tGGGOpx{{ɷat׮]CVVV^Ff…hiiAdd"@*Cj,icr1r1DF85љ&v 8\Yvy&J%ԩ BSSSvҢPEϞ=u(-- [IIIhllĒ%KPUUjZMfOOvSZZ+~6ašb;v`Μ9Vz+H~+Rİað}v`˖-y־ @T2憭[>Ζ~8MRN-9Cl˥g˜Sgmϩ?/Mաe:!ȑ#u6bZLNNiӦvc_… ܿ?>_0[lahh(/^ `HH@H$|wx%j4ߧIAVV=<}$333;eeeܱc|" qR0"LŮx\k{l"R)ϟ:?~\/… 3~/dv,(u˗/Ǹq`aaw} ZVV6X&L:' Z.ލ.LLVŋٳwؿ̟?OiСC(,,쐠OOO\|ӦMC]ow}"466~߶s$~:"CCwLKKcPPvZ^tc}5$N11lmm~z177ܹs'>s=h΁ԣGn 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Чc3- cHRMz%u0`:o_FIDATx\yXe޾99"d.GhdܰBq,rqr(ҲJK!A%MT%gD8hYEٹ?xϦQ]sq>~$KLЊyEv'X L= X]^^"""ɨB‡\!H0d̛7^P ٙsNd2IpZ|9I^ iFRAXhhh=Fiɒ%$ Rgrtq|I `ƍѡGRAңPa hkk;VPb;k5 H=$H(H1Ӈի:L?끲o /;T}d2 OITVVLdm2L7P*b#/j3_Bš=8i/Zo5= 6 ̓1d2T*qY… ) TTT`ҤI077GLL̯ڞ!d2Y+*++t ԒΟ|rQ?*_,?pXz,>|mmm8l0ߟ^^^ aCCI2##ֿzESO=gԩSjfffB\)L!-piQ9l`b?ڎHHtrgbڵ(//J7~#R~vH뿖H J \+YD?mP]t7/b{?|kSu/j<** }􁗗: 'N7Z[#R lH$H$QIRHс._nweRA)L%T! U"_hiobϳԗwa?dL<ǥK-ֆ-[ GCPիK 99.\ܹsloĈXnUVa֭Xt{ ׯG||<.\ 0QQQj())Abb"ju`ii={@";;yyyx7Sc߾}'|[Ms'?p>]2rX\2kw|6[xgXP~10I}zjoqߺȈ.]F٫W/[$[nK,;rHoĘctdׯ?iӦ/`[< ޞܷo8j(ד$}||>oI_~\fffԽb ݻڝ1cI2((H//99Z"`ҥ+?|j5Ig+W]]͕+WvkJdbTRȕ28Z^0_B [855u\nUB0"dD\} ytk}>>>ؼy3߳gJJJлwo >`zYfUG5}WhkkC@@,,,tޯZZFdd$`Μ98x F9sbgg˗/czy˗/Gammyxx8zWӐJpssVEVV-[S&00JRobw6Lu0B"2 $R $RR Mx)|َ}' A (t4Wnj-Y[/$A:[nh244ĭ[DKyĈf򍍍HLLD@@F kkkj#Gr(**)\kk+۷/-Z???l߾{Q+CPUU~:d2,[ >>>G]]j5ZZZX~=6m \~;oo2 %w/WDCQPɠknP/h5} Y;`,~ga׺HH+k#%%ꫯʪKC/Ç"̝;W4;^ *) pq^ZZZj8~8iw;&Q"F+6n܈q(:AНBzֿٳHJJ‰'hy555aѢEg}C u~Q2w*2(֕7ܨEI/}z`nx ۆkjjxbE_^^sΡUUU"0qi`޼yzΜ9MMMqA6yzzbΝhllDss3j51`>>>:z{{;ؿ? 22Roݯ_?jajj*`Ȑ!]gϞ \:6l###L<X~ϺDTv6Z~ceWgpv9cEO$|rJ$ذ$YQQ%Kp gON~:ϟ2?sK/A7n$ F{{ر66Qz 4fx^?_2n5/Dž(H~y Օ|8񹹹yn۶ܺu+^x222NNNz{zzɓcLL 蕳… j*Yt)ܶmwhΘ1CKxx8IcLMMsssYRRª*븍+V`tt糬aaatttdJJ _x6u6/ ܼy,:89<sf:fm+Wx`R0aǎgy? TմMLLViE0kժUlll={`ۗAAA":8 B/(swzYXX\.I-yzI$=^+**~rN~O|*p6vrL:*MHHHIr̙zyƍ#I&&&>z-I0**wxb$jZ-L8`ͩ_b]#CJ͛7tp>T* 8??? 8K澂Epl6dc"g.c utt >|8;gỸ`ժU'Ovy; ">>>(++/:֗8 0aKooo-[qMRS!:;;s׮]v򘘘XN>O'=Go{ߪaGGG8::"-- nnnPիΝ;C/@>}```Rt`ذah4⭢'ěA0773<sssСCPTT Ά7^*^-@?޸r 1tPh4ܼyS755!''@oe,Y%%% dvv6IbdVV[ZZ8w\ڒ$wء믻d糸O?$yyvttH 7?~qqqZPϜ9Clhh`PPU*Ib,?%555VX_dbѢEB-[Of͚YfMHammbNNN"pwwq @}}HB)))=n}&o^~e庻. |bs{aʔ)%%%w$''cԨQhllD~~>v؁pqTWUU wFll,v qㆸxWЧO:ē{^ѣqq",, Cii훁&j:nIH$HRd2֢\.-[^z!..Dɽu^v 2Lܝһ:vvvh6۔HHH@}}H8D"rj5֬Y-[666 d6S `ĉ(--=S +~~#//s\޽{#44&M‹/;wH$ JSSSL:4hHW{(A{{/{RUUO>Ejj*#9,, hhh@`` JKKEnH޽{ҥK(((3hjj-F 066Oc;JC_]orWj$q~̞= Μ941oڴipuu; IIIEeeN2e ,--Eu 6lF \|}x;zxW6S+E]]r'NQWW;v;_~0c sR;yd̘1d MzI~255eQQI> k9 .왠055$ESK{N:5O>Azz:jkk!ϒ6T*899x@"9nHaC*2CCccR'D(w|IENDB`clementine-1.2.0+dfsg/data/playstore/uk_generic_rgb_wo_45.png000066400000000000000000000177471223327513400242210ustar00rootroot00000000000000PNG  IHDR-~ pHYs   OiCCPPhotoshop ICC profilexڝ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Чc3- cHRMz%u0`:o_FIDATx\iXG~n@vPvDQq`Ft&Q#:11*`$ QQ@Ydݼ];w4 r (,,DRRr9/ajjk׮{޽{@uuXLLL`hh7nLMMa`` r9wl466 8<PWWM)Sݻܲe ݻǥK͛j_YYY}:XQQA;;;b18d!履~ d aPP w^?nnn*`ӧ .]… Q具`߾}Bz<| aII 7n€Dmt Jqʕ+HOO~ <GAAZ[brD[|9-ZO?x!gP*(**+ߏz 2ڵ+$ {κu---444鉽{ę3gݺu9<<<0-;ܹ3߿/fd2bIHR45=ĉUo|TG/N:ÇVVRɓ̓r-ذamۆ(#''̟?xghhLlܸصkR)`駟Ǐ:%J`ССC1~x#,, !!!8q6moooTUUaǎ]RRXYY!** ǏH$R.\%KWȓ*ڹL&D"H$ }}}ܹsg۷/jЀ'''xzzHNNF݅KSeee\)IKK 8uT200YYYҥ ˋ3gE"J݉'2<c(x%P* Ž2$oP,Mgi0z6f:u ]vE^?9;;cȐ!mg')GIڭNÚ\rm/cxkpԔk!1oܸ:tNbdqq-ի$I{{?7… mw:L M m'k#?'v:l&BoQs[466Fqq1b1LLL\ա;w 6_ZLvnCCR1AC\bFƄRS q,PQZw`bϾ]Hxe+66rP*R$;ƍkCpvvYXX[ncPkΧsgff33gd*g?MF @*CŚ01nB*Ŏ } v 8uwk.õCBBH|r|k֬!ZZZʕ+$ɓ'={@@Itrrb=x'0(('O$:99$;FZZZr$۷ 1yyy֭[Y]]|fcMcI8IϟH 8BT?7Ot<Y-LfVmcc"rj׌ KȄ1c,((P#I `!`5pd||</$IZZZ 2>IB^^^I M555*adl2ݻ:u*IWl,--_-  ŋ[ #I---vؑ$9l0LzΟ?9C$r HGeX)J ;+RE#thôZ!~jGF gggƪٳ7n@ǎ1j(L6 SM%cر ܹ#޽򂩩Ѹ ...000@||<>ӧaÆaɭS+[naeew ӧ|+k׮}6Μ9%K̞=͈xNPHbHe*D.T.HSֺ (tEt6:HŐYEEEGQ7O:_~"ZVrrnn򷔞H$ 8uuuH$dꄉ~2 М0sLt .RRR=M1x"*++ѳgOLMMwܹsHKKñcA6((Æ Po֬Yصk 1[^1@Ys]ųvdBt$̀&n Ebws>Z"}|}}akkVnmmcŊHLLD}}=͛2KjyiJRXm[LKիWqaETL}ݻQWW:qb1jkkزe L"-$=GPP֭[;w>Z|߾}@`` ذadf{-eW8YN?K߂s-:)8KOsoM5W_tɦPKXE3qIrΝjfff%Ai߿?H*w /_$٧OΟ?$yV!33$I<{,I2**}ajj*:RE'022s#o,V $4ܱ5;X4!zՍ(4TO ;Hܒ aCkllć~([;On DIIIJ3gZ(++ŋJ1b\=гgO ǾMMMp,,,㣶 jkkVwAKKtjG} @ƦU3ŋ!J7aaaDg6w2_y6rrU߹iÛ|"YY3*A9HW5 &PT$sssO POO `~~>Ir@SSS|i&ZZZ[nJJWZR@cJPq$ ^0&O>xwytuuŌ38 \W^qML8Q<$Ev6sD~34nKH^kOOOA LNNYe˖•$c|||R+ojjʕ+W233 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Чc3- cHRMz%u0`:o_FIDATx\{\[th"q:|[K.~KCg3D,6+6ץ51*TDHwݨΩgN=벯y=~gHw0r*v}::w$5|x۶mH$_b %,f$|jBf̘!;w?oٲe>YSSú:Ο?_}vA>887njՕ$tRI...;wM?288Bk׮%Iۗؽ{w԰}˗$\BLOOK.*<~8yy644u?Ca,uuuLJJbNN7oLHJfddm8p'O|jؘwܹ-Zx $>}O;v,O>̓CYf͛:̜9>>@///:88hU>}^>ǏZ/N@T_ \j /g[ {Z&H. >Rs+HZuFIemc$[e@pvv͟jj* ##3yv5/@"8Y00z&GBB駟bÇ1tP8uڵk.] 557xL)QjjI$:H`ەnnc WeSgTKKK^r d۶mibbBB$P(^YMtvv~|LKK{q&H bH$0o) ؛hK9p2Ƅq08h@KKKC,e˖BNNpmx"n߾wMN&/H1A"@f X&%Ѡ]i ݮ݋hifE?ǶX`:GC#FQ,711LLLm ۷ 4=)5Ԑ=잨=kkkX[[?v_hݺ5rooK$D7bHXOPd.MP ˯5;|ϬrHǞ|>}六[͛ʩT*ddd@233Cdd$lقe˖8pڴiӆvڅ?6l͛7;v,[9rvBxx8lق3g8am۶!""'N@NN|F˗m۶8uΜ9LO>ͮC۶mqYdff">>Xv={ϯɺڵѣG:EKޝ7e=8ĿJb[ln᪭>>Bv؁jJ4.))R-ӧT*1p@7I 77v)[z5lmmaoo/$@DD(egg }aa!RRR%3c 466$8z:|t風0`fgbb_ FFF@+Q`%&& o^P.OgΜA^^R)z%999 2UUUB?<rv~@suuŴiСC̛7~~~8qD^s P\\Ν;geeΝCrr2=X aaa8p zӧOq޽'A`yw`ЗmQ3E<_кukrYK.EBB,z)&'yi n$`:|Zݻcǎ^8X-ѣ6n܈ & %%k*P*(**B~aaՈyk?={PTTٳg<==?ɝErk+ } ~[WrtY杣5N~?>Gc'n 똘rkkknݚÃNNN$z[K,!I3$$$o߾&ǐIDڲe yIklѢ<0s6u҅$Ȑ>|x%9rDGG?[;wJ{Bz\ \}}5n`ZZ|; LepB9 Ouh$YfW__Yf .cqqu.Ipad2\p?ЀÇKKcǎܹ3gϞׯT*ҠP(0rHc-!UuVxV?:iÇ9sPTT7nLѱI7 PS:GFFB$ރؠ53.J9,oWsqҍ Lm=g=g|l''{ƦO= $ɜSPȈٳ'sssr_~I;;;oߞǏgyy…w5@+++z{{{mUT$)H+V1RèVi&222fiߟ$YZZʵkޞܾ}n:ml2iغuk>۷nݺi駟$xz5K39|&2<.gJjmllb zX&$$p͚58pma> Cq޽\r% twttw}Nj/rܿ?'O#s K_Hq׮]B&D"yejsɒ%444l8HII+ϝ;ǫWƍuӧ3""BvZVUU1;;999;w.~KR'š8|K[xGdߝgpqqRVvqs,JVT*mͭ[$#""Cccc9#IΘ1׺dooOGGǾliiITs;v,oݺ$v֜Rs:*']`Bxnh(4 $Auԉ$L@,ܸqcG͙"eF%=sDĦ(+i2d2Lr?~\ŋHNNQ(7Oś7Zh >v]iCCW2\@Hf]{T*.]www?[nՉ<SLy*۷W\y&I/nnnv>IP]]m)f}ѝӧߟ/˗f2p5䶑#G@F21l2fff2==Gattsd΋` 9n9(($֜ 4%__[hF7 H+~ >}$%dUV!-- H$x_2yEOj5 aÆaٰY[ `Jr0%KQbhhXoll| IQniTzIENDB`clementine-1.2.0+dfsg/data/providers/000077500000000000000000000000001223327513400175045ustar00rootroot00000000000000clementine-1.2.0+dfsg/data/providers/amazon.png000066400000000000000000000026561223327513400215100ustar00rootroot00000000000000PNG  IHDR szzsRGBbKGD pHYs  ~tIME ~%.IDATXí_lu?{"Ũ1ђ& BB/Bc>(>^FyjFM4)<QJ z$-J^[@vo>Ggofq"i.03;uEIR҈@_IÒ?*<}GF"b޼y,^sB3{7¦^RBn2)/TuzdRqK0ܾ$J*`SuuyR7o6e˴cǎ\kj֭ :$I#礫kvIju׸|NEs/\K'&Wޝ:N-є@߂W 0ܪ P/Cо Z3="hN IBl$-~ p/-E]T PQ=y@aQ`͟> !$5 kpl3dϣT?*`(~>eO!h~3!$HfFk2wB87/Ň~RtB3swQɧfBhvxd4+Z.~_IZU0ACvѬ̞(;$} 4?>.Nǝw{Ry/~?>ղIENDB`clementine-1.2.0+dfsg/data/providers/aol.png000066400000000000000000000024141223327513400207660ustar00rootroot00000000000000PNG  IHDR szzIDATXV1S=}$eL@ *tnԁLj&}|x"iTI:lLCM'!mvf>Jto >}JB cV.1ɘB߇?q'*ܘ($%u\^<y)彄 "o !crق`f03w 03Y!>\R̜ZCDf"(B{.|pNLDLD, V4ML!{!<,Z$zSPmdmZfYǩOzl k6tMk )߿_[[C 3vFb#GD,[&o߾ŋ/0??U7P,s&IU0󬵶ND'V}.0 ׼0$ w:.#̺2sV^(TBR I?|`ERJw|vvZk>>>k&"><<\.gUZ[[Fh4n˅Bp^g5mXQ*`vj"A!:43C)B{\x :3DZFD׼ĥRonnXk͇{f杝BX???9ZDvlU@)0 aB)f`0"6gղ MS/HfƓ E4EExϟvT*۷oBx`8b0؛AM }<BZR^In.WVVh4)RXYYA899˗/lSC-lllanՅRmkcyyRt7kׯ_mqZk{$Im^~jM_|?pyy &VWWg C@*pS}YV f^([4Y Wk6Ebf/j:bl=? hҘsA\z|Mswؘ[|ƏyOíb0'tGQdOA" ?pU0J)1jZ0/ar\cCD `*fYi]wc$IڵT8 jRpPrM RjjW]]X)QёWYG)UZzZh4s\inmhFE+FIENDB`clementine-1.2.0+dfsg/data/providers/bbc.png000066400000000000000000000012301223327513400207340ustar00rootroot00000000000000PNG  IHDR szzsRGBbKGD pHYs  tIME0숖IDATXO1QǿEBJJPYF/B)VVDށ_)QB3Yxv6]9Ls9tU?@ * ,fHy,n7, |>| vEyh48NnJBJ$& x=6NFC1NV"y߷ C p Fvep8`2v_h4qp:``{n7=Z-áb*At:EE>WI&t:XV8j{YB<+7^rvj yhaD"FDP\NP*p\^(~lDlXGQJP,q88Fzl6@a^a"qp\^H&Zo1~t #(b8ϏI@D/l6/xpoaz$I|>q07T@Ps`0ySIENDB`clementine-1.2.0+dfsg/data/providers/box.png000066400000000000000000000107221223327513400210040ustar00rootroot00000000000000PNG  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.0+dfsg/data/providers/cdbaby.png000066400000000000000000000012121223327513400214320ustar00rootroot00000000000000PNG  IHDRabKGD pHYsHHFk> vpAg\ƭIDAT8˕KK[QֈB >(VA0(B7҅E+tY)MED"p%BI zԜEx#89of*۔h4*Ws^% `|o"* G) <655 9E8EP/ _Hة+I&7@ie s8wFFX8s}*e \!q~+!7*jJىOƱ$h%tEXtdate:create2010-10-09T13:21:18+01:00%tEXtdate:modify2009-07-27T21:49:34+01:00kIENDB`clementine-1.2.0+dfsg/data/providers/digitallyimported-32.png000066400000000000000000000022641223327513400241660ustar00rootroot00000000000000PNG  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.0+dfsg/data/providers/digitallyimported.png000066400000000000000000000003231223327513400237360ustar00rootroot00000000000000PNG  IHDRasRGBbKGD pHYs  tIME)3釩SIDAT8c`f1gnixUh.邆6j1.mL" i^ 70OGS MIDATh͙Kl\y9yp-zҢ"Khvu8@7"AvE7mwE!]EQtעhm C)*'e[V(G-Q(")>pf.pHQ% H/p0;> ?0߾wo?%{߶)xK~D@ w M[p^9?|iVMW^O‡Fe:՞7+fj5f=&~BI@ظV٩iȡRFvr8DR~֐S>IJ9mY=='NtB#!0 %!I{Zr!T.1?0ȾQͥ:Ȓ 5:(昞_+Tc!4J=\sk=uX[ k hheQ"oJFÁ{IbGXy렽p+Q/;PDOđ{줳tuКs2hL\?TDUQ``J`l8{yRD&4(f򜣭vy4ɥI`OoT*c(E ,̭p}H2i|F8ѓjVyEK LZSOe/ɇ8m5:cz&ճ6MJ*#`ڈ@{Fx(d$<]uaj[ejCs[]Йih~y xNj2Kknߡ//LRo:shQіYw,Bf=ڲ1Z .L2TFe|~ >f.2h-VŲj=ŜbS3rߜir%̬z z4maE'#p9q=ЅZ5N(#:;rB!vES6M\yxtnZOqI'|/60rs7=7_}x6O`xu$ c^>z@㒤f4/W7|#shZkKk\|+ORq/ XZN D׽$ǟ=ㄷ\ڍ9c9܇s\ s kֵI/q$k{zxvX_cbvi_LV>ǟ!A< 6rDk9⃶%(< vpAg\ƭ'IDAT8˥ұJAbkh`; RE1B I.NRK`avv}L Xd7;vg,L F{ 5$ y!^#h?^}D9VY(}uݬ$9w Y/}Z h]c5ct#׏5(I8ГDnP)ۏ/i5|لiiu-/ʦ/:ܞ+ 0ֽMhw:HY/}1Y-!94yYPqy=;>bT4rI%tEXtdate:create2010-10-10T22:20:52+01:00&%%tEXtdate:modify2010-04-02T17:10:25+01:00쿸IENDB`clementine-1.2.0+dfsg/data/providers/googledrive.png000066400000000000000000000041441223327513400225230ustar00rootroot00000000000000PNG  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+~j$Qkm|4kF51n5%Qkl5ՖֶmB+ +`AEV}9{ &~ ũ]zjc01Ia"B# l m2 \3kM+k7  G].Rd¡6|w _@^5wFYg\@D7mZwr˧ziGX4?f'=L2@E3մU ehW~3@(Vo%殁&7kO H$>..<ٱι4w߳^pvsLClW6I,r "/~U>E3o9Pwk_ Q|CF}qR)@O:lK͔( SP\3 }lMh 3I' l(dW5'h(2#q_蚕UaAMfL#f2@8N=/YׁQK)u"N#YbP ֋XO GCO*c\ TX¿b)#ߊ((l۸+`x?bh}}.C3PP2d8-sodPοvy-ST g4!BIp1N] kTA")uP=(H}xzZ0lTm{`֟T MaF1$ġ́DbE(xo^'H1PN;\Xim}xt*GuSdձa;^buhu!QƅF^k>Iz1D(07 G+~fOַ_bBTɩ"0~;jz=NoC Sؘ< r𦧻{\d]멗8SdBkn 1>-l2n*RW[_|hT_E#c5w6)RUWNI!_6mc3D?9Xxd6Ba>mxAsL&XA;W_H'a 1ZϾB L416fFˢW/]q\1'D{? 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Чc3- cHRMz%u0`:o_F }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.`\}L܇ps^go`wM̻9p| X@6u (&dD/kOHd:.Bb)1\ 7Qh!~ʘ?˿_&q 'n''HUF%@^GsqRl=(ݪ\ M#̝vb'IHFȈ?|*>&y#t8 :2 + # jh߳÷Om( (./+GtZi) #Zew7 wNG3Be4Y>B3W$1vJ%@精뉍D:8}98EPN/1tD"KBtќ9G<&}!M{ 7`$9w؅1Y@di2O"c[;99'y.F#^j\ݲgzιpP+~g7~b|[VPnA5PU9+fg9Ϟ4R: f➬vp>J_?ƾ/HpVdd)b ;B#$lª\.ӭb2$aZ& R{Sس\>-QEX1TT >B?-!h@&zMu_`>s.9f\k:]p x3Q ,%O&*$,_Ŀ$&|1esмkN; &]h_&*C~eajC;z˨ Z.?rzm'_B~+Iş ( ż)/x"B-SYNZ|/ߣ`z}WXBiq)g Ys/PRYt3p{ighyIsbq.NA>s5x  y" G{u+O`K]ÚsH M@Q̕2aOz*ekʊh",YeUyi#}c˜b |UK11M1p3DJgv&f>|M&6}7OniF٩ 08h %-tjtn~5ʙJMsW0|,}xFL~Zo]&7myIP $WO!v ~S5]=ywS9z"}[c+;͜y}g C|{{]|Ώ*KUF5s-?%ipwhX@]-pڹv»B&ļzgv) #嬖M~ / vpAg\ƭIDAT8˭+Dq?rf6^ IQ MR,,$%5VXR(;;$C Fka89WJd6|4nʇ[3qf-uB\T5?O7kTTa˾ @}x&E)aLL&_SY^\"ɕzz1 ;js:R(Bj 2MӢ>@k}USY\/^Ntu󥃦 "gNpyLIQRIi_ܤ웏Q$!EB9>ܚaM ï Rv]X2F4 Aq;{mR=|r%tEXtdate:create2012-08-08T20:28:09+01:00j %tEXtdate:modify2011-12-21T20:09:22+00:00JFaIENDB`clementine-1.2.0+dfsg/data/providers/magnatune.png000066400000000000000000000144261223327513400222000ustar00rootroot00000000000000PNG  IHDRddpTsRGBbKGD pHYs㑤"tIME4> yIDATx]iչ~S=À"EԸ]ƀ$Lkc\o5&e<,&$Q vFt{TL9T4`8?|dm﷜x$2#ڶؿ66ЖNj.Wha'huLI sN2/HZVɷؐl;ɣMm`_!D"SA0^)tNUAN|/'k$I4}Ĉg (cA>Bt © qӻ3$GZj `5 \i q/rIk@ tGd%mNcs ~b3y< భ$ ]%kB"ֲR.#y٪p0#a$NF`[Svgɻ,`1Qʥ9i%\N*}اѱ8x}s$/ROv$Ad>u+!϶4ϳ1w5?DH(VQZX=(@J$}746Ot>=IVK"zt}U侪lzdM>ML;#x:?Ɛp$+?GߖT,Ҷ(]!0Cց˶U G<ះ yˋj0V'7d*K:Gr8I%C>n +s$߄$H5?[v!G"Q[hO<ԉG2MR.~2r|1]#y!EW*HQqX$]˰ڲtSZp&/I@ mCb"GI*R/7tۮ6ARNo7+vщ7Ⱥ5]i:@A[(Haɐ笚UdO1{Bx:?\'"sb P!|;_Ն7*)@1|+%\ Ire®Hᛆ _ucU rOx=@.D*R]f(vgLa"@s>_KKߚNVw+9_#t-p! Moqna~qԥ ]bD#Z<0U&rtE6g H8;%-i %鑝Kx WU Ti>+UUM\Rʥ{"7.\fw3n(f뽍I>?.غZ]tYRy)xQ xǍ2/\gyݞCJDL?}0|rn) R.) X9*D6J1 3ヒ&rMGL[%!P5{ɍij1p"T+jUe8 8_$=m+g#BX1zV$' <G?q4 #G^0`~3?'+!2)圊))R.٪Q$%ڲn؟ėYFӁKIYb61}1ѯ&K*,$8ՑAF0g3'i۪d"}R HL6B $I'^@қǵxF&2NS]:u5q-f7XarxMr >V̥\F_>0 Hr~k|8N>Tlg^FW98R2HȄ8® 6U+ab6,(&:Z Ay6شr0~Ʈs8!p B&` Br&AOkF=FHTrZK骹}H [C|9MP!$w䝫+n{d>M9OJD"Asp =K"q~+cAJw(,-8 4tFĬNJq|m$ !j(JF©^!1kDGGsވŬQbGY>/1Fੁ+p`jQ$d'?zv'U P5rD&ݻeu*: rF6G2,[L,(g-CbheG1 x_JXQNԘJ/Tqi05SZ1z$=oywCӝfC:ʊi b7v H4:t{^ptٞ B&Lay0]8F7z|!$REpP;F#0(P:7#@8mfY H(i,HB$=c,ma;Esb;LFCC͂]c Qst'r~z,z+(ʡzɥHW%cL'@uĊ[3 <[tv?O[X;?3-Sm_N}\"S0;"sώ)2\ $x! mApĎx0)>z'2EHґoh=,2q`HE(!ai)lu>ILV1[(m(糱S+B@VxGlIK$<.&H0>K\m'Zc?~-tOO6ho⼰ón7(fvj7=QF>t~4p32TW) :WFҷC^vuP10r5Ym>k-cLݲTŨ{ұ'vap[4r1_-̋dϬ^wqE\zHK>^v)ǾcyUo i%i'%2!l'7ܩe-dHlԭFN%n,c~`-jY̥^cӆ RBX n脰AY5!&o<tZ%xuqq+ úBÝs9# xm C|H&*nźUa^#s:֛$Π;+ z2t yA1KH>DȏtJAW"Sw2y>s8Pʥv݀Z)yܣZ9D\uE"S=|MrI;n737&%`Eh9]^c3o6K*'UͶ I6y9ػ'2Mowm0\ +Xw»#GLg^fZ׭QEI׌t 8'%L\D2xdc8Mt~.0[E155Uh2¹H.M(KH޿|gsY"L0MHp%Oie~xݮ;rGg[FSl8m&$9l9eVzP}(m͘7eIECnBw#O FAXhўn_Z;|r鶭44pne\rsGY踘KbE:cx73CnI,f7Lq½_w?\oâ\Wyt~=vn_|tԠb6{G]O4=C%v\b2 0N6R'?6x:'yA3nALXgX 8d]hg;ֵA8xH"? 'Z„el0bDAx.) i1#R;6Æg'ފTp.@,0ňUe^b6Dk$A#t~R6#P)H-C^5Q#ptS:yGVf6Q*҅}I4-`%b66&^V[L`mr qnŤ.خݗ,.qli~a{1W|>r{M3!JX8ݒw$Csn nӖq >8ܕ@Q[ZJtez| ?EZA)x{ [HY^ҩtOQʥ$imi 3dK'O8#)ڊh:[m<R|S0]VѪ yW]mR.I 8 ]?e8-Zre#M^@Wn_ ;S\ $I:2wW=T/9iU߻iW$m+fUؖr3ɿ XEh R̦TV]s3ɁvY[tg;SZ@^R6BVCH%'a `ݶ}! 7贪hFR$v)+F<']0~p_D)׿M[-W o2ta o:xd !?L(W: =gK;mԓu$(`xDU-GLOƅ}mx\)M6K/ή{ ʋA~eY< @ڶw e'jjtOs%*Rzs:uy-1}m~E'bŀ~?眵,ґ3 ^qyocSm. %5qJ x_ղrr4~`ç.[On@ŶtZ$p`%@NhI)V0⡫n=(dŠ$IENDB`clementine-1.2.0+dfsg/data/providers/mog.png000066400000000000000000000010271223327513400207740ustar00rootroot00000000000000PNG  IHDRabKGD pHYsHHFk> vpAg\ƭIDAT8˕1n@En(M(-E|$ H|$\#q\Zqh L6wѰ16̟ Q_2/#q.O ,ytk tXJZtonXL-1c9;̓F? k{*rMnA&v_ 8k8 ~TUôL,VM."9BW 4tJ ar\fm91BJ4!k_9we܆%tEXtdate:create2010-10-09T13:16:50+01:00l!i%tEXtdate:modify2009-04-14T22:40:03+01:00<|tEXtSoftwareAdobe ImageReadyqe<IENDB`clementine-1.2.0+dfsg/data/providers/mtvmusic.png000066400000000000000000000013371223327513400220650ustar00rootroot00000000000000PNG  IHDRabKGD pHYsHHFk> vpAg\ƭIDAT8œ;hTA@lMP"Z`Zi++F5b@ B |?3⭛M[ ˹wεDDD؛IpMp, G e s{$C;1OT7pǐ1%*n e I$J/4q0?:kg D@2MtuނAbڀDi@Ym| zy~;lQN?A1SH3Llt3>Bp O#HI4Ҋ1 ^[(_m8p^r(dR$H&w!d~~Z8b0@aE)fr=\BZaN3FxպH5+SP+1pv]:ď6D!K9 ؓU܃;XA"ai_ȯV,~e#{h]KFJ@p9GyѾ6_ Y.%tEXtdate:create2010-10-09T13:16:20+01:00ԩ(p%tEXtdate:modify2009-07-14T15:28:04+01:00IENDB`clementine-1.2.0+dfsg/data/providers/musicbrainz.png000066400000000000000000000031131223327513400225360ustar00rootroot00000000000000PNG  IHDR&GtIME   bKGD pHYs  IDATHǽViLTWvRD o3ΰ þoJ\-ڢeq_YDb+hئhӚ5i497b"Xۛ|yyoswXH%_|\ {wUwYzPC 1'B$fM4 sfϒBAx=0}}G30">AΩ韚J Iw;;!֖Wd2Y!{(k4f:#/f񘩱Iޝl8 a`` TCtx Qt h-Z쎞*|0H4}#|CJبrԔA'5 [?/eSQF*!cc1U;7Wj+GzV[ ;Mބ"q@r 7)?ѢAgk1ߓ0`PTL3Fd*JAVܰzNb]R睄x+2Д.dis[d(L٨TfE>|@iA"CA(+܋N"Hkcdcn%ёl yx#MYU%Bi^KLf.0-![RNPv6>Z1UdS K#U˹tAVZ+,/*B+A3R<,98 ) :E"/ +U,!jGIJv{BȪOOojxۊg[МYrfi;yOn[TB3Eb:NK%*V\'V6Sл&+!g.F`k;MVV"\̸^&O1ʲ"C0\#'*_$O1g2l!mkQd?L[')]eAYnQ D}SDuf@>*(ck}|0QT{E6P31&BJjS=٩f*E֞(/> 夷RDdXQUv v~PZf WZwHt&vD~qPtޤm*Nx4+jMb<\㰢h?UeD1N~5Pr仉$>]^5 5t/lq(y4ktu+Ob`69Et Q]7A"lw\k=7qs?M\Oyt|}YCq^7+{b+1'Ơkk)Q>9½4g{2YPPe|t6iȷNQqQ^iG>Rl#{k}qfK($0\2V_5$K- 9wnU-JSBpTcjQq{:iܧnQb0PBIENDB`clementine-1.2.0+dfsg/data/providers/mygpo32.png000066400000000000000000000054221223327513400215150ustar00rootroot00000000000000PNG  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.0+dfsg/data/providers/myspace.png000066400000000000000000000024011223327513400216500ustar00rootroot00000000000000PNG  IHDR szzsRGBbKGD pHYs  tIME %slIDATX[Pu?ria TL-5-J2mj24N&LM3eeQ+Sn^n@%1b,mwO,Ez;sϞ|F>[D:|r@ \r"RxÄj?ՕP란ҁmQ`J[G'& l8mnic8~:{ё,}.]| @T @U=L)#̛5m$؛3:2mi"6 V7r,Mٴ(5$a5vt}c^`Rm3DߺV49Zyc?Ųj8G*=tب*k8{ P]ądQUثAɕ<EDP@Im_wlg` 2a2 l<>Q$ٸ{bl"B|(oX_7]PՏB-Oo]˕uId.K򚝺LHfmlFHEU$0wxo_7Q`[cs+;|~-_1Q#Xv'S'ry1)M/.bJXa$(Ra9Edmٲ3>`ulEi)Xt9?SphW/óS799+._cbB4̙D57)W{E|_@Y^Qk&ȍcO*Eq ; $ǎSI=|@90.ef*탶Xf*j{բFd.K09zTQmܻ›>g~"Grolx?Z)R@F9mkD]F~:3N+mim#P4@Rc 9wfz3m195gM`9~{doE׋<("DcSI WW5 69=z=$"(זX&<0HG1~u8{ R|VaJ 2N.8#BF =|H8S^Bp$4gQ1[=WVB{:3Nu,CI (\p6ժ:+jjnM<й%q&FLrT|PV7@}x?H~YF;sչ(8eՈ9^g@x<䭇@V\BܦvpߖWPWA'҂/~#Vz$nĶC,g@ ${JCv"6#H+i#2ѐ uaмҬԠY=KHA>u7 s#FB x#+8a5i(Uo95iǿ=(*xU!3fOi;_?q5@js򛳈'_ PT/STlv4>;JuzF"o+[X`aAdOGupִ_NFgmxkw!Xv.8Cπ0r|>zQ ,:e^u ߛT=[;uƦڣ3uOi\u - oj_L @Þ5 "}b< młn\^UHܚ.0_*.km8belڮ3e 8ǯuRTnw1`\czVv/²37aoa߷;n%ն'dn A> `ɄVxB|om@5HFsCe9440tEf01T$\Ģ7AB/j ֪\N&[mw3)pni Cx%`G%(^mj,.:.*?m9XvK%4Ȳsy~A0/S8[d{;;Ԟwqڭ [k :IENDB`clementine-1.2.0+dfsg/data/providers/radiogfm.png000066400000000000000000000013501223327513400220010ustar00rootroot00000000000000PNG  IHDRh6sRGB pHYs  tIME 1izIDAT(ϕ[HaNmM,NaV*HBAe' $/&,$@B^x"vQesrxn߷{P.>AD@`iAJ pYo4TcEM/Ph ˒,뀈( rGkd8S3 r3)P;>"EPE˃-y'*<z}my">{LFS$<%Џrkf1ml()-ΟHN4S@XUUL +AMӭ fUc13aPuޞҖq33Kc4ݹa 8u{@psr{F4ي]]o<oAJuJŒ텂dD'. [,fBYIs ^\17;Yc)U6f5~h]KO}߃6[P_ZH'o~P(m_\\˕%"Sg9 H3]բ$G"LQ̌6M8M% E\pN8.CrN9\*pF4ca A* )qJkW 1҈IENDB`clementine-1.2.0+dfsg/data/providers/rockradio.png000066400000000000000000000006111223327513400221650ustar00rootroot00000000000000PNG  IHDRabKGD pHYs  tIME 0IDAT8˥N1ELm!L*+6X 1,H0?`&! 0d!}ݖvJIyݦ7F]Im UX1D?hLiB UV@SW@R0:?;$k4Y#JYSWOa*8nhdE,=?1_y| G0CSW ޿m̿.Ln-'\܁% 2l3LQ+  d3)_xIENDB`clementine-1.2.0+dfsg/data/providers/skydrive.png000066400000000000000000000070101223327513400220500ustar00rootroot00000000000000PNG  IHDR00W pHYs.#.#x?v OiCCPPhotoshop ICC profilexڝ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Чc3- cHRMz%u0`:o_F3IDATx[U2:L1q0/h΃NZat#2/(T)F!FOQ =Et!Z 1PLi szh8 }wsf|^y2Ƒd2BvJЂ8o.c~t1q1Ԡu``L"6Ք ֠n\lB䪁@>ĬayO8GuOc7q0 x?"ǧXҁobPS8 ҄PCFg|TȭI;p#NxK"B}Rүhf0OFĄ<|5$%J5%§ODТOT3X =!.GQ)$<6&c1 Z /cj]W- $EK[ǰ.^5JV8PHh9ћT`cnt~r\;oS[[ 4+bH;4}CwUEF^8%wV\XFMa/eF #d22`*IENDB`clementine-1.2.0+dfsg/data/providers/skyfm.png000066400000000000000000000015401223327513400213430ustar00rootroot00000000000000PNG  IHDRasRGBbKGD pHYs  tIME&-\sIDAT8sTU{93nbJh 8g,tJ[ʿ֡`E-0 ~@M{9#_xIHLXp+r'$b#X(FWu]㼣FPiPUJSB,t ##SUe(ƥC=pi&L+xV2` ȷFj#s"h$ |ӥ]D(By2b]YpOBJnsFs?ϣs>|cOtJl! U >9Y{G|lJX dQD$MqʻmVE+x4gRz./9Z+<|r!InFQ;HR!)ңT۟J0?=<rK$ :@Al_X|@>F[GŬO\eQA+nFeA!0+=ér{lsϔ4p@+m1g VU !B֖ !8J 6xJ80C3,a0Xh`"Q_Lm^IENDB`clementine-1.2.0+dfsg/data/providers/somafm.png000066400000000000000000000010601223327513400214710ustar00rootroot00000000000000PNG  IHDRasRGBbKGD pHYs  tIME iIDAT8˭SOSQ=߽ݶk H ,nu/0q0pr0&L60ƘԤ B(&5%g?{.%,ylM}sLg/B:zAB| @D4zFW.aJNZ*ukC#w{q}qd[BB~ k~'MjiCwkd8hXHٚuGَ,~K TMuF4?a9ܧo5HĞba&зw%S!_cLUR3^f#oOst2{P=z%4;)ԚOhpV0>7H-!DH%(L Q!"W4*8R5ZA<IENDB`clementine-1.2.0+dfsg/data/providers/songkick.png000066400000000000000000000016021223327513400220210ustar00rootroot00000000000000PNG  IHDRabKGD pHYsHHFk> vpAg\ƭIDAT8MOU9w;68`R3QZ[Kt5 ae"!!"4MШ\Eb4BAHY]Ӵ yZ{u>sZ`ΐLSxX:~X/66mml̶lLdI[%< Ϡ u1Oq^P6 7iG$01V!{cEK352pPC%``k6ѣe@)n ci枞6A"9Ν0Xru,/;T}8'IRJ;zd$IS`:}/L~xlk6opc쓸Ͼ%w4gP(p&y P[z[?B!5玀2RH2F0*+dD0@BΩwH9Y:-:0M?j_!}5nŧPO9oi>}fr(Dvނw,x{.-Y>ѥyCZHRSk!Eiwޕ3PCKeBk`d륿RL,lO"y$HIUxh_}H1ŽRMQœmLoX`ruPƁ]CpkEb^WMח%tEXtdate:create2012-06-04T14:32:33+02:00 9%tEXtdate:modify2011-10-13T12:58:03+02:007IENDB`clementine-1.2.0+dfsg/data/providers/soundcloud.png000066400000000000000000000622271223327513400224020ustar00rootroot00000000000000PNG  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.0+dfsg/data/providers/subsonic-32.png000066400000000000000000000031421223327513400222610ustar00rootroot00000000000000PNG  IHDR szzsRGBbKGD pHYs>M>M(tIME  6;xIDATX]Ww9 0PUUhmɜ4UiH1z7Fcj6j%9)^I(ئBDpsf{y1J"ȍ$^&;˷w- ROgeoh,]SPΆG_kQk/Bm5aHHZ_a D/*&Ki?ɓrxô%oo m ~-ϢlsߚvruIb}A2,B)P~g|K;̜L,(R͙w5p rWQT*Q(} kT%!jm3C uI'f;|1WT*R*>Q*?AˬPD=$wQța`pm3k6J [x}4{ƥCأ4L!6I$,&7{&^noq&1#49̜`q"0Rzt[!$%XX~v~y)`pxx?`sK1tLQ+q¦n٫1Oժo7hzR8A;HMʟl|:U(1Y\'ۇTSgT`j'C˭B&S6l w픎_ɨa   ׍io4E4$' 33s(0#x,?-Gm W?|͋8#NL0t`AzS,-38{aeVթ)N_Ʒs $93 !d%%%:`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.0+dfsg/data/providers/ubuntuone.png000066400000000000000000000043701223327513400222420ustar00rootroot00000000000000PNG  IHDR00WgAMA asRGB cHRMz&u0`:pQ<bKGD pHYs  IDATh޽}U}gwe%l+HcUтt  GbhB0H$Z hD&!1hRi @ BCwۖn;n,O1s9{9}Ee!qt`!&T_" B{A+ݍQEP"{ > s0A0x/F@)1 ̜;sJ .`/Cf78^.l8rцLN&v`.CDE|X,mRf<\}C8~|uqiBxT'i?x":Wd6: 㴷_/A`Q Va ]\LhN/{=q"HӗIZ"+g0Nv71^ Udӈ;Ns(rքM'n;f1  "pɳ?:7Pj i90!xΎp̀.TaJX$]I$W4QcYnsD*EUVmND]p`=0 e 2H\(qL+?E X܇1,Q%;LD[]5|{O '̮|Ž+2^t5q]|DŽ su֤?ӟƔ椢@aqciتrƄ5ca  4y7hVJ}88cQRoI"}'))Y. ni{DsZP=C$R~ہs0Jgsf3BJlv=tp%b+p+ՕΒ; `I~ފpQ96 `W a74a ÷ o+6qk$ a `G9lj"p-$t7҆lc!S'yyYL$a6&^? @f9j|A +^ЄefHXFۼ ^bBGvcXxjX-5|f|b014J)v!{UAR$?"kف hv`I/ (<~kI(IzgZ'+_1Gl =NN|fPU/ 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Чc3- cHRMz%u0`:o_FIDATxWq \e^**0LV M*J]+u1@InxIC2#4n,il~8Hdbߐ$v_ I^3nfx<{1r$=} !9am۲w\JaZkz齧:B{$RHQJD)F,N20d]8U<Φ!(.KLq91f>JzgxsH@JI!Ĭ".Mqk-֔RGr"(Q0 hJ .M,2"^>~'IcLqW!m۪$cw)"@]U%AIb@jb̘"SZJצ_&01fԘDj)JOf_"0\ɞ)lZwqJkwZq;޶ܩ196uO_L^V{_OЎIENDB`clementine-1.2.0+dfsg/data/sample.mood000077500000000000000000000007651223327513400176430ustar00rootroot00000000000000`# - 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.0+dfsg/data/schema/000077500000000000000000000000001223327513400167275ustar00rootroot00000000000000clementine-1.2.0+dfsg/data/schema/device-schema.sql000066400000000000000000000033411223327513400221460ustar00rootroot00000000000000CREATE 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 ); 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.0+dfsg/data/schema/jamendo.sql000066400000000000000000000027771223327513400211020ustar00rootroot00000000000000/* 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 ); 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.0+dfsg/data/schema/schema-1.sql000066400000000000000000000001471223327513400210500ustar00rootroot00000000000000ALTER TABLE songs ADD COLUMN sampler INTEGER NOT NULL DEFAULT 0; UPDATE schema_version SET version=1; clementine-1.2.0+dfsg/data/schema/schema-10.sql000066400000000000000000000001621223327513400211250ustar00rootroot00000000000000ALTER TABLE playlists ADD COLUMN last_played INTEGER NOT NULL DEFAULT -1; UPDATE schema_version SET version=10; clementine-1.2.0+dfsg/data/schema/schema-11.sql000066400000000000000000000001561223327513400211310ustar00rootroot00000000000000ALTER TABLE playlists ADD COLUMN ui_order INTEGER NOT NULL DEFAULT 0; UPDATE schema_version SET version=11; clementine-1.2.0+dfsg/data/schema/schema-12.sql000066400000000000000000000001051223327513400211240ustar00rootroot00000000000000DELETE FROM magnatune_songs; UPDATE schema_version SET version=12; clementine-1.2.0+dfsg/data/schema/schema-13.sql000066400000000000000000000014711223327513400211340ustar00rootroot00000000000000CREATE 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.0+dfsg/data/schema/schema-14.sql000066400000000000000000000002161223327513400211310ustar00rootroot00000000000000CREATE TABLE devices ( unique_id TEXT NOT NULL, friendly_name TEXT, size INTEGER, icon TEXT ); UPDATE schema_version SET version=14; clementine-1.2.0+dfsg/data/schema/schema-15.sql000066400000000000000000000001621223327513400211320ustar00rootroot00000000000000ALTER TABLE devices ADD COLUMN schema_version INTEGER NOT NULL DEFAULT 0; UPDATE schema_version SET version=15; clementine-1.2.0+dfsg/data/schema/schema-16.sql000066400000000000000000000010471223327513400211360ustar00rootroot00000000000000UPDATE 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.0+dfsg/data/schema/schema-17.sql000066400000000000000000000002571223327513400211410ustar00rootroot00000000000000ALTER 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.0+dfsg/data/schema/schema-18.sql000066400000000000000000000001651223327513400211400ustar00rootroot00000000000000ALTER TABLE %allsongstables ADD COLUMN skipcount INTEGER NOT NULL DEFAULT 0; UPDATE schema_version SET version=18; clementine-1.2.0+dfsg/data/schema/schema-19.sql000066400000000000000000000001611223327513400211350ustar00rootroot00000000000000ALTER TABLE %allsongstables ADD COLUMN score INTEGER NOT NULL DEFAULT 0; UPDATE schema_version SET version=19; clementine-1.2.0+dfsg/data/schema/schema-2.sql000066400000000000000000000002061223327513400210450ustar00rootroot00000000000000ALTER TABLE songs ADD COLUMN art_automatic TEXT; ALTER TABLE songs ADD COLUMN art_manual TEXT; UPDATE schema_version SET version=2; clementine-1.2.0+dfsg/data/schema/schema-20.sql000066400000000000000000000002431223327513400211260ustar00rootroot00000000000000ALTER 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.0+dfsg/data/schema/schema-21.sql000066400000000000000000000025011223327513400211260ustar00rootroot00000000000000/* 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.0+dfsg/data/schema/schema-22.sql000066400000000000000000000004661223327513400211370ustar00rootroot00000000000000CREATE 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.0+dfsg/data/schema/schema-23.sql000066400000000000000000000001671223327513400211360ustar00rootroot00000000000000ALTER TABLE playlists ADD COLUMN dynamic_playlist_backend TEXT DEFAULT "songs"; UPDATE schema_version SET version=23; clementine-1.2.0+dfsg/data/schema/schema-24.sql000066400000000000000000000001641223327513400211340ustar00rootroot00000000000000ALTER TABLE %allsongstables ADD COLUMN beginning INTEGER NOT NULL DEFAULT 0; UPDATE schema_version SET version=24; clementine-1.2.0+dfsg/data/schema/schema-25.sql000066400000000000000000000001351223327513400211330ustar00rootroot00000000000000ALTER TABLE %allsongstables ADD COLUMN cue_path TEXT; UPDATE schema_version SET version=25; clementine-1.2.0+dfsg/data/schema/schema-26.sql000066400000000000000000000002261223327513400211350ustar00rootroot00000000000000ALTER 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.0+dfsg/data/schema/schema-27.sql000066400000000000000000000004761223327513400211450ustar00rootroot00000000000000CREATE 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.0+dfsg/data/schema/schema-28.sql000066400000000000000000000001561223327513400211410ustar00rootroot00000000000000UPDATE %allsongstables SET length=length*1e9, beginning=beginning*1e9; UPDATE schema_version SET version=28; clementine-1.2.0+dfsg/data/schema/schema-29.sql000066400000000000000000000034401223327513400211410ustar00rootroot00000000000000ALTER 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.0+dfsg/data/schema/schema-3.sql000066400000000000000000000004141223327513400210470ustar00rootroot00000000000000ALTER 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.0+dfsg/data/schema/schema-30.sql000066400000000000000000000021331223327513400211270ustar00rootroot00000000000000CREATE 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.0+dfsg/data/schema/schema-31.sql000066400000000000000000000000461223327513400211310ustar00rootroot00000000000000UPDATE schema_version SET version=31; clementine-1.2.0+dfsg/data/schema/schema-32.sql000066400000000000000000000001641223327513400211330ustar00rootroot00000000000000UPDATE magnatune_songs SET filename = "magnatune://" || substr(filename, 8); UPDATE schema_version SET version=32; clementine-1.2.0+dfsg/data/schema/schema-33.sql000066400000000000000000000001331223327513400211300ustar00rootroot00000000000000ALTER TABLE playlists ADD COLUMN special_type TEXT; UPDATE schema_version SET version=33; clementine-1.2.0+dfsg/data/schema/schema-34.sql000066400000000000000000000006101223327513400211310ustar00rootroot00000000000000ALTER 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.0+dfsg/data/schema/schema-35.sql000066400000000000000000000001261223327513400211340ustar00rootroot00000000000000CREATE INDEX idx_filename ON songs (filename); UPDATE schema_version SET version=35; clementine-1.2.0+dfsg/data/schema/schema-36.sql000066400000000000000000000003641223327513400211410ustar00rootroot00000000000000ALTER 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.0+dfsg/data/schema/schema-37.sql000066400000000000000000000015241223327513400211410ustar00rootroot00000000000000CREATE 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.0+dfsg/data/schema/schema-38.sql000066400000000000000000000023251223327513400211420ustar00rootroot00000000000000ALTER 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.0+dfsg/data/schema/schema-39.sql000066400000000000000000000001261223327513400211400ustar00rootroot00000000000000ALTER TABLE playlists ADD COLUMN ui_path TEXT; UPDATE schema_version SET version=39; clementine-1.2.0+dfsg/data/schema/schema-4.sql000066400000000000000000000003061223327513400210500ustar00rootroot00000000000000ALTER 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.0+dfsg/data/schema/schema-40.sql000066400000000000000000000022361223327513400211340ustar00rootroot00000000000000CREATE 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.0+dfsg/data/schema/schema-41.sql000066400000000000000000000022301223327513400211270ustar00rootroot00000000000000CREATE 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.0+dfsg/data/schema/schema-42.sql000066400000000000000000000022321223327513400211320ustar00rootroot00000000000000CREATE 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.0+dfsg/data/schema/schema-43.sql000066400000000000000000000022321223327513400211330ustar00rootroot00000000000000CREATE 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.0+dfsg/data/schema/schema-44.sql000066400000000000000000000022201223327513400211310ustar00rootroot00000000000000CREATE 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.0+dfsg/data/schema/schema-45.sql000066400000000000000000000015061223327513400211400ustar00rootroot00000000000000CREATE 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.0+dfsg/data/schema/schema-46.sql000066400000000000000000000001601223327513400211340ustar00rootroot00000000000000ALTER TABLE playlists ADD COLUMN is_favorite INTEGER NOT NULL DEFAULT 0; UPDATE schema_version SET version=46; clementine-1.2.0+dfsg/data/schema/schema-5.sql000066400000000000000000000004701223327513400210530ustar00rootroot00000000000000ALTER 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.0+dfsg/data/schema/schema-6.sql000066400000000000000000000002251223327513400210520ustar00rootroot00000000000000CREATE TABLE subdirectories ( directory INTEGER NOT NULL, path TEXT NOT NULL, mtime INTEGER NOT NULL ); UPDATE schema_version SET version=6; clementine-1.2.0+dfsg/data/schema/schema-7.sql000066400000000000000000000006371223327513400210620ustar00rootroot00000000000000CREATE 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.0+dfsg/data/schema/schema-8.sql000066400000000000000000000016341223327513400210610ustar00rootroot00000000000000/* 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.0+dfsg/data/schema/schema-9.sql000066400000000000000000000002021223327513400210500ustar00rootroot00000000000000CREATE INDEX idx_magnatune_comp_artist ON magnatune_songs (effective_compilation, artist); UPDATE schema_version SET version=9; clementine-1.2.0+dfsg/data/schema/schema.sql000066400000000000000000000012501223327513400207060ustar00rootroot00000000000000CREATE 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.0+dfsg/data/sidebar_background.png000066400000000000000000000244221223327513400220110ustar00rootroot00000000000000PNG  IHDRFߎusRGBbKGD pHYsMWtIME  htEXtCommentCreated with GIMPW IDATx}sw.Y#9eW!$|RJ^Ue[eK$ =fPr/bI$pOK3?. "`21p@L{#_Q0"_b!t (|Ѝ;fB/?d6X.BC: oH C9Ȅ NP@a@h0-a|~ qZhK f.E\F kR``.Z")Y62Cn5WޱYWӞE! ܊5נgXoAZk9ъ-oLfFf!X>joC ]Y% lCDDĪ`ooá.8eX"G2/lUDf&>3X%&SL&fr6\Ĉ)%vaJ)cxPqdf3 pG!UqgR$⸁]ߗ7MZL&Sutu<3#%9΢X(VH)%www3CBuR*㏧Zk/tX10sWd2q}իVEQ`f&RJi$"N)9 013N}֭[O?[foͪ )]X~*>|8 !#"@;ASs윣tM8fNBVcf}gŋXl8+g^⹩&%QD<Ü ɤ+{%&T NE"B(ǨBD9F'''p8l(6%1pJ%͉,X@I4D4%PF b!^%@#3 "3ǦiJ ?t' Ɛ,q躎h,^ ߮mVNs1EuZ "oRJRb\l۶("iCCx˄WS:!*/T1F]a鄸7RBD;9As%Dd"BQΪ{)%L)x<BEʘbFzũuYS_Dhk@ A]ױ)xs D$Dtxp=MF!DovզέYʪ.Px?y ]/ Bz򎙋Ra@Ă{!@ Mq[DLI9SMolG5@7(Ԕ&EQhd B Rr!ރwQbyQE/!K)yfb̐R!Cy;EQgu)AFX&/pTJ̌D! Eg̽/琙l~뜬e9BwD1s0X1>;GDW/L{Y}i8 lxǪ! {: fB@BB9};f1$H)UP1ݾ}{;DcqJdb%VpFa^屿)s3f>gDFWL/K,cl!H\s.gfME(˲Oo޼!~h~?i +K]u^NL81Dc-8"ReO)>.)18TQC^¢|<ZP`. }@ ^xGGGmj\c0Tg;cax31NpX"bBaQ7r1vE1V)#qv?ʳ24FĚ"ctU)%Y'<;JS`<޸q\6W"(nr*7\)X09a 7FVUk?IlRQ',D4!8qIAJݾ}g&TQ1h$P_C{K2:`Ji6K૯ckyȋ:PADхJ=hݻw~֭T ^p'*A &RQ{FǏ=z4J)xSs$.f:D Dc"?|xBzcM_eƲHUЀ૯ ӄ91F$"L)8Ь%7nݻ7`WlHU00|H WB()?ٳtιZ#&84x{fPu Æ#s3cPsǥIj&9Δ\Xoofٳ8l3cݙS>S p,f8G3;Wx 9yOL]˗/+g}~ឦ'ƙ= U*fU>ICd抙%3ˉE!K֧5~/3!3wgBU7"zL hnYhS'6|T=0K.!5MsmYN K=\&p bHW̅<j" yZX#T~ᘈ~Ơh5EBܮPCm{'@8`G!UuʤXzh9lSCKJX{sibUNi0!̧Uy%6٪4\;Ճ=4\51xyJWhcM YNNNRJ' -z9D*ߛSض]dDW2> bIlfc)!Rwl=z'4-jAs"",p8L[oQu~8:)Cb1d[" k^r 挏LS'ǏG)]f0РnbJ 1 6.8Z"`M/BAu|XBi-9P(o# r׿xI" 3{"B)fB)4"ɻ"bщCbA2ιz#6W^3XHL6!}>}QuId"5TUC4IwZ^oㅃwQŋ܆0yiaZ:T5a ~Կ/rp||\Q휫wH0L|Ai9Kf.9x3pȟ9"XV-&g bBf-^ulc'V2s) Җ{œ'O<@7JNOOfقPb Op8;wtUe֯Y57`Org2 :>>.e9xҕrxoo']ӰH[5Ç~: !TTxvpp|go DO;Dl{A6,f fQ#Dq:Kt:JZS0o<~ML 4d ԉ:'1\8Cѧv?{ 7EGgkK#@ѫ5"v[:?{$kġK)t:~!(6D5$@^#$D Z٬vww)j9mh$כZ9ԑq9"䌢6 1OPYee>{{{ཏ1Z2NDD(q]ٳgPELd;&zd|G:Pz>kfQILMpMՆ8k-8Y3x-̤@Q񗰩w,ˎZ_́;"*|nh6hi#ȩ{m0̋4>7rKi~ppaWies.EqpDcdWLjL~Px]4SgPe> b}RJ$xJdfctO>cmd (Y/Ic\hDTmxGAQ10! ĜwR&R!" aldޜ*K% hgD%"V<2p cԢ:՗spp}〈RJcfAA4<k}KYn!D2rdSX8b*Q ##eu9DáDvhCVg관*:.L)B="IPJtJXC q?A眛V;KsǘR&Lo̅ίZ'zFĩх5`~уmb|HDR'<>?L4gS"9 @L@[K:.HmpFDsONs||ywrrbHG4zDVvB/)E%Ы! !,1?,kMzƦu_Wq04GGG+5ϟ?oa2`+eh3ZQl:CٛMukܾ};?qFb">{L\,%F)u  +;Xvj,;ŋ/ܹsgzxxlFE١vܚ^'Lѡl|jpJo_!ZhпsCR7c"z6ĐrΐH%,t:E(fUسpN)Jl,G l79dUmOEi1םD`S#ٕ#˳,mbzD}޻ K)̓#XsRu9FT5zbd,y1<~iZxpp=xFpmSA.tNLD})juG1Juþhnq%ny R<\R@"R0֭[g~sHXWJk8[y FXdÇ8N8KD3"*3WDق}bgRHCu5Y$Z #/^*Y\CU/JZ_OӑpJ\Ejœֺ$mfW{NH+3re%}R/-E{BA=˅I {1m;tΕ)3l'M ̻yՏI.FlhU<+-+Ezd{ѽzrrGGG"RJVJPxCu Hk{]pu(3HD}0K0dyҮ+s ,`y,I<99b#Gyz*a^31 "au^ƶ'_r5j6@a3i=L+\^(2@= 1x2yQr.E,"18r1% #}T 5yE,9㏻u]U)%']J):&TE2Q5"wSCѸ6V[T}p DAcl(9!"QmZd{&*2իW9Z`.k`Uyh}3n{>xvvF}h&BtHJ*Bp2^56pQŜqjayFfͦÊe?NJsv<:Rȉff7o;;;"ڙ {5I+BYX ɛB&8Ɍ̈h%>eemq`}zHѬ-/s=#4M*ொYh߼z e1T<$1sܻwjgcvU9Yk]ޤ{#hSͭҺ &^SJX N<\n޼yrMϒ֘)~;ٯ L-S7|WQ+_4 ɴBD4CK{nh4: KsqŊڙȫD:J)s휛 WܡEp"V>VatG-]{- 7Kd2)hR*9Eqm1s͠ `zƍzN!lۉ\״XuAo0& ᢨq潟u]e3ü>IX8y'|b[Z:˸L0*]&Eə1&8#Fbtj1V0X[g}Y4Z- gy&(Bka^0⻵>8Ji@c}Ȍt2yvΝrZK3 #'JTmCm̠bB#Iڃe*8XFhsgl?}ܚklDK#`ێs400.:iK .A+B|a](#jj O) oݺzSŶp`LZ]Ӑt:=ϧϋ"(hR1\ +K; I{QN2_!ܾ}{"3B_dB(ʤ;-ZTy͔FY)ʡ宋[ļT +t"\4C`RªݻwsQxc%S[ӧo 5s%@ZLm<_{;`g{-#sA͛>%Zf9f9V擨G82`g#7ol޽I%*o!j?5Q5K->ZTLot&FCi`+qexOOOoXH/_}|X+i[w\|he\| `W˚z%asGY.̅gϞ<|{>[t8zsm9Qm<3G9]1>FQCaPۂְ7N3iQsH^N[9bmBe$ R{ 'OTq8m6EQ{z\Jtķ$ :A&ÀF,YSi 3 f/^'''rՈ<}y{OwU+%Y\MGf-~7LB'\m@`KXw?81&k:Dl7,{$_ت38~+hۦa/W1˗/ggg#E^Dnݻ9( wxx1uI@+> | ~?~-DR[E!t{'ONOh2.ZK!ˋ`iCZixpSf]}zzz9)s4!ބi8 M\bRdtܚKti tzz껮+a~#yJy~cg {[旐pOh]Z*N* VwOWYW8>}~g7LOetprM"+o 2ɣ`z'B.'*nrJf.mr=Yajy96sUҪze!@JD\vyEnRLC@koJK!TQ "cVjEys<r[{úa\N̘F3y_G-d.Wo1,CSnpr\Tߘ}MiTiUmO<(a!/PP\[4E^mm|ZΉtcHlAQ^=D(X r#(*.e!gpьmQs% Jhr`Aꋽ6Q*k"!\nd"sAiY;/>K] -7YI'. =䌃.&+Vh11M7Br IƯ'Y+˺i8 ި[nB8_ q5hZ%~gkTf0Ʉllm.9`>)8k!+`6 |o7נ4$n"{{{`t!h!KgʟsX IENDB`clementine-1.2.0+dfsg/data/smartplaylistsearchterm.css000066400000000000000000000015071223327513400231720ustar00rootroot00000000000000#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.0+dfsg/data/songinfo.css000066400000000000000000000001141223327513400200170ustar00rootroot00000000000000QScrollArea { background: qpalette(base); } QTextEdit { border: 0px; } clementine-1.2.0+dfsg/data/spinner.gif000066400000000000000000000012411223327513400176320ustar00rootroot00000000000000GIF89aBBBbbb! NETSCAPE2.0!Created with ajaxload.info! ,30Ikc:Nf E1º.`q-[9ݦ9 JkH! ,4N!  DqBQT`1 `LE[|ua C%$*! ,62#+AȐ̔V/cNIBap ̳ƨ+Y2d! ,3b%+2V_ ! 1DaFbR]=08,Ȥr9L! ,2r'+JdL &v`\bThYB)@<&,ȤR! ,3 9tڞ0!.BW1  sa50 m)J! ,2 ٜU]qp`a4AF0` @1Α! ,20IeBԜ) q10ʰPaVڥ ub[;clementine-1.2.0+dfsg/data/spotify-attribution.png000066400000000000000000000102701223327513400222340ustar00rootroot00000000000000PNG  IHDR1@xbKGD pHYsHHFk>IDAThݚ{]U}?}}{2L$$$JI2"QR`lZC@Eh_E vB0 &HIH2ɼ}>f\]{sQcov %w5 zE' OaNNg变y/ tvnGU)"zGE8U`1̪W8&gTIkuuঋq@,L] "|8Ez2= +UVe[<;w1 ?7Lj`%Z1!Q!44 B*VyXU-7&<.G5JJ~VFcaB"!x 0UܦVGv;V%,t2#\edS PI=l *Zei>VxL7"…F(@xu1 fa!PTǬ"Z/}phwiEaqqUv=ުiUkJwlA[@U& zbEƄ*ݏM8icX zL2V z^Jt'#T"P11R_o\y|t*$Pq'Wy)Uz}I-n,/p3M.Zp# Vيq@sT;Rn[*} " c (*4Hhjl )DmqmCrD^Wk[+aw1%WinCk1~4%J*Ek#5">b5jB0D>8H;v2ha MAucHpPҪ\3s;Io2S[.~SI{]-c0WH@_f-Czu<]U53g8U`1LƄDͼ;G 0[!0Nwjv=5dt9Y -{>lì<`JTULN%ioM{lfu]Izhz1{g'4,Vsxī(͐~;< L 43-ļ|ӌgR|/AWt]ޟV}=_+:S9N?+Q?p`d}n%SK!J40xI1EC|:͉ٴ&МM*~,$j&4ٳngrz t3r3gO!^/yIN  vPCfRuK%wYBF$.ZټҚ:$k6Sǀ />0W!^/8  H$P1I]яd\Uڣ@gw1'x6;.Hʋn ('U^ւ #浑';I2Q2ᬲ|a+ilsӒAvr4V3(Z+X\u1x&E)1t64&a9 qn-H+M4[7"[o%Z,gAEv<<?s8~i]Dox~ jyd5mQPY_a{1[,I!rF՚3;D"s%橌 9T``t'}#;qR踴&WBY (U&Q5T$'>1??dF4b$X!-2&S!o 6˞=ɓ?n #e)F*YU6:~v/x)͋j9SiM͠!Eo+]͒+ 07?"݃kϼN`l>Jq,+$يt =`z?0E6jB Fb^#X-əLj1- |:Ē;PUz7v~pETI 2VR Z"|7q!ƽFxjkaļ$m cFE3&4F`U,r {oK#)dCTomjQ 9Ǹ~'E`cUlùnZ'ٙ^֞XF]BʷAܷZCa>TWݧjW0TQϧ*5̤%9W]F U K G-M+܉r:TQcTIKM[HmQ1 ) 5d,䌟P62<Ƚhz\|/R!LAO#s(t{}ArVtlHבF^jUIV/9$lEB~>$VbWL$NUT*> V`E]ٖ5\"o^iL ѪmD} _4֫0&eB`EvELlv>(g%??]+Wˀ_q{3NR8iU ΰ KpCL6 NCZ1;q@ X܊sۀ.u^ |s_O_~<>O׆t/;!p=Dophbׁwpl&p/Nww< +q.C4pUS\A="ދyޟ#w. p4W͡.~T8+gI -7i.*ೡdD_/E8.\:NIpҍ82?. 4f4.ù6D 煮 Wr*NGWnݶ+Px gE7Օ8[Yر' dui< g!/*.f"bM4뷔ҔRأ`~g~ޣ_ō ,DrfMlxwoz?2]uUlcJ_3svc]_{\/"{kx؇sUlq_׿.IENDB`clementine-1.2.0+dfsg/data/star-on.png000066400000000000000000000006351223327513400175640ustar00rootroot00000000000000PNG  IHDRsO/sBIT|d pHYsO`tEXtSoftwarewww.inkscape.org<IDAT(?/ea=$ %)֟|J"Pn4JV5XQ {!ǍsIxfyyN,KMpKM3&\_ӏѭ_r8JDY@f`?.p*"ta}Qtq]d C,t@jDtBfcAD;\^Bك bpS#̷7X*۸zCz ֶrvfa9<a[~wٗ1IENDB`clementine-1.2.0+dfsg/data/tiny-pause.png000066400000000000000000000035701223327513400203000ustar00rootroot00000000000000PNG  IHDR@@iqsRGBbKGD pHYsttfxtIME'IDATx[Mn; 4jN[$zީ)@]I H[$4)Mqp#%MmrŜs9)s1#8:" ιs~캎97~ׯ_p?cbcJi19!4DG{?E߾e`@!9O)1BJ oyιiz:2B9.cK:J=!³]踱$^H("N7trΚt 5J 4H899CurHc%R9by9hU2&Fެ%SJ:9* #!AwV)`#5t3> "])-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.0+dfsg/data/tiny-start.png000066400000000000000000000032731223327513400203200ustar00rootroot00000000000000PNG  IHDR0@\ FsRGBbKGD pHYs B(xtIMEf;IDAThXMhG~38CrɥChiNiLK)- ń =Ҭ5*jJ"'i4M,ER\-*Bh;xh43+9rj@*Z|0ƺrJF&翁. ]OMM}T*}LƟJA{d2Y~w`Af:^zI)ݽ4:>>J< P^ŋfff5yrAtwT/--Ňc*OuNRϟ?? A(c@.ƞRb1~˞g\~grrٳg({ܹC"֭[/mK ozor݉gΜ: |RJ.// l{ עeړ'Oޛ{ttt 61` t{~tg.ϿBbO9.dR21ST*OOOj+X}}}#2HpQC ð }VO\ ˽vTBb7%%*W\) }1=ztDBO>JQ6}V{{{L1VӧO?+H|\8rH4VZ[_ZfСC;Fu~-cٳcBJrPTpO)$omm'q~=w˛",f'SJ"(ۃ'6ytKlyj:sĉ_N>}`YH$*TA&AÇ'O4RBbyz7ՄV|R8iq$!>䌡۝V:jZ jPJ }8Tzzz`ǎSJ/x~GƸ)_k"IXmm ׶mj7LzÌ7@a.X~qTE<pmXVk>j1Va[W:A7L[ӣ4ڵ,a]Tk( }lE2<.pgTFhH=pEZ.=' "MVWAaϳ],jHQ$U& PM7"!I \'"" h ATk%&yY")LQV|2i'tx." Atk Q h9~$!k׮V4ۤyd"X{ Bȝ$"x]Q =1vsDOa˚6TtȲ,^"[,J20v@s[.,,Nwu6ot@4]XX` Ft!c޸qL'*K) BE o84IDATH AӎNAv$@BͫPSr%I=ː១$IsּIENDB`clementine-1.2.0+dfsg/data/volumeslider-handle.png000066400000000000000000000005401223327513400221370ustar00rootroot00000000000000PNG  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.0+dfsg/data/volumeslider-handle_glow.png000066400000000000000000000013501223327513400231670ustar00rootroot00000000000000PNG  IHDR$gAMA7tEXtSoftwareAdobe ImageReadyqe<zIDATxTKQ̝\w7%mmI70!PK")(+} {H D-_^* C+J"խ\w\uڙ;N?׽1pswfM@Q(P( $ߺKR~K .YN TћuhI(W4 \Kln5"ߐY}eiv**j46UPRP52^旖"x-05}j`$RX?rEQ`d2ᡁgd^*8B1N_ڣN8xbʬqݑ2ZF5|NP|4Z'1;+\@z`XkꯂRDVŲ,)Kc\B iGpFzXNLAm3b7 *bY,,de XcN8ֲmEmOXX|`KxIENDB`clementine-1.2.0+dfsg/data/volumeslider-inset.png000066400000000000000000000013031223327513400220240ustar00rootroot00000000000000PNG  IHDRp$v!gAMA7tEXtSoftwareAdobe ImageReadyqe<UIDATXK@r!(d@ +p$9 bImnt$r/bꮎ;<:<^4~1#h0ƴFa#] $mLj1!!\1$cf01"dHȀ)?A1 9 hHvAh -ZLLBqGDJxWpќ6f(@PLy !))Iơh{d4@-#1C;(1)|cƜ%rar$]BvX"@/f Ow*a(4 B6U9B]eP|hES ᰚڬ=w"`v0?lsu]8@wrjf"kH|s_ʸ^47.ֆ88lA.0eȜ:EZC") \*xĩoB֧x%Yo[L,+hȈ ewWO[T3'[+#nٓk؜cܷkӄhI4_Yo;o#IENDB`clementine-1.2.0+dfsg/dist/000077500000000000000000000000001223327513400155215ustar00rootroot00000000000000clementine-1.2.0+dfsg/dist/CMakeLists.txt000066400000000000000000000040471223327513400202660ustar00rootroot00000000000000execute_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) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/windows/clementine.nsi.in ${CMAKE_CURRENT_SOURCE_DIR}/windows/clementine.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 application-x-clementine.png ) install(FILES ../data/icon.svg DESTINATION share/icons/hicolor/scalable/apps/ RENAME application-x-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 ) 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.0+dfsg/dist/DS_Store.in000066400000000000000000000360041223327513400175360ustar00rootroot00000000000000Bud1    obR  @ @ @ @ .IlocblobR(.bwspblobbplist00  \WindowBounds[ShowSidebar]ShowStatusBar[ShowPathbar[ShowToolbar\SidebarWidth_{{494, 323}, {500, 392}} ". NSPrincipalClass NSApplication CFBundleDevelopmentRegion English CFBundleExecutable clementine CFBundleGetInfoString Clementine 1.2 CFBundleIconFile clementine CFBundleIdentifier org.clementine-player.clementine CFBundleInfoDictionaryVersion 6.0 CFBundleLongVersionString 1.2 CFBundleName Clementine CFBundlePackageType APPL CFBundleShortVersionString 1.2 CFBundleVersion 4096.1.2.0.1 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.0+dfsg/dist/Info.plist.in000066400000000000000000000155711223327513400201070ustar00rootroot00000000000000 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.0+dfsg/dist/clementine-feed.protocol000066400000000000000000000003021223327513400223230ustar00rootroot00000000000000[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=application-x-clementineclementine-1.2.0+dfsg/dist/clementine-itms.protocol000066400000000000000000000003021223327513400223740ustar00rootroot00000000000000[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=application-x-clementineclementine-1.2.0+dfsg/dist/clementine-itpc.protocol000066400000000000000000000003021223327513400223570ustar00rootroot00000000000000[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=application-x-clementineclementine-1.2.0+dfsg/dist/clementine-zune.protocol000066400000000000000000000003021223327513400224010ustar00rootroot00000000000000[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=application-x-clementineclementine-1.2.0+dfsg/dist/clementine.desktop000077500000000000000000000126261223327513400212510ustar00rootroot00000000000000[Desktop Entry] Version=1.0 Type=Application Name=Clementine GenericName=Clementine Music Player GenericName[pl]=Odtwarzacz muzyki Clementine GenericName[pt]=Reprodutor de músicas Clementine Comment=Plays music and last.fm streams Comment[pl]=Odtwarzanie muzyki i strumieni last.fm Comment[pt]=Reprodução de músicas e emissões last.fm Exec=clementine %U TryExec=clementine Icon=application-x-clementine Terminal=false Categories=AudioVideo;Player;Qt; 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; X-Ayatana-Desktop-Shortcuts=Play;Pause;Stop;Previous;Next; [Play Shortcut Group] Name=Play Exec=clementine --play TargetEnvironment=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[es_AR]=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[sv]=Spela upp Name[tr]=Çal Name[uk]=Відтворити Name[vi]=Phát Name[zh_CN]=播放 Name[zh_TW]=播放 [Pause Shortcut Group] Name=Pause Exec=clementine --pause TargetEnvironment=Unity Name[be]=Прыпыніць Name[bg]=Пауза Name[br]=Ehan Name[ca]=Pausa Name[cs]=Pozastavit Name[el]=Παύση Name[es]=Pausar Name[es_AR]=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[sv]=Gör paus Name[tr]=Duraklat Name[uk]=Призупинити Name[vi]=Tạm dừng Name[zh_CN]=暂停 Name[zh_TW]=暫停 [Stop Shortcut Group] Name=Stop Exec=clementine --stop TargetEnvironment=Unity Name[be]=Спыніць Name[bg]=Спиране Name[br]=Paouez Name[ca]=Atura Name[cs]=Zastavit Name[de]=Anhalten Name[el]=Σταμάτημα Name[es]=Detener Name[es_AR]=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[sv]=Stoppa Name[tr]=Durdur Name[uk]=Зупинити Name[vi]=Dừng Name[zh_CN]=停止 Name[zh_TW]=停止 [Previous Shortcut Group] Name=Previous Exec=clementine --previous TargetEnvironment=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[es_AR]=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]=Prethodno Name[sv]=Föregående Name[tr]=Önceki Name[uk]=Попередня Name[uz]=Oldingi Name[vi]=Trước Name[zh_CN]=上一首 Name[zh_TW]=往前 [Next Shortcut Group] Name=Next Exec=clementine --next TargetEnvironment=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[es_AR]=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]=Sledeće 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.0+dfsg/dist/clementine.icns000066400000000000000000005453251223327513400205400ustar00rootroot00000000000000icnsis32Y6{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.0+dfsg/dist/clementine.spec000066400000000000000000000063241223327513400205250ustar00rootroot00000000000000Name: clementine Version: 1.2.0 Release: 1.fc13 Summary: A music player and library organiser Group: Applications/Multimedia License: GPLv3 URL: http://www.clementine-player.org/ Source0: %{name}-1.2.0.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 gstreamer-devel gstreamer-plugins-base-devel BuildRequires: libimobiledevice-devel libplist-devel usbmuxd-devel BuildRequires: libmtp-devel protobuf-devel protobuf-compiler libcdio-devel BuildRequires: qjson-devel qca2-devel fftw-devel sparsehash-devel Requires: libgpod protobuf-lite libcdio qjson qca-ossl # GStreamer codec dependencies Requires: gstreamer-plugins-ugly %ifarch x86_64 Requires: gstreamer0.10(decoder-audio/x-vorbis)()(64bit) Requires: gstreamer0.10(decoder-audio/x-flac)()(64bit) Requires: gstreamer0.10(decoder-audio/x-speex)()(64bit) Requires: gstreamer0.10(decoder-audio/x-wav)()(64bit) %else Requires: gstreamer0.10(decoder-audio/x-vorbis) Requires: gstreamer0.10(decoder-audio/x-flac) Requires: gstreamer0.10(decoder-audio/x-speex) Requires: gstreamer0.10(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}-1.2.0 %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}/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/application-x-clementine.png %{_datadir}/icons/hicolor/scalable/apps/application-x-clementine.svg %changelog * Sun Oct 13 2013 David Sansome - 1.2.0 - Version 1.2 clementine-1.2.0+dfsg/dist/clementine.spec.in000066400000000000000000000065411223327513400211330ustar00rootroot00000000000000Name: 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 gstreamer-devel gstreamer-plugins-base-devel BuildRequires: libimobiledevice-devel libplist-devel usbmuxd-devel BuildRequires: libmtp-devel protobuf-devel protobuf-compiler libcdio-devel BuildRequires: qjson-devel qca2-devel fftw-devel sparsehash-devel Requires: libgpod protobuf-lite libcdio qjson qca-ossl # GStreamer codec dependencies Requires: gstreamer-plugins-ugly %ifarch x86_64 Requires: gstreamer0.10(decoder-audio/x-vorbis)()(64bit) Requires: gstreamer0.10(decoder-audio/x-flac)()(64bit) Requires: gstreamer0.10(decoder-audio/x-speex)()(64bit) Requires: gstreamer0.10(decoder-audio/x-wav)()(64bit) %else Requires: gstreamer0.10(decoder-audio/x-vorbis) Requires: gstreamer0.10(decoder-audio/x-flac) Requires: gstreamer0.10(decoder-audio/x-speex) Requires: gstreamer0.10(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}/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/application-x-clementine.png %{_datadir}/icons/hicolor/scalable/apps/application-x-clementine.svg %changelog * @RPM_DATE@ David Sansome - @CLEMENTINE_VERSION_RPM_V@ - Version @CLEMENTINE_VERSION_DISPLAY@ clementine-1.2.0+dfsg/dist/clementine_1.0.0~lucid_source.ppa.upload000066400000000000000000000005231223327513400251440ustar00rootroot00000000000000Successfully uploaded clementine_1.0.0~lucid.dsc to ppa.launchpad.net for ppa. Successfully uploaded clementine_1.0.0~lucid.orig.tar.gz to ppa.launchpad.net for ppa. Successfully uploaded clementine_1.0.0~lucid.diff.gz to ppa.launchpad.net for ppa. Successfully uploaded clementine_1.0.0~lucid_source.changes to ppa.launchpad.net for ppa. clementine-1.2.0+dfsg/dist/clementine_1.0.0~maverick_source.ppa.upload000066400000000000000000000005371223327513400256520ustar00rootroot00000000000000Successfully uploaded clementine_1.0.0~maverick.dsc to ppa.launchpad.net for ppa. Successfully uploaded clementine_1.0.0~maverick.orig.tar.gz to ppa.launchpad.net for ppa. Successfully uploaded clementine_1.0.0~maverick.diff.gz to ppa.launchpad.net for ppa. Successfully uploaded clementine_1.0.0~maverick_source.changes to ppa.launchpad.net for ppa. clementine-1.2.0+dfsg/dist/clementine_1.0.0~natty_source.ppa.upload000066400000000000000000000005231223327513400252030ustar00rootroot00000000000000Successfully uploaded clementine_1.0.0~natty.dsc to ppa.launchpad.net for ppa. Successfully uploaded clementine_1.0.0~natty.orig.tar.gz to ppa.launchpad.net for ppa. Successfully uploaded clementine_1.0.0~natty.diff.gz to ppa.launchpad.net for ppa. Successfully uploaded clementine_1.0.0~natty_source.changes to ppa.launchpad.net for ppa. clementine-1.2.0+dfsg/dist/clementine_1.0.0~oneiric.diff.gz000066400000000000000000000135431223327513400234060ustar00rootroot00000000000000WN{ۍV0rҌ3$ᘆD4ɔc_&4`#5ZdߘOНj32+\  B""YLhd?5GDD$S'8ozcFlp\?=qLYal G'̟@W5Pd€彂exM\xLۧ Vku59NQ_Α F=&n4\<.w0~Rgsv )cih80ȃѢ+:Ξ1GLfO),0tiȅ/˃OAyc7wN҃q@ 8A*IW@DJ DJ#nBl\`KXbS%ңJC2:ϧ$yxO"`o>J !`W&FC,cȸA+ѷlrtXۓ㣓cR8>nG~26GD$@g"E䃘v "&Aa&~,8نY]Tc;bcNX@@9("W~@\*áWr*;LjE;G?0C0%uR-Z(+4a##M+ڻp÷R(+7N +#w=zS3U7 J*S&=1x6Rmco$^ty /l^wMCV䦭OA4,N`=騍+T ؐ YJ 9־*{ 'd2:-g&.LݨC[5:oT@g{̲]y|.Bǥ=oȡ/w.R^PQԕ}1rܿ}z4rgKdWɡ!^x_&)UR>i|p $^$M&;83PUNx >ݣνPI+X Rp%,RR^})zA(8AM(J*>QT!LWMhJIcP|"> ` "G"iґH~H&ALCX [2"=sf>dJ̙7 &"Hv"ԋӰD~Qվ@2.x.&$Sg ĸvp1 dY<gxa|h`$,V I{4""p?[Ы )D׫ ᐇБii3t2&>X*p J&p$SAњӓ$RZ*>q'mҶH<ݢdn v H_|U1 dHu y A<bb0ON״Ya J2u1-b2K\W/gt2XLҷMlh"lp><뿔#1CMJ*-)|E뛦tn}+>} os?qvs7vg[|}f}x ymo 8%V.){LӣT/Mdp؟6P*lfBJ*.|chtF5{ gVaFѳ>lLݭ7fk\P4{"X Ǹ5Wts [թ(eK TZ/(}5֭u̅NțB5 ŇkpV;4JDžȄ_ 9',=tO4Ħ Ql0b̒OhcܒJ{ ًyɅ2- ^S;p<:ZjʝU.wXm.ܲ)23|]H<'a7C:,@B8sY\g{Kr e0U&!tx lN]L. ,- bO^̪TTHR'hT,B4ˍ-VH[ 7W@gtz0Kdv;` V B 0},-|ܳZ\v24*o@hKͦ p]VO#=F5zWa~ʈʶ>Zhr8 <bbۘBA7?[yʟ;2ٗH@ @>\L`Z}a Rӛ9жK`O 7V/?乧vmKjXIm)n-LX|ַL43ݾ:8ʯ-Sk#v"€.2TqJG`Ee7sU5PL82-`^X)uq1'EĬvi"`{LDz{ czC1 38[$nrgO+˔hcjnWR 3Wpb $ZVr.'*t'AH)VO`T$6#bVjE.3g&URZ&_ O^_^\"@_`L%;k,EN`RU**PZTjJfPJs+EPY9 qQd(WA]A EI}0}iU.|B'/1YNkmASlltK \‡$p3Tn/lIJq~ƜtL}p8wC SD7ǃ9bbj3l@1ln Pa ;GHòaJApj*zXmsڧ@a *DUrN5lcz`mJ6/lc@I|w=^EX$I ^dqQeEX0· _:2MãJT9>пH/AlkQ; &C8_1ѿ'klֿ)_yʗ!tѾ#WUw'm -S;:qS4m/\UcA}QQ;KwZ~dR*ޢ-6EiNL]U]fQSsn:qYMޡuR2@,2h/ZV.2he% 9*`e,)R"5`cձ%!.M 0;.r3VKGV,;T3%\h Cz򠊬c!E%wkR&>F*%]Fiӊ].u"g+dL:_Gg(ȉEId6(%x噔*C TXΪG ^*l2)*Y&1 -79M\3WЍ&w-;UKQ7]}_%2:vz;LY#m 1s5 @_."X=׮). |dTMLI&o< QɊ,>AQDDg8 66(an^v{)J;+:Har??Vi>M&Z'KRULOhA5als|˹f9(>+IЩ\#cKrLQrl )Ng7̅ iyR1ȝ#Ե7>e MvEK3[p{nV{ ̀CIp9c%633dg]p4 %{> p hbYg1+M"לZ/aY;xڻzHB1D658& B,VJAe7֚(8'*ue TP*8VMj^iOKudje0I{Mya?-pBH!_)Wٕyś̤j? _:#oRCGp!~"Vclementine-1.2.0+dfsg/dist/clementine_1.0.0~oneiric.dsc000066400000000000000000000035311223327513400226240ustar00rootroot00000000000000-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Format: 1.0 Source: clementine Binary: clementine Architecture: any Version: 1.0.0~oneiric Maintainer: David Sansome Homepage: http://www.clementine-player.org/ Standards-Version: 3.8.1 Build-Depends: debhelper (>= 7), liblastfm-dev, libtag1-dev, libboost1.38-dev | libboost1.40-dev | libboost1.42-dev | libboost-dev, libboost-serialization1.38-dev | libboost-serialization1.40-dev | libboost-serialization1.42-dev | libboost-serialization-dev, libglew1.5-dev | libglew-dev, libqt4-dev, qt4-dev-tools, libqt4-opengl-dev, cmake, libgstreamer0.10-dev, libgstreamer-plugins-base0.10-dev, libgpod-dev, libimobiledevice-dev, libplist-dev, libusbmuxd-dev, libmtp-dev, libindicate-qt-dev, libqjson-dev, protobuf-compiler, libprotobuf-dev, libqca2-dev Checksums-Sha1: 83186f06a13f443412eab5ae212b9caae6c395a3 8250974 clementine_1.0.0~oneiric.orig.tar.gz 40e4faa68dd5d8e4ec043b29b140b4a092cfd2f8 5987 clementine_1.0.0~oneiric.diff.gz Checksums-Sha256: 96e7ae0d35480e4f8e85d4b54cd7f87967e951b1c6b53f10c066e65e4dd9d8ff 8250974 clementine_1.0.0~oneiric.orig.tar.gz c820eb78dd831de13672257516658e750465f4bb9e5ed18bd8dade77f9fae427 5987 clementine_1.0.0~oneiric.diff.gz Files: 8008e1e3af478d1430f4c6f4171913c4 8250974 clementine_1.0.0~oneiric.orig.tar.gz c28fb541989cf8c90357e6f2c68c15a6 5987 clementine_1.0.0~oneiric.diff.gz -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.10 (GNU/Linux) iQEcBAEBAgAGBQJO+xpXAAoJEPjgEfP2q9guVMIIAIjnviJnx1siazqktxEbvSeR dd0rzodE4aJhQJRU0TdAPdA3iLqDpTW2DNCix5sCDNefAFoDu9yKxIEefcKd/tkt MDyWQgCBPYTxXHVOlI/BWQF8fcO4NG/slGXlEFJFfIQaGfId3fI0TAm3PZ3/Rq5p MWU310EhS6cGepH7bCkfbUkR1a9XhT/I6goMOdqf+fBFua4h6609nwV1KaiLllra IuoBO+bbICZk2kMB6KpLlwuP+0YKLcK5ffYTuDVzK+0dvYRainkNHcZRqPLQvxW5 s1D/jtaXIM4EJsg8x/SS4g7F+Y6qnAAc67e1AQEVOfopcwqz1912S7lZTjV9qqM= =uWYt -----END PGP SIGNATURE----- clementine-1.2.0+dfsg/dist/clementine_1.0.0~oneiric_source.changes000066400000000000000000000034571223327513400250520ustar00rootroot00000000000000-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Format: 1.8 Date: Wed, 28 Dec 2011 14:32:03 +0100 Source: clementine Binary: clementine Architecture: source Version: 1.0.0~oneiric Distribution: oneiric Urgency: low Maintainer: David Sansome Changed-By: David Sansome Description: clementine - Modern music player and library organiser inspired by Amarok 1.4 Changes: clementine (1.0.0~oneiric) oneiric; urgency=low . * Version 1.0 Checksums-Sha1: 382d4a289a639ef6ad53d3fbef55c9bf75b053e9 1881 clementine_1.0.0~oneiric.dsc 83186f06a13f443412eab5ae212b9caae6c395a3 8250974 clementine_1.0.0~oneiric.orig.tar.gz 40e4faa68dd5d8e4ec043b29b140b4a092cfd2f8 5987 clementine_1.0.0~oneiric.diff.gz Checksums-Sha256: 2337428406d0ba667e09596f3ed2a9079d1ab53810a01c1b4a053b4810d23858 1881 clementine_1.0.0~oneiric.dsc 96e7ae0d35480e4f8e85d4b54cd7f87967e951b1c6b53f10c066e65e4dd9d8ff 8250974 clementine_1.0.0~oneiric.orig.tar.gz c820eb78dd831de13672257516658e750465f4bb9e5ed18bd8dade77f9fae427 5987 clementine_1.0.0~oneiric.diff.gz Files: 1101207096084b4751e97ee93b2254b6 1881 sound optional clementine_1.0.0~oneiric.dsc 8008e1e3af478d1430f4c6f4171913c4 8250974 sound optional clementine_1.0.0~oneiric.orig.tar.gz c28fb541989cf8c90357e6f2c68c15a6 5987 sound optional clementine_1.0.0~oneiric.diff.gz -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.10 (GNU/Linux) iQEcBAEBAgAGBQJO+xpYAAoJEPjgEfP2q9guvB0H/R/WHBjXdntUQm6sQej6Ka/l pdTbeo2a856wf8US4AVN5i4QuW6tlowHvyqNGqGTlxV2/T66V5NfsM2qTFZdkOb7 nKnGN4U8qPPufbkJkcBUp3jCn3UulQiztAN0BHysCu4ut4tfhV1r47v52e8UzuMG l+7LwMDKlvvslrw61hL+S6jdQE4mp3LJogTV7Y5ZFF1IZAhekdTN/CLm5nbvfIgJ kDXKI5ZKKzX9hpFGXA8Bm0Ngj2iYrd4ssb8mxg6ZEl9nt1weo3e6FCPsGfKeIE5o i3Y4/E8lrt33x0QiBznvgr6CsM9TqZChD4Ap4CqFdj3LhqyS2upUW1kqzV6Jp2w= =2Hfs -----END PGP SIGNATURE----- clementine-1.2.0+dfsg/dist/clementine_1.0.0~oneiric_source.ppa.upload000066400000000000000000000005331223327513400254750ustar00rootroot00000000000000Successfully uploaded clementine_1.0.0~oneiric.dsc to ppa.launchpad.net for ppa. Successfully uploaded clementine_1.0.0~oneiric.orig.tar.gz to ppa.launchpad.net for ppa. Successfully uploaded clementine_1.0.0~oneiric.diff.gz to ppa.launchpad.net for ppa. Successfully uploaded clementine_1.0.0~oneiric_source.changes to ppa.launchpad.net for ppa. clementine-1.2.0+dfsg/dist/clementine_16.png000066400000000000000000000011611223327513400206570ustar00rootroot00000000000000PNG  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.0+dfsg/dist/cpplint.py000077500000000000000000004662661223327513400175730ustar00rootroot00000000000000#!/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. # Here are some issues that I've had people identify in my code during reviews, # that I think are possible to flag automatically in a lint tool. If these were # caught by lint, it would save time both for myself and that of my reviewers. # Most likely, some of these are beyond the scope of the current lint framework, # but I think it is valuable to retain these wish-list items even if they cannot # be immediately implemented. # # Suggestions # ----------- # - Check for no 'explicit' for multi-arg ctor # - Check for boolean assign RHS in parens # - Check for ctor initializer-list colon position and spacing # - Check that if there's a ctor, there should be a dtor # - Check accessors that return non-pointer member variables are # declared const # - Check accessors that return non-const pointer member vars are # *not* declared const # - Check for using public includes for testing # - Check for spaces between brackets in one-line inline method # - Check for no assert() # - Check for spaces surrounding operators # - Check for 0 in pointer context (should be NULL) # - Check for 0 in char context (should be '\0') # - Check for camel-case method name conventions for methods # that are not simple inline getters and setters # - Do not indent namespace contents # - Avoid inlining non-trivial constructors in header files # - Check for old-school (void) cast for call-sites of functions # ignored return value # - Check gUnit usage of anonymous namespace # - Check for class declaration order (typedefs, consts, enums, # ctor(s?), dtor, friend declarations, methods, member vars) # """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] [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. Linted extensions are .cc, .cpp, and .h. Other file types will be ignored. 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: Assuing 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_ """ # 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. # \ used for clearer layout -- pylint: disable-msg=C6013 _ERROR_CATEGORIES = [ 'build/class', '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/multiline_comment', 'readability/multiline_string', 'readability/namespace', 'readability/nolint', '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/operator', 'runtime/printf', 'runtime/printf_format', 'runtime/references', 'runtime/rtti', 'runtime/sizeof', 'runtime/string', 'runtime/threadsafe_fn', 'whitespace/blank_line', 'whitespace/braces', 'whitespace/comma', 'whitespace/comments', 'whitespace/empty_loop_body', 'whitespace/end_of_line', 'whitespace/ending_newline', 'whitespace/forcolon', 'whitespace/indent', 'whitespace/labels', 'whitespace/line_length', 'whitespace/newline', 'whitespace/operators', 'whitespace/parens', 'whitespace/semicolon', 'whitespace/tab', 'whitespace/todo' ] # The default state of the category filter. This is overrided 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'] # 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. # Headers that we consider STL headers. _STL_HEADERS = frozenset([ 'algobase.h', 'algorithm', 'alloc.h', 'bitset', 'deque', 'exception', 'function.h', 'functional', 'hash_map', 'hash_map.h', 'hash_set', 'hash_set.h', 'iterator', 'list', 'list.h', 'map', 'memory', 'new', 'pair.h', 'pthread_alloc', 'queue', 'set', 'set.h', 'sstream', 'stack', 'stl_alloc.h', 'stl_relops.h', 'type_traits.h', 'utility', 'vector', 'vector.h', ]) # Non-STL C++ system headers. _CPP_HEADERS = frozenset([ 'algo.h', 'builtinbuf.h', 'bvector.h', 'cassert', 'cctype', 'cerrno', 'cfloat', 'ciso646', 'climits', 'clocale', 'cmath', 'complex', 'complex.h', 'csetjmp', 'csignal', 'cstdarg', 'cstddef', 'cstdio', 'cstdlib', 'cstring', 'ctime', 'cwchar', 'cwctype', 'defalloc.h', 'deque.h', 'editbuf.h', 'exception', 'fstream', 'fstream.h', 'hashtable.h', 'heap.h', 'indstream.h', 'iomanip', 'iomanip.h', 'ios', 'iosfwd', 'iostream', 'iostream.h', 'istream', 'istream.h', 'iterator.h', 'limits', 'map.h', 'multimap.h', 'multiset.h', 'numeric', 'ostream', 'ostream.h', 'parsestream.h', 'pfstream.h', 'PlotFile.h', 'procbuf.h', 'pthread_alloc.h', 'rope', 'rope.h', 'ropeimpl.h', 'SFile.h', 'slist', 'slist.h', 'stack.h', 'stdexcept', 'stdiostream.h', 'streambuf', 'streambuf.h', 'stream.h', 'strfile.h', 'string', 'strstream', 'strstream.h', 'tempbuf.h', 'tree.h', 'typeinfo', 'valarray', ]) # 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 (http://go/nsiut ) # and multi-line strings (http://go/beujw ), 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 = {} # Finds occurrences of NOLINT or NOLINT(...). _RE_SUPPRESSION = re.compile(r'\bNOLINT\b(\([^)]*\))?') # {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 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. """ # FIXME(adonovan): "NOLINT(" is misparsed as NOLINT(*). matched = _RE_SUPPRESSION.search(raw_line) if matched: category = matched.group(1) if category in (None, '(*)'): # => "suppress all" _error_suppressions.setdefault(None, set()).add(linenum) else: if category.startswith('(') and category.endswith(')'): category = category[1:-1] if category in _ERROR_CATEGORIES: _error_suppressions.setdefault(category, set()).add(linenum) 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 not pattern in _regexp_compile_cache: _regexp_compile_cache[pattern] = sre_compile.compile(pattern) return _regexp_compile_cache[pattern].match(s) def Search(pattern, s): """Searches the string for the pattern, caching the compiled regexp.""" if not pattern in _regexp_compile_cache: _regexp_compile_cache[pattern] = sre_compile.compile(pattern) return _regexp_compile_cache[pattern].search(s) class _IncludeState(dict): """Tracks line numbers for includes, and the order in which includes appear. As a dict, an _IncludeState object serves as a mapping between include filename and line number on which that file was included. 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): dict.__init__(self) # The name of the current section. self._section = self._INITIAL_SECTION # The path of last found header. self._last_header = '' 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, header_path): """Check if a header is in alphabetical order with the previous header. Args: header_path: Header to be checked. Returns: Returns true if the header is in alphabetical order. """ canonical_header = self.CanonicalizeAlphabeticalOrder(header_path) if self._last_header > canonical_header: return False self._last_header = canonical_header 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[:] 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[:] 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 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) 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: """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 esequences per 2.13.2.3 of the C++ standard. _RE_PATTERN_CLEANSE_LINE_ESCAPES = re.compile( r'\\([abfnrtv?"\\\']|\d+|x[0-9a-fA-F]+)') # Matches strings. Escape codes should already be removed by ESCAPES. _RE_PATTERN_CLEANSE_LINE_DOUBLE_QUOTES = re.compile(r'"[^"]*"') # Matches characters. Escape codes should already be removed by ESCAPES. _RE_PATTERN_CLEANSE_LINE_SINGLE_QUOTES = re.compile(r"'.'") # Matches multi-line C++ 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*/\*.*\*/\s*$| /\*.*\*/\s+| \s+/\*.*\*/(?=\W)| /\*.*\*/)""", re.VERBOSE) 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 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) for linenum in range(len(lines)): self.lines.append(CleanseComments(lines[linenum])) elided = self._CollapseStrings(lines[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 not _RE_PATTERN_INCLUDE.match(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) elided = _RE_PATTERN_CLEANSE_LINE_SINGLE_QUOTES.sub("''", elided) elided = _RE_PATTERN_CLEANSE_LINE_DOUBLE_QUOTES.sub('""', elided) return elided def FindEndOfExpressionInLine(line, startpos, depth, startchar, endchar): """Find the position just after the matching endchar. Args: line: a CleansedLines line. startpos: start searching at this position. depth: nesting level at startpos. startchar: expression opening character. endchar: expression closing character. Returns: Index just after endchar. """ for i in xrange(startpos, len(line)): if line[i] == startchar: depth += 1 elif line[i] == endchar: depth -= 1 if depth == 0: return i + 1 return -1 def CloseExpression(clean_lines, linenum, pos): """If input points to ( or { or [, finds the position that closes it. If lines[linenum][pos] points to a '(' or '{' or '[', finds the linenum/pos that correspond to the closing 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 *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] startchar = line[pos] if startchar not in '({[': return (line, clean_lines.NumLines(), -1) if startchar == '(': endchar = ')' if startchar == '[': endchar = ']' if startchar == '{': endchar = '}' # Check first line end_pos = FindEndOfExpressionInLine(line, pos, 0, startchar, endchar) if end_pos > -1: return (line, linenum, end_pos) tail = line[pos:] num_open = tail.count(startchar) - tail.count(endchar) while linenum < clean_lines.NumLines() - 1: linenum += 1 line = clean_lines.elided[linenum] delta = line.count(startchar) - line.count(endchar) if num_open + delta <= 0: return (line, linenum, FindEndOfExpressionInLine(line, 0, num_open, startchar, endchar)) num_open += delta # Did not find endchar before end of file, give up return (line, clean_lines.NumLines(), -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 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. """ 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 CheckForUnicodeReplacementCharacters(filename, lines, error): """Logs an error for each line containing 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. 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).') 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. They\'re ' 'ugly and unnecessary, and you should use concatenation instead".') threading_list = ( ('asctime(', 'asctime_r('), ('ctime(', 'ctime_r('), ('getgrgid(', 'getgrgid_r('), ('getgrnam(', 'getgrnam_r('), ('getlogin(', 'getlogin_r('), ('getpwnam(', 'getpwnam_r('), ('getpwuid(', 'getpwuid_r('), ('gmtime(', 'gmtime_r('), ('localtime(', 'localtime_r('), ('rand(', 'rand_r('), ('readdir(', 'readdir_r('), ('strtok(', 'strtok_r('), ('ttyname(', 'ttyname_r('), ) 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_function, multithread_safe_function in threading_list: ix = line.find(single_thread_function) # Comparisons made explicit for clarity -- pylint: disable-msg=C6403 if ix >= 0 and (ix == 0 or (not line[ix - 1].isalnum() and line[ix - 1] not in ('_', '.', '>'))): error(filename, linenum, 'runtime/threadsafe_fn', 2, 'Consider using ' + multithread_safe_function + '...) instead of ' + single_thread_function + '...) for improved thread safety.') # 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*).') 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 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 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 if class_or_struct == 'struct': self.access = 'public' else: self.access = 'private' # 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 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 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. Example: http://go/nxpiz # # 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. Example: http://go/ldkdc, http://cl/23548205 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): error(filename, linenum, 'readability/namespace', 5, '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 = [] # 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 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 (see http://go/qwddn for original example) 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 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] # Update pp_stack first 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 { # }; # # Templates with class arguments may confuse the parser, for example: # template , # class Vector = vector > # class HeapQueue { # # Because this parser has no nesting state about templates, by the # time it saw "class Comparator", it may think that it's a new class. # Nested templates have a similar problem: # template < # typename ExportedType, # typename TupleType, # template class ImplTemplate> # # To avoid these cases, we ignore classes that are followed by '=' or '>' class_decl_match = Match( r'\s*(template\s*<[\w\s<>,:]*>\s*)?' '(class|struct)\s+([A-Z_]+\s+)*(\w+(?:::\w+)*)' '(([^=>]|<[^<>]*>)*)$', line) if (class_decl_match and (not self.stack or self.stack[-1].open_parentheses == 0)): self.stack.append(_ClassInfo( class_decl_match.group(4), class_decl_match.group(2), clean_lines, linenum)) line = class_decl_match.group(5) # 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): access_match = Match(r'\s*(public|private|protected)\s*:', line) if access_match: self.stack[-1].access = access_match.group(1) # 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 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 CheckClassFinished(self, filename, error): """Checks that all classes 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) def CheckForNonStandardConstructs(filename, clean_lines, linenum, nesting_state, error): """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. args = Match(r'\s+(?:inline\s+)?%s\s*\(([^,()]+)\)' % re.escape(base_classname), line) if (args and args.group(1) != 'void' and not Match(r'(const\s+)?%s\s*(?:<\w+>\s*)?&' % re.escape(base_classname), args.group(1).strip())): error(filename, linenum, 'runtime/explicit', 5, 'Single-argument constructors should be marked explicit.') def CheckSpacingForFunctionCall(filename, line, linenum, error): """Checks for the correctness of various spacing around function calls. Args: filename: The name of the current file. line: The text of the line to check. linenum: The number of the line to check. error: The function to call with any errors found. """ # 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|delete)\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', fncall) and not Search(r'\w\s+\((\w+::)?\*\w+\)\(', fncall)): 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 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] raw = clean_lines.raw_lines raw_line = raw[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(comment, filename, linenum, error): """Checks for common mistakes in TODO comments. Args: comment: The text of the comment from the line in question. filename: The name of the current file. linenum: The number of the line to check. error: The function to call with any errors found. """ 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-msg=C6403 if middle_whitespace != ' ' and middle_whitespace != '': error(filename, linenum, 'whitespace/todo', 2, 'TODO(my_username) should be followed by a space') 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_EVIL_CONSTRUCTORS|' 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 FindNextMatchingAngleBracket(clean_lines, linenum, init_suffix): """Find the corresponding > to close a template. Args: clean_lines: A CleansedLines instance containing the file. linenum: Current line number. init_suffix: Remainder of the current line after the initial <. Returns: True if a matching bracket exists. """ line = init_suffix nesting_stack = ['<'] while True: # Find the next operator that can tell us whether < is used as an # opening bracket or as a less-than operator. We only want to # warn on the latter case. # # We could also check all other operators and terminate the search # early, e.g. if we got something like this "a(),;\[\]]*([<>(),;\[\]])(.*)$', line) if match: # Found an operator, update nesting stack operator = match.group(1) line = match.group(2) if nesting_stack[-1] == '<': # Expecting closing angle bracket if operator in ('<', '(', '['): nesting_stack.append(operator) elif operator == '>': nesting_stack.pop() if not nesting_stack: # Found matching angle bracket return True elif operator == ',': # Got a comma after a bracket, this is most likely a template # argument. We have not seen a closing angle bracket yet, but # it's probably a few lines later if we look for it, so just # return early here. return True else: # Got some other operator. return False else: # Expecting closing parenthesis or closing bracket if operator in ('<', '(', '['): nesting_stack.append(operator) elif operator in (')', ']'): # We don't bother checking for matching () or []. If we got # something like (] or [), it would have been a syntax error. nesting_stack.pop() else: # Scan the next line linenum += 1 if linenum >= len(clean_lines.elided): break line = clean_lines.elided[linenum] # Exhausted all remaining lines and still no matching angle bracket. # Most likely the input was incomplete, otherwise we should have # seen a semicolon and returned early. return True def FindPreviousMatchingAngleBracket(clean_lines, linenum, init_prefix): """Find the corresponding < that started a template. Args: clean_lines: A CleansedLines instance containing the file. linenum: Current line number. init_prefix: Part of the current line before the initial >. Returns: True if a matching bracket exists. """ line = init_prefix nesting_stack = ['>'] while True: # Find the previous operator match = Search(r'^(.*)([<>(),;\[\]])[^<>(),;\[\]]*$', line) if match: # Found an operator, update nesting stack operator = match.group(2) line = match.group(1) if nesting_stack[-1] == '>': # Expecting opening angle bracket if operator in ('>', ')', ']'): nesting_stack.append(operator) elif operator == '<': nesting_stack.pop() if not nesting_stack: # Found matching angle bracket return True elif operator == ',': # Got a comma before a bracket, this is most likely a # template argument. The opening angle bracket is probably # there if we look for it, so just return early here. return True else: # Got some other operator. return False else: # Expecting opening parenthesis or opening bracket if operator in ('>', ')', ']'): nesting_stack.append(operator) elif operator in ('(', '['): nesting_stack.pop() else: # Scan the previous line linenum -= 1 if linenum < 0: break line = clean_lines.elided[linenum] # Exhausted all earlier lines and still no matching angle bracket. return False 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. """ raw = clean_lines.raw_lines 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. if IsBlankLine(line) and not nesting_state.InNamespaceBody(): 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, 'Blank line at the start of a code block. Is this needed?') # 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, 'Blank line at the end of a code block. Is this needed?') 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, we complain if there's a comment too near the text commentpos = line.find('//') if commentpos != -1: # Check if the // may be in quotes. If so, ignore it # Comparisons made explicit for clarity -- pylint: disable-msg=C6403 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'^\s*{ //', line) 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') # There should always be a space between the // and the comment commentend = commentpos + 2 if commentend < len(line) and not line[commentend] == ' ': # but some lines are exceptions -- e.g. if they're big # comment delimiters like: # //---------------------------------------------------------- # or are an empty C++ style Doxygen comment, like: # /// # or they begin with multiple slashes followed by a space: # //////// Header comment match = (Search(r'[=/-]{4,}\s*$', line[commentend:]) or Search(r'^/$', line[commentend:]) or Search(r'^/+ ', line[commentend:])) if not match: error(filename, linenum, 'whitespace/comments', 4, 'Should have a space between // and comment') CheckComment(line[commentpos:], filename, linenum, error) line = clean_lines.elided[linenum] # get rid of comments and strings # Don't try to do spacing checks for operator methods line = re.sub(r'operator(==|!=|<|<<|<=|>=|>>|>)\(', 'operator\(', line) # 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 >. match = Search(r'[^<>=!\s](==|!=|<=|>=)[^<>=!\s]', line) if match: error(filename, linenum, 'whitespace/operators', 3, 'Missing spaces around %s' % match.group(1)) # We allow no-spaces around << when used like this: 10<<20, but # not otherwise (particularly, not when used as streams) match = Search(r'(\S)(?:L|UL|ULL|l|ul|ull)?<<(\S)', line) if match and not (match.group(1).isdigit() and match.group(2).isdigit()): error(filename, linenum, 'whitespace/operators', 3, 'Missing spaces around <<') elif not Match(r'#.*include', line): # Avoid false positives on -> reduced_line = line.replace('->', '') # 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 = Search(r'[^\s<]<([^\s=<].*)', reduced_line) if (match and not FindNextMatchingAngleBracket(clean_lines, linenum, match.group(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 = Search(r'^(.*[^\s>])>[^\s=>]', reduced_line) if (match and not FindPreviousMatchingAngleBracket(clean_lines, linenum, match.group(1))): 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)) # A pet peeve of mine: 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 not len(match.group(2)) in [0, 1]: error(filename, linenum, 'whitespace/parens', 5, 'Should have zero or one spaces inside ( and ) in %s' % match.group(1)) # You should always have a space after a comma (either as fn arg or operator) if Search(r',[^\s]', line): 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 ;') # Next we will look for issues with function calls. CheckSpacingForFunctionCall(filename, line, linenum, error) # 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. if Search(r'[^ ({]{', line): 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 spaces before your brackets, except maybe after # 'delete []' or 'new char * []'. if Search(r'\w\s+\[', line) and not Search(r'delete\s+\[', line): error(filename, linenum, 'whitespace/braces', 5, 'Extra space before [') # 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.') # In range-based for, we wanted spaces before and after the colon, but # not around "::" tokens that might appear. if (Search('for *\(.*[^:]:[^: ]', line) or Search('for *\(.*[^: ]:[^:]', line)): error(filename, linenum, 'whitespace/forcolon', 2, 'Missing space around colon in range-based for loop') 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. 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\s*', 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'}\s*else[^{]*$', line) or Match(r'[^}]*else\s*{', line): if Search(r'}\s*else if([^{]*)$', line): # could be multi-line if # find the ( after the if pos = line.find('else if') pos = line.find('(', pos) if pos > 0: (endline, _, endpos) = CloseExpression(clean_lines, linenum, pos) if endline[endpos:].find('{') == -1: # 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') else: # common case: else not followed by a multi-line if 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') # Braces shouldn't be followed by a ; unless they're defining a struct # or initializing an array. # We can't tell in general, but we can for some common cases. prevlinenum = linenum while True: (prevline, prevlinenum) = GetPreviousNonBlankLine(clean_lines, prevlinenum) if Match(r'\s+{.*}\s*;', line) and not prevline.count(';'): line = prevline + line else: break if (Search(r'{.*}\s*;', line) and line.count('{') == line.count('}') and not Search(r'struct|class|enum|\s*=\s*{', line)): error(filename, linenum, 'readability/braces', 4, "You don't need a ; after a }") def CheckEmptyLoopBody(filename, clean_lines, linenum, error): """Loop for empty loop 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. line = clean_lines.elided[linenum] if Match(r'\s*(for|while)\s*\(', line): # 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:]): error(filename, end_linenum, 'whitespace/empty_loop_body', 5, 'Empty loop bodies should use {} or continue') def ReplaceableCheck(operator, macro, line): """Determine whether a basic CHECK can be replaced with a more specific one. For example suggest using CHECK_EQ instead of CHECK(a == b) and similarly for CHECK_GE, CHECK_GT, CHECK_LE, CHECK_LT, CHECK_NE. Args: operator: The C++ operator used in the CHECK. macro: The CHECK or EXPECT macro being called. line: The current source line. Returns: True if the CHECK can be replaced with a more specific one. """ # This matches decimal and hex integers, strings, and chars (in that order). match_constant = r'([-+]?(\d+|0[xX][0-9a-fA-F]+)[lLuU]{0,3}|".*"|\'.*\')' # Expression to match two sides of the operator with something that # looks like a literal, since CHECK(x == iterator) won't compile. # This means we can't catch all the cases where a more specific # CHECK is possible, but it's less annoying than dealing with # extraneous warnings. match_this = (r'\s*' + macro + r'\((\s*' + match_constant + r'\s*' + operator + r'[^<>].*|' r'.*[^<>]' + operator + r'\s*' + match_constant + r'\s*\))') # Don't complain about CHECK(x == NULL) or similar because # CHECK_EQ(x, NULL) won't compile (requires a cast). # Also, don't complain about more complex boolean expressions # involving && or || such as CHECK(a == b || c == d). return Match(match_this, line) and not Search(r'NULL|&&|\|\|', line) 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 raw_lines = clean_lines.raw_lines current_macro = '' for macro in _CHECK_MACROS: if raw_lines[linenum].find(macro) >= 0: current_macro = macro break if not current_macro: # Don't waste time here if line doesn't contain 'CHECK' or 'EXPECT' return line = clean_lines.elided[linenum] # get rid of comments and strings # Encourage replacing plain CHECKs with CHECK_EQ/CHECK_NE/etc. for operator in ['==', '!=', '>=', '>', '<=', '<']: if ReplaceableCheck(operator, current_macro, line): error(filename, linenum, 'readability/check', 2, 'Consider using %s instead of %s(a %s b)' % ( _CHECK_REPLACEMENT[current_macro][operator], current_macro, operator)) break 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. """ raw_lines = clean_lines.raw_lines 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; 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 labels elif ((initial_spaces == 1 or initial_spaces == 3) and not Match(r'\s*\w+\s*:\s*$', cleansed_line)): error(filename, linenum, 'whitespace/indent', 3, 'Weird number of spaces at line-start. ' 'Are you using a 2-space indent?') # Labels should always be indented at least one space. elif not initial_spaces and line[:2] != '//' and Search(r'[^:]:\s*$', line): error(filename, linenum, 'whitespace/labels', 4, 'Labels should always be indented at least one space. ' 'If this is a member-initializer list in a constructor or ' 'the base class list in a class definition, the colon should ' 'be on the following line.') # 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) if line_width > 100: error(filename, linenum, 'whitespace/line_length', 4, 'Lines should very rarely be longer than 100 characters') elif line_width > 80: error(filename, linenum, 'whitespace/line_length', 2, 'Lines should be <= 80 characters long') 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) CheckEmptyLoopBody(filename, clean_lines, linenum, error) CheckAccess(filename, clean_lines, linenum, nesting_state, error) CheckSpacing(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_NEW_STYLE = re.compile(r'#include +"[^/]+\.h"') _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_stl_h = include in _STL_HEADERS is_cpp_h = is_stl_h or 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" if _RE_PATTERN_INCLUDE_NEW_STYLE.search(line): 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) == '<') if include in include_state: error(filename, linenum, 'build/include', 4, '"%s" already included at %s:%s' % (include, filename, include_state[include])) else: include_state[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())) if not include_state.IsInAlphabeticalOrder(include): error(filename, linenum, 'build/include_alpha', 4, 'Include "%s" not in alphabetical order' % 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): error(filename, linenum, 'readability/streams', 3, 'Streams are highly discouraged.') def _GetTextInside(text, start_pattern): """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(sugawarayu): 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] def CheckLanguage(filename, clean_lines, linenum, file_extension, include_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. 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 # Create an extended_line, which is the concatenation of the current and # next lines, for more effective checking of code that may span more than one # line. if linenum + 1 < clean_lines.NumLines(): extended_line = line + clean_lines.elided[linenum + 1] else: extended_line = line # Make Windows paths like Unix. fullname = os.path.abspath(filename).replace('\\', '/') # TODO(unknown): figure out if they're using default arguments in fn proto. # Check for non-const references in functions. This is tricky because & # is also used to take the address of something. We allow <> for templates, # (ignoring whatever is between the braces) and : for classes. # These are complicated re's. They try to capture the following: # paren (for fn-prototype start), typename, &, varname. For the const # version, we're willing for const to be before typename or after # Don't check the implementation on same line. fnline = line.split('{', 1)[0] if (len(re.findall(r'\([^()]*\b(?:[\w:]|<[^()]*>)+(\s?&|&\s?)\w+', fnline)) > len(re.findall(r'\([^()]*\bconst\s+(?:typename\s+)?(?:struct\s+)?' r'(?:[\w:]|<[^()]*>)+(\s?&|&\s?)\w+', fnline)) + len(re.findall(r'\([^()]*\b(?:[\w:]|<[^()]*>)+\s+const(\s?&|&\s?)[\w]+', fnline))): # We allow non-const references in a few standard places, like functions # called "swap()" or iostream operators like "<<" or ">>". We also filter # out for loops, which lint otherwise mistakenly thinks are functions. if not Search( r'(for|swap|Swap|operator[<>][<>])\s*\(\s*' r'(?:(?:typename\s*)?[\w:]|<.*>)+\s*&', fnline): error(filename, linenum, 'runtime/references', 2, 'Is this a non-const reference? ' 'If so, make const or use a pointer.') # 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+)?\b' # Grab 'new' operator, if it's there r'(int|float|double|bool|char|int32|uint32|int64|uint64)\([^)]', line) if match: # gMock methods are defined using some variant of MOCK_METHODx(name, type) # where type may be float(), int(string), etc. Without context they are # virtually indistinguishable from int(x) casts. Likewise, gMock's # MockCallback takes a template parameter of the form return_type(arg_type), # which looks much like the cast we're trying to detect. if (match.group(1) is None and # If new operator, then this isn't a cast not (Match(r'^\s*MOCK_(CONST_)?METHOD\d+(_T)?\(', line) or Match(r'^\s*MockCallback<.*>', line))): # Try a bit harder to catch gmock lines: the only place where # something looks like an old-style cast is where we declare the # return type of the mocked method, and the only time when we # are missing context is if MOCK_METHOD was split across # multiple lines (for example http://go/hrfhr ), so we only need # to check the previous line for MOCK_METHOD. if (linenum == 0 or not Match(r'^\s*MOCK_(CONST_)?METHOD\d+(_T)?\(\S+,\s*$', clean_lines.elided[linenum - 1])): error(filename, linenum, 'readability/casting', 4, 'Using deprecated casting style. ' 'Use static_cast<%s>(...) instead' % match.group(2)) CheckCStyleCast(filename, linenum, line, clean_lines.raw_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, linenum, line, clean_lines.raw_lines[linenum], 'const_cast', r'\((char\s?\*+\s?)\)\s*"', error): pass else: # Check pointer casts for other than string constants CheckCStyleCast(filename, linenum, line, clean_lines.raw_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. if Search( r'(&\([^)]+\)[\w(])|(&(static|dynamic|reinterpret)_cast\b)', line): 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')) # 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) # Make sure it's not a function. # Function template specialization looks like: "string foo(...". # Class template definitions look like: "string Foo::Method(...". if match 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))) # Check that we're not using RTTI outside of testing code. if Search(r'\bdynamic_cast<', line) and not _IsTestFilename(filename): error(filename, linenum, 'runtime/rtti', 5, 'Do not use dynamic_cast<>. If you need to cast within a class ' "hierarchy, use static_cast<> to upcast. Google doesn't support " 'RTTI.') 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.') 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 have DISALLOW_EVIL_CONSTRUCTORS # (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)) # 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\b', line): error(filename, linenum, 'runtime/printf', 5, 'Never use sprintf. Use snprintf instead.') match = Search(r'\b(strcpy|strcat)\b', line) if match: error(filename, linenum, 'runtime/printf', 4, 'Almost always, snprintf is better than %s' % match.group(1)) if Search(r'\bsscanf\b', line): error(filename, linenum, 'runtime/printf', 1, 'sscanf can be ok, but is slow and can overflow buffers.') # 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(sugawarayu): 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_EVIL_CONSTRUCTORS, DISALLOW_COPY_AND_ASSIGN, or # DISALLOW_IMPLICIT_CONSTRUCTORS is present, then it should be the last thing # in the class declaration. match = Match( (r'\s*' r'(DISALLOW_(EVIL_CONSTRUCTORS|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 CheckCStyleCast(filename, linenum, line, raw_line, cast_type, pattern, error): """Checks for a C-style cast by looking for the pattern. This also handles sizeof(type) warnings, due to similarity of content. Args: filename: The name of the current file. linenum: The number of the line to check. line: The line of code to check. raw_line: The raw line of code to check, with comments. 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. """ match = Search(pattern, line) if not match: return False # e.g., sizeof(int) sizeof_match = Match(r'.*sizeof\s*$', line[0:match.start(1) - 1]) if sizeof_match: error(filename, linenum, 'runtime/sizeof', 1, 'Using sizeof(type). Use sizeof(varname) instead if possible') return True # operator++(int) and operator--(int) if (line[0:match.start(1) - 1].endswith(' operator++') or line[0:match.start(1) - 1].endswith(' operator--')): return False remainder = line[match.end(0):] # The close paren is for function pointers as arguments to a function. # eg, void foo(void (*bar)(int)); # The semicolon check is a more basic function check; also possibly a # function pointer typedef. # eg, void foo(int); or void foo(int) const; # The equals check is for function pointer assignment. # eg, void *(*foo)(int) = ... # The > is for MockCallback<...> ... # # Right now, this will only catch cases where there's a single argument, and # it's unnamed. It should probably be expanded to check for multiple # arguments with some unnamed. function_match = Match(r'\s*(\)|=|(const)?\s*(;|\{|throw\(\)|>))', remainder) if function_match: if (not function_match.group(3) or function_match.group(3) == ';' or ('MockCallback<' not in raw_line and '/*' not in raw_line)): 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 _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_state, io=codecs): """Fill up the include_state with new includes found from the file. Args: filename: the name of the header to read. include_state: an _IncludeState instance 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 succesfully 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) # The value formatting is cute, but not really used right now. # What matters here is that the key is in include_state. include_state.setdefault(include, '%s:%d' % (filename, 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 copy the include_state so it is only messed up within this function. include_state = include_state.copy() # Did we find the header for this file (if any) and succesfully 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_state is modified during iteration, so we iterate over a copy of # the keys. header_keys = include_state.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_state, 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_state: 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++0x 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. """ raw = clean_lines.raw_lines line = raw[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 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) if nesting_state.stack and nesting_state.stack[-1].inline_asm != _NO_ASM: 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, error) CheckForNonStandardConstructs(filename, clean_lines, line, nesting_state, error) CheckPosixThreading(filename, clean_lines, line, error) CheckInvalidIncrement(filename, clean_lines, line, error) CheckMakePairUsesDeduction(filename, clean_lines, line, error) for check_fn in extra_check_functions: check_fn(filename, clean_lines, line, error) 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) nesting_state.CheckClassFinished(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. CheckForUnicodeReplacementCharacters(filename, lines, error) CheckForNewlineAtEOF(filename, lines, error) 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) 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 it is not expected to be present (i.e. os.linesep != # '\r\n' as in Windows), a warning is issued below if this file # is processed. 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') carriage_return_found = False # Remove trailing '\r'. for linenum in range(len(lines)): if lines[linenum].endswith('\r'): lines[linenum] = lines[linenum].rstrip('\r') carriage_return_found = True except IOError: sys.stderr.write( "Skipping input '%s': Can't open for reading\n" % filename) 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 != 'cc' and file_extension != 'h' and file_extension != 'cpp'): sys.stderr.write('Ignoring %s; not a .cc or .h file\n' % filename) else: ProcessFileData(filename, file_extension, lines, Error, extra_check_functions) if carriage_return_found and os.linesep != '\r\n': # Use 0 for linenum since outputting only one error for potentially # several lines. Error(filename, 0, 'whitespace/newline', 1, 'One or more unexpected \\r (^M) found;' 'better to use only a \\n') sys.stderr.write('Done processing %s\n' % filename) 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=']) 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 not val 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 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.0+dfsg/dist/create-dmg.sh000077500000000000000000000031411223327513400200670ustar00rootroot00000000000000#!/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.0+dfsg/dist/dmg_background.png000066400000000000000000002525221223327513400212050ustar00rootroot00000000000000PNG  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.0+dfsg/dist/dmg_background.xcf000066400000000000000000015071051223327513400212020ustar00rootroot00000000000000gimp 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.0+dfsg/dist/googlecode_upload.py000066400000000000000000000213201223327513400215440ustar00rootroot00000000000000#!/usr/bin/env python # # Copyright 2006, 2007 Google Inc. All Rights Reserved. # Author: danderson@google.com (David Anderson) # # Script for uploading files to a Google Code project. # # This is intended to be both a useful script for people who want to # streamline project uploads and a reference implementation for # uploading files to Google Code projects. # # To upload a file to Google Code, you need to provide a path to the # file on your local machine, a small summary of what the file is, a # project name, and a valid account that is a member or owner of that # project. You can optionally provide a list of labels that apply to # the file. The file will be uploaded under the same name that it has # in your local filesystem (that is, the "basename" or last path # component). Run the script with '--help' to get the exact syntax # and available options. # # Note that the upload script requests that you enter your # googlecode.com password. This is NOT your Gmail account password! # This is the password you use on googlecode.com for committing to # Subversion and uploading files. You can find your password by going # to http://code.google.com/hosting/settings when logged in with your # Gmail account. If you have already committed to your project's # Subversion repository, the script will automatically retrieve your # credentials from there (unless disabled, see the output of '--help' # for details). # # If you are looking at this script as a reference for implementing # your own Google Code file uploader, then you should take a look at # the upload() function, which is the meat of the uploader. You # basically need to build a multipart/form-data POST request with the # right fields and send it to https://PROJECT.googlecode.com/files . # Authenticate the request using HTTP Basic authentication, as is # shown below. # # Licensed under the terms of the Apache Software License 2.0: # http://www.apache.org/licenses/LICENSE-2.0 # # Questions, comments, feature requests and patches are most welcome. # Please direct all of these to the Google Code users group: # http://groups.google.com/group/google-code-hosting """Google Code file uploader script. """ __author__ = 'danderson@google.com (David Anderson)' import httplib import os.path import optparse import getpass import base64 import sys def upload(file, project_name, user_name, password, summary, labels=None): """Upload a file to a Google Code project's file server. Args: file: The local path to the file. project_name: The name of your project on Google Code. user_name: Your Google account name. password: The googlecode.com password for your account. Note that this is NOT your global Google Account password! summary: A small description for the file. labels: an optional list of label strings with which to tag the file. Returns: a tuple: http_status: 201 if the upload succeeded, something else if an error occured. http_reason: The human-readable string associated with http_status file_url: If the upload succeeded, the URL of the file on Google Code, None otherwise. """ # The login is the user part of user@gmail.com. If the login provided # is in the full user@domain form, strip it down. if user_name.endswith('@gmail.com'): user_name = user_name[:user_name.index('@gmail.com')] form_fields = [('summary', summary)] if labels is not None: form_fields.extend([('label', l.strip()) for l in labels]) content_type, body = encode_upload_request(form_fields, file) upload_host = '%s.googlecode.com' % project_name upload_uri = '/files' auth_token = base64.b64encode('%s:%s'% (user_name, password)) headers = { 'Authorization': 'Basic %s' % auth_token, 'User-Agent': 'Googlecode.com uploader v0.9.4', 'Content-Type': content_type, } server = httplib.HTTPSConnection(upload_host) server.request('POST', upload_uri, body, headers) resp = server.getresponse() server.close() if resp.status == 201: location = resp.getheader('Location', None) else: location = None return resp.status, resp.reason, location def encode_upload_request(fields, file_path): """Encode the given fields and file into a multipart form body. fields is a sequence of (name, value) pairs. file is the path of the file to upload. The file will be uploaded to Google Code with the same file name. Returns: (content_type, body) ready for httplib.HTTP instance """ BOUNDARY = '----------Googlecode_boundary_reindeer_flotilla' CRLF = '\r\n' body = [] # Add the metadata about the upload first for key, value in fields: body.extend( ['--' + BOUNDARY, 'Content-Disposition: form-data; name="%s"' % key, '', value, ]) # Now add the file itself file_name = os.path.basename(file_path) f = open(file_path, 'rb') file_content = f.read() f.close() body.extend( ['--' + BOUNDARY, 'Content-Disposition: form-data; name="filename"; filename="%s"' % file_name, # The upload server determines the mime-type, no need to set it. 'Content-Type: application/octet-stream', '', file_content, ]) # Finalize the form body body.extend(['--' + BOUNDARY + '--', '']) return 'multipart/form-data; boundary=%s' % BOUNDARY, CRLF.join(body) def upload_find_auth(file_path, project_name, summary, labels=None, user_name=None, password=None, tries=3): """Find credentials and upload a file to a Google Code project's file server. file_path, project_name, summary, and labels are passed as-is to upload. Args: file_path: The local path to the file. project_name: The name of your project on Google Code. summary: A small description for the file. labels: an optional list of label strings with which to tag the file. config_dir: Path to Subversion configuration directory, 'none', or None. user_name: Your Google account name. tries: How many attempts to make. """ while tries > 0: if user_name is None: # Read username if not specified or loaded from svn config, or on # subsequent tries. sys.stdout.write('Please enter your googlecode.com username: ') sys.stdout.flush() user_name = sys.stdin.readline().rstrip() if password is None: # Read password if not loaded from svn config, or on subsequent tries. print 'Please enter your googlecode.com password.' print '** Note that this is NOT your Gmail account password! **' print 'It is the password you use to access Subversion repositories,' print 'and can be found here: http://code.google.com/hosting/settings' password = getpass.getpass() status, reason, url = upload(file_path, project_name, user_name, password, summary, labels) # Returns 403 Forbidden instead of 401 Unauthorized for bad # credentials as of 2007-07-17. if status in [httplib.FORBIDDEN, httplib.UNAUTHORIZED]: # Rest for another try. user_name = password = None tries = tries - 1 else: # We're done. break return status, reason, url def main(): parser = optparse.OptionParser(usage='googlecode-upload.py -s SUMMARY ' '-p PROJECT [options] FILE') parser.add_option('-s', '--summary', dest='summary', help='Short description of the file') parser.add_option('-p', '--project', dest='project', help='Google Code project name') parser.add_option('-u', '--user', dest='user', help='Your Google Code username') parser.add_option('-w', '--password', dest='password', help='Your Google Code password') parser.add_option('-l', '--labels', dest='labels', help='An optional list of comma-separated labels to attach ' 'to the file') options, args = parser.parse_args() if not options.summary: parser.error('File summary is missing.') elif not options.project: parser.error('Project name is missing.') elif len(args) < 1: parser.error('File to upload not provided.') elif len(args) > 1: parser.error('Only one file may be specified.') file_path = args[0] if options.labels: labels = options.labels.split(',') else: labels = None status, reason, url = upload_find_auth(file_path, options.project, options.summary, labels, options.user, options.password) if url: print 'The file was uploaded successfully.' print 'URL: %s' % url return 0 else: print 'An error occurred. Your file was not uploaded.' print 'Google Code upload server said: %s (%s)' % (reason, status) return 1 if __name__ == '__main__': sys.exit(main()) clementine-1.2.0+dfsg/dist/googlecode_upload.pyc000066400000000000000000000145701223327513400217200ustar00rootroot00000000000000 Nc @sdZdZddkZddkZddkZddkZddkZddkZddZ dZ dddddZ dZ ed joeie ndS( s"Google Code file uploader script. s%danderson@google.com (David Anderson)iNcCsR|ido||id }nd|fg}|dj o8|ig}|D]}|d|ifqT~nt||\} } d|} d} tid||f} hd| d6d d 6| d 6}ti | }|i d | | ||i }|i |i d jo|idd}nd}|i |i|fS(sUpload a file to a Google Code project's file server. Args: file: The local path to the file. project_name: The name of your project on Google Code. user_name: Your Google account name. password: The googlecode.com password for your account. Note that this is NOT your global Google Account password! summary: A small description for the file. labels: an optional list of label strings with which to tag the file. Returns: a tuple: http_status: 201 if the upload succeeded, something else if an error occured. http_reason: The human-readable string associated with http_status file_url: If the upload succeeded, the URL of the file on Google Code, None otherwise. s @gmail.comtsummarytlabels%s.googlecode.coms/filess%s:%ssBasic %st AuthorizationsGooglecode.com uploader v0.9.4s User-Agents Content-TypetPOSTitLocationN(tendswithtindextNonetextendtstriptencode_upload_requesttbase64t b64encodethttplibtHTTPSConnectiontrequestt getresponsetclosetstatust getheadertreason(tfilet project_namet user_nametpasswordRtlabelst form_fieldst_[1]tlt content_typetbodyt upload_hostt upload_urit auth_tokentheaderstservertresptlocation((s0/home/david/clementine/dist/googlecode_upload.pytupload;s* 8     c Csd}d}g}x5|D]-\}}|id|d|d|gqWtii|}t|d}|i} |i|id|d|dd| g|id|ddgd ||i|fS( sEncode the given fields and file into a multipart form body. fields is a sequence of (name, value) pairs. file is the path of the file to upload. The file will be uploaded to Google Code with the same file name. Returns: (content_type, body) ready for httplib.HTTP instance s/----------Googlecode_boundary_reindeer_flotillas s--s)Content-Disposition: form-data; name="%s"ttrbs>Content-Disposition: form-data; name="filename"; filename="%s"s&Content-Type: application/octet-streams multipart/form-data; boundary=%s(RtostpathtbasenametopentreadRtjoin( tfieldst file_pathtBOUNDARYtCRLFRtkeytvaluet file_nametft file_content((s0/home/david/clementine/dist/googlecode_upload.pyR ns.     ic Csx|djo|djo6tiidtiitiii}n|djo$dGHdGHdGHdGHti}nt ||||||\}}} |t i t i gjod}}|d}qPqW||| fS( sFind credentials and upload a file to a Google Code project's file server. file_path, project_name, summary, and labels are passed as-is to upload. Args: file_path: The local path to the file. project_name: The name of your project on Google Code. summary: A small description for the file. labels: an optional list of label strings with which to tag the file. config_dir: Path to Subversion configuration directory, 'none', or None. user_name: Your Google account name. tries: How many attempts to make. is+Please enter your googlecode.com username: s*Please enter your googlecode.com password.s8** Note that this is NOT your Gmail account password! **s=It is the password you use to access Subversion repositories,s>and can be found here: http://code.google.com/hosting/settingsiN( RtsyststdouttwritetflushtstdintreadlinetrstriptgetpassR&R t FORBIDDENt UNAUTHORIZED( R0RRRRRttriesRRturl((s0/home/david/clementine/dist/googlecode_upload.pytupload_find_auths&     cCstidd}|idddddd|id d dd dd |id ddddd|idddddd|idddddd|i\}}|ip|idnd|ip|idnIt|djo|idn%t|djo|idn|d}|io|ii d}nd}t ||i|i||i |i \}}}|od GHd!|GHdSd"GHd#||fGHdSdS($Ntusages9googlecode-upload.py -s SUMMARY -p PROJECT [options] FILEs-ss --summarytdestRthelpsShort description of the files-ps --projecttprojectsGoogle Code project names-us--usertusersYour Google Code usernames-ws --passwordRsYour Google Code passwords-ls--labelsRs@An optional list of comma-separated labels to attach to the filesFile summary is missing.sProject name is missing.isFile to upload not provided.sOnly one file may be specified.it,s#The file was uploaded successfully.sURL: %ss.An error occurred. Your file was not uploaded.s'Google Code upload server said: %s (%s)(toptparset OptionParsert add_optiont parse_argsRterrorRHtlenRtsplitRRDRIR(tparsertoptionstargsR0RRRRC((s0/home/david/clementine/dist/googlecode_upload.pytmainsD       t__main__(t__doc__t __author__R tos.pathR)RKR?R R8RR&R RDRUt__name__texit(((s0/home/david/clementine/dist/googlecode_upload.pyt/s       3 -- . clementine-1.2.0+dfsg/dist/googlecode_upload_all.py000066400000000000000000000146011223327513400224000ustar00rootroot00000000000000import getpass import os import re import subprocess import sys import googlecode_upload PROJECT_NAME = "clementine-player" FILENAME_PATTERNS = { "deb": "clementine_%(major)s.%(minor)s.%(patch)s%(tildeprerelease)s~%(distro)s_%(debarch)s.deb", "rpm": "clementine-%(major)s.%(minor)s.%(patch)s-%(rpmrelease)s.%(distro)s.%(rpmarch)s.rpm", "exe": "ClementineSetup-%(major)s.%(minor)s.%(patch)s%(prerelease)s.exe", "dmg": "clementine-%(major)s.%(minor)s.%(patch)s%(prerelease)s.dmg", "tar.gz": "clementine-%(major)s.%(minor)s.%(patch)s%(prerelease)s.tar.gz", } LABELS = { "deb": ["Type-Package", "OpSys-Linux"], "rpm": ["Type-Package", "OpSys-Linux", "Distro-Fedora"], "exe": ["Type-Package", "OpSys-Windows", "Arch-i386"], "dmg": ["Type-Package", "OpSys-OSX", "Distro-Lion", "Arch-x86-64"], 32: ["Arch-i386"], 64: ["Arch-x86-64"], "precise": ["Distro-Ubuntu"], "quantal": ["Distro-Ubuntu"], "raring": ["Distro-Ubuntu"], "squeeze": ["Distro-Debian"], "wheezy": ["Distro-Debian"], } MIN_SIZE = { "deb": 5000000, "rpm": 4000000, "exe": 18000000, "dmg": 24000000, "tar.gz": 8000000, } DEB_ARCH = { 32: "i386", 64: "amd64", } RPM_ARCH = { 32: "i686", 64: "x86_64", } DESCRIPTIONS = { ("deb", "precise"): "for Ubuntu Precise (12.04)", ("deb", "quantal"): "for Ubuntu Quantal (12.10)", ("deb", "raring"): "for Ubuntu Raring (13.04)", ("deb", "squeeze"): "for Debian Squeeze", ("deb", "wheezy"): "for Debian Wheezy", ("rpm", "fc18"): "for Fedora 18", ("rpm", "fc19"): "for Fedora 19", ("exe", None): "for Windows", ("dmg", None): "for Mac OS X", ("tar.gz", None): "source", } RELEASES = [ ("deb", "precise", 32), ("deb", "precise", 64), ("deb", "quantal", 32), ("deb", "quantal", 64), ("deb", "raring", 32), ("deb", "raring", 64), ("deb", "squeeze", 32), ("deb", "squeeze", 64), ("deb", "wheezy", 32), ("deb", "wheezy", 64), ("rpm", "fc18", 32), ("rpm", "fc18", 64), ("rpm", "fc19", 32), ("rpm", "fc19", 64), ("exe", None, None), ("dmg", None, None), ("tar.gz", None, None), ] class VersionInfo(object): def __init__(self, root_dir): filename = os.path.join(root_dir, "cmake/Version.cmake") data = open(filename).read() self.info = { "major": self._version(data, "MAJOR"), "minor": self._version(data, "MINOR"), "patch": self._version(data, "PATCH"), "prerelease": self._version(data, "PRERELEASE"), } for key, value in self.info.items(): setattr(self, key, value) def _version(self, data, part): regex = r"^set\(CLEMENTINE_VERSION_%s (\w+)\)$" % part match = re.search(regex, data, re.MULTILINE) if not match: return "" return match.group(1) def filename(self, release): (package, distro, arch) = release data = dict(self.info) data["distro"] = distro data["rpmarch"] = RPM_ARCH.get(arch, None) data["debarch"] = DEB_ARCH.get(arch, None) data["tildeprerelease"] = "" data["rpmrelease"] = "1" if data["prerelease"]: data["tildeprerelease"] = "~%s" % data["prerelease"] data["rpmrelease"] = "0.%s" % data["prerelease"] return FILENAME_PATTERNS[package] % data def description(self, release): (package, distro, arch) = release version_name = "%(major)s.%(minor)s" % self.info if self.patch is not "0": version_name += ".%s" % self.patch if self.prerelease: version_name += " %s" % self.prerelease.upper() os_name = DESCRIPTIONS[(package, distro)] if arch is not None: os_name += " %d-bit" % arch return "Clementine %s %s" % (version_name, os_name) def labels(self, release): (package, distro, arch) = release labels = LABELS.get(package, []) + \ LABELS.get(distro, []) + \ LABELS.get(arch, []) if self.prerelease.startswith("rc"): labels.append("Release-RC") elif self.prerelease.startswith("beta"): labels.append("Release-Beta") else: labels.append("Release-Stable") return labels def get_google_code_password(username): # Try to read it from the .netrc first NETRC_REGEX = re.compile( r'^machine\s+code\.google\.com\s+' r'login\s+([^@]+)@[^\s]+\s+' r'password\s+([^\s+])') try: for line in open(os.path.expanduser("~/.netrc")): match = NETRC_REGEX.match(line) if match and match.group(1) == username: print "Using password from ~/.netrc" return match.group(2) except IOError: pass # Prompt the user password = getpass.getpass("Google Code password (different to your Google account): ") if not password: return None return password def main(): dist_dir = os.path.dirname(os.path.abspath(__file__)) root_dir = os.path.normpath(os.path.join(dist_dir, "..")) # Read the version file version = VersionInfo(root_dir) # Display the files that will be uploaded for release in RELEASES: filename = version.filename(release) description = version.description(release) if not os.path.exists(filename): print print "%s - file not found" % filename print "Run this script from a directory containing all the release packages" return 1 size = os.path.getsize(filename) if size < MIN_SIZE[release[0]]: print print "%s - file not big enough" % filename print "%s files are expected to be at least %d bytes, but this was %d bytes" % ( release[0], MIN_SIZE[release[0]], size) return 1 labels = version.labels(release) print "%-40s %15s %-55s %s" % (filename, "%d bytes" % size, description, " ".join(sorted(labels))) print # Prompt for username and password username = raw_input("Google username: ") if not username: return 1 password = get_google_code_password(username) if password is None: return 1 print return 0 # Upload everything for release in RELEASES: (status, reason, url) = googlecode_upload.upload( file=version.filename(release), project_name=PROJECT_NAME, user_name=username, password=password, summary=version.description(release), labels=version.labels(release), ) if status != 201: print "%s: (%d) %s" % (version.filename(release), status, reason) else: print "Uploaded %s" % url return 0 if __name__ == "__main__": sys.exit(main()) clementine-1.2.0+dfsg/dist/icons/000077500000000000000000000000001223327513400166345ustar00rootroot00000000000000clementine-1.2.0+dfsg/dist/icons/ubuntu-mono-dark/000077500000000000000000000000001223327513400220435ustar00rootroot00000000000000clementine-1.2.0+dfsg/dist/icons/ubuntu-mono-dark/clementine-panel-grey.png000066400000000000000000000016611223327513400267410ustar00rootroot00000000000000PNG  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.0+dfsg/dist/icons/ubuntu-mono-dark/clementine-panel.png000066400000000000000000000023271223327513400257750ustar00rootroot00000000000000PNG  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.0+dfsg/dist/icons/ubuntu-mono-light/clementine-panel.png000066400000000000000000000021621223327513400261600ustar00rootroot00000000000000PNG  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', 'libgstdecodebin2.so', 'libgstequalizer.so', 'libgstgdp.so', 'libgstosxaudio.so', 'libgsttcp.so', 'libgsttypefindfunctions.so', 'libgstudp.so', 'libgstvolume.so', # Codecs 'libgstapetag.so', 'libgstasf.so', 'libgstfaac.so', 'libgstfaad.so', 'libgstffmpeg.so', 'libgstflac.so', 'libgstid3demux.so', 'libgstlame.so', 'libgstmad.so', 'libgstmms.so', 'libgstmpegaudioparse.so', 'libgstmusepack.so', 'libgstogg.so', 'libgstopus.so', 'libgstqtdemux.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-0.10', '/target/libexec/gstreamer-0.10', '/sw/lib/gstreamer-0.10', '/usr/local/lib/gstreamer-0.10', ] 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', 'imageformats/libqtiff.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.0+dfsg/dist/maketarball.sh000077500000000000000000000011451223327513400203400ustar00rootroot00000000000000#!/bin/bash name=clementine version="1.2.0" deb_dist="unstable" 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.0+dfsg/dist/maketarball.sh.in000077500000000000000000000011761223327513400207510ustar00rootroot00000000000000#!/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.0+dfsg/dist/qt.conf000066400000000000000000000000321223327513400170070ustar00rootroot00000000000000[Paths] Plugins = PlugIns clementine-1.2.0+dfsg/dist/sparkle_pub.pem000066400000000000000000000022321223327513400205320ustar00rootroot00000000000000-----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.0+dfsg/dist/update_desktop_languages.py000066400000000000000000000065201223327513400231370ustar00rootroot00000000000000import 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.0+dfsg/dist/uploadtoppa.sh000077500000000000000000000016571223327513400204210ustar00rootroot00000000000000#!/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://code.google.com/p/clementine-player/ 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.0+dfsg/dist/versionnumbers.py000066400000000000000000000017701223327513400211610ustar00rootroot00000000000000import 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.0+dfsg/dist/windows/000077500000000000000000000000001223327513400172135ustar00rootroot00000000000000clementine-1.2.0+dfsg/dist/windows/Capabilities.nsh000066400000000000000000000420511223327513400223200ustar00rootroot00000000000000/* _____________________________________________________________________________ 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.0+dfsg/dist/windows/FileAssociation.nsh000066400000000000000000000107671223327513400230140ustar00rootroot00000000000000/* _____________________________________________________________________________ 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.0+dfsg/dist/windows/clementine.ico000066400000000000000000001347011223327513400220400ustar00rootroot0000000000000000v 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.0+dfsg/dist/windows/clementine.nsi000066400000000000000000004121471223327513400220620ustar00rootroot00000000000000!define PRODUCT_NAME "Clementine" !define PRODUCT_PUBLISHER "Clementine" !define PRODUCT_VERSION_MAJOR 1 !define PRODUCT_VERSION_MINOR 2 !define PRODUCT_DISPLAY_VERSION "1.2" !define PRODUCT_DISPLAY_VERSION_SHORT "1.2" !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" !define PRODUCT_INSTALL_DIR "$PROGRAMFILES\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" Name "${PRODUCT_NAME}" OutFile "${PRODUCT_NAME}Setup-1.2.0.exe" InstallDir "${PRODUCT_INSTALL_DIR}" ShowInstDetails show ShowUnInstDetails show RequestExecutionLevel admin 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" ; 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" SectionEnd Section "Clementine" Clementine SetOutPath "$INSTDIR" File "avcodec-53.dll" File "avformat-53.dll" File "avutil-51.dll" File "clementine.exe" File "clementine-tagreader.exe" File "clementine-spotifyblob.exe" File "clementine.ico" File "glew32.dll" File "intl.dll" File "libcdio-14.dll" File "libeay32.dll" File "libexpat-1.dll" File "libfaac.dll" File "libfaad.dll" File "libfftw3-3.dll" File "libFLAC.dll" File "libgcc_s_sjlj-1.dll" File "libgcrypt-11.dll" File "libgdk_pixbuf-2.0-0.dll" File "libgio-2.0-0.dll" File "libglib-2.0-0.dll" File "libgmodule-2.0-0.dll" File "libgnutls-26.dll" File "libgobject-2.0-0.dll" File "libgpg-error-0.dll" File "libgstapp-0.10-0.dll" File "libgstaudio-0.10-0.dll" File "libgstbase-0.10-0.dll" File "libgstcdda-0.10-0.dll" File "libgstcontroller-0.10-0.dll" File "libgstdataprotocol-0.10-0.dll" File "libgstfft-0.10-0.dll" File "libgstinterfaces-0.10-0.dll" File "libgstnet-0.10-0.dll" File "libgstnetbuffer-0.10-0.dll" File "libgstpbutils-0.10-0.dll" File "libgstreamer-0.10-0.dll" File "libgstriff-0.10-0.dll" File "libgstrtp-0.10-0.dll" File "libgstrtsp-0.10-0.dll" File "libgstsdp-0.10-0.dll" File "libgsttag-0.10-0.dll" File "libgthread-2.0-0.dll" File "libid3tag.dll" File "liblastfm.dll" File "libmad.dll" File "libmms-0.dll" File "libmp3lame-0.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 "libpng14-14.dll" File "libprotobuf-7.dll" File "libqjson.dll" File "libsoup-2.4-1.dll" File "libspeex-1.dll" File "libspotify.dll" File "libstdc++-6.dll" File "libtag.dll" File "libtasn1-3.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" ; Check the OS. If Vista or newer, use Default Programs nsisos::osversion StrCpy $R0 $0 IntCmp $R0 6 HasDefaultPrograms NoDefaultPrograms HasDefaultPrograms HasDefaultPrograms: ; Register Clementine with Default Programs Var /GLOBAL AppIcon Var /GLOBAL AppExe StrCpy $AppExe "$INSTDIR\clementine.exe" StrCpy $AppIcon "$INSTDIR\clementine.ico" ${RegisterCapabilities} ${RegisterMediaType} ".mp3" $AppExe $AppIcon "MP3 Audio File" ${RegisterMediaType} ".flac" $AppExe $AppIcon "FLAC Audio File" ${RegisterMediaType} ".ogg" $AppExe $AppIcon "OGG Audio File" ${RegisterMediaType} ".spx" $AppExe $AppIcon "OGG Speex Audio File" ${RegisterMediaType} ".m4a" $AppExe $AppIcon "MP4 Audio File" ${RegisterMediaType} ".aac" $AppExe $AppIcon "AAC Audio File" ${RegisterMediaType} ".wma" $AppExe $AppIcon "WMA Audio File" ${RegisterMediaType} ".wav" $AppExe $AppIcon "WAV Audio File" ${RegisterMediaType} ".pls" $AppExe $AppIcon "PLS Audio File" ${RegisterMediaType} ".m3u" $AppExe $AppIcon "M3U Audio File" ${RegisterMediaType} ".xspf" $AppExe $AppIcon "XSPF Audio File" ${RegisterMediaType} ".asx" $AppExe $AppIcon "Windows Media Audio/Video playlist" ${RegisterMimeType} "audio/mp3" "mp3" "{cd3afa76-b84f-48f0-9393-7edc34128127}" ${RegisterMimeType} "audio/mp4" "m4a" "{cd3afa7c-b84f-48f0-9393-7edc34128127}" ${RegisterMimeType} "audio/x-ms-wma" "wma" "{cd3afa84-b84f-48f0-9393-7edc34128127}" ${RegisterMimeType} "audio/wav" "wav" "{cd3afa7b-b84f-48f0-9393-7edc34128127}" ${RegisterMimeType} "audio/mpegurl" "m3u" "{cd3afa78-b84f-48f0-9393-7edc34128127}" ${RegisterMimeType} "application/x-wmplayer" "asx" "{cd3afa96-b84f-48f0-9393-7edc34128127}" Goto done NoDefaultPrograms: ${registerExtension} "$INSTDIR\clementine.exe" ".mp3" "MP3 Audio File" ${registerExtension} "$INSTDIR\clementine.exe" ".flac" "FLAC Audio File" ${registerExtension} "$INSTDIR\clementine.exe" ".ogg" "OGG Audio File" ${registerExtension} "$INSTDIR\clementine.exe" ".spx" "OGG Speex Audio File" ${registerExtension} "$INSTDIR\clementine.exe" ".m4a" "MP4 Audio File" ${registerExtension} "$INSTDIR\clementine.exe" ".aac" "AAC Audio File" ${registerExtension} "$INSTDIR\clementine.exe" ".wma" "WMA Audio File" ${registerExtension} "$INSTDIR\clementine.exe" ".wav" "WAV Audio File" ${registerExtension} "$INSTDIR\clementine.exe" ".pls" "PLS Audio File" ${registerExtension} "$INSTDIR\clementine.exe" ".m3u" "M3U Audio File" ${registerExtension} "$INSTDIR\clementine.exe" ".xspf" "XSPF Audio File" ${registerExtension} "$INSTDIR\clementine.exe" ".asx" "Windows Media Audio/Video playlist" 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=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=libgstdecodebin2.dll" "gstreamer-plugins\libgstdecodebin2.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=libgstffmpeg.dll" "gstreamer-plugins\libgstffmpeg.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=libgstlame.dll" "gstreamer-plugins\libgstlame.dll" File "/oname=libgstmad.dll" "gstreamer-plugins\libgstmad.dll" File "/oname=libgstmms.dll" "gstreamer-plugins\libgstmms.dll" File "/oname=libgstmpegaudioparse.dll" "gstreamer-plugins\libgstmpegaudioparse.dll" File "/oname=libgstogg.dll" "gstreamer-plugins\libgstogg.dll" File "/oname=libgstqtdemux.dll" "gstreamer-plugins\libgstqtdemux.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 Section "Start menu items" startmenu ; Create Start Menu folders and shortcuts. SetShellVarContext all CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}" CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\clementine.exe" CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Uninstall.lnk" "$INSTDIR\Uninstall.exe" SectionEnd Section "Uninstaller" ; Create uninstaller WriteUninstaller "$INSTDIR\Uninstall.exe" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "${PRODUCT_NAME}" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\Uninstall.exe" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\clementine.ico" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_DISPLAY_VERSION}" WriteRegDWORD ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "VersionMajor" "${PRODUCT_VERSION_MAJOR}" WriteRegDWORD ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "VersionMinor" "${PRODUCT_VERSION_MINOR}" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}" 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\avcodec-53.dll" Delete "$INSTDIR\avformat-53.dll" Delete "$INSTDIR\avutil-51.dll" Delete "$INSTDIR\clementine.ico" Delete "$INSTDIR\clementine.exe" Delete "$INSTDIR\clementine-tagreader.exe" Delete "$INSTDIR\clementine-spotifyblob.exe" Delete "$INSTDIR\glew32.dll" Delete "$INSTDIR\intl.dll" Delete "$INSTDIR\libcdio-14.dll" Delete "$INSTDIR\libeay32.dll" Delete "$INSTDIR\libexpat-1.dll" Delete "$INSTDIR\libfaac.dll" Delete "$INSTDIR\libfaad.dll" Delete "$INSTDIR\libfftw3-3.dll" Delete "$INSTDIR\libFLAC.dll" Delete "$INSTDIR\libgcc_s_sjlj-1.dll" Delete "$INSTDIR\libgcrypt-11.dll" Delete "$INSTDIR\libgdk_pixbuf-2.0-0.dll" Delete "$INSTDIR\libgio-2.0-0.dll" Delete "$INSTDIR\libglib-2.0-0.dll" Delete "$INSTDIR\libgmodule-2.0-0.dll" Delete "$INSTDIR\libgnutls-26.dll" Delete "$INSTDIR\libgobject-2.0-0.dll" Delete "$INSTDIR\libgpg-error-0.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\libgthread-2.0-0.dll" Delete "$INSTDIR\libid3tag.dll" Delete "$INSTDIR\libimobiledevice-1.dll" Delete "$INSTDIR\liblastfm.dll" Delete "$INSTDIR\libmad.dll" Delete "$INSTDIR\libmms-0.dll" Delete "$INSTDIR\libmp3lame-0.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\libpng14-14.dll" Delete "$INSTDIR\libprotobuf-7.dll" Delete "$INSTDIR\libqjson.dll" Delete "$INSTDIR\libsoup-2.4-1.dll" Delete "$INSTDIR\libspeex-1.dll" Delete "$INSTDIR\libspotify.dll" Delete "$INSTDIR\libstdc++-6.dll" Delete "$INSTDIR\libtag.dll" Delete "$INSTDIR\libtasn1-3.dll" Delete "$INSTDIR\libusbmuxd.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\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\libgstdecodebin2.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\libgstffmpeg.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\libgstlame.dll" Delete "$INSTDIR\gstreamer-plugins\libgstmad.dll" Delete "$INSTDIR\gstreamer-plugins\libgstmms.dll" Delete "$INSTDIR\gstreamer-plugins\libgstmpegaudioparse.dll" Delete "$INSTDIR\gstreamer-plugins\libgstogg.dll" Delete "$INSTDIR\gstreamer-plugins\libgstqtdemux.dll" Delete "$INSTDIR\gstreamer-plugins\libgstreplaygain.dll" Delete "$INSTDIR\gstreamer-plugins\libgstspectrum.dll" Delete "$INSTDIR\gstreamer-plugins\libgstspeex.dll" Delete "$INSTDIR\gstreamer-plugins\libgstsouphttpsrc.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 Delete "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" Delete "$SMPROGRAMS\${PRODUCT_NAME}\Uninstall.lnk" RMDir /r "$SMPROGRAMS\${PRODUCT_NAME}" ; Remove the entry from 'installed programs list' DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" ; Check the OS. If Vista or newer, use Default Programs nsisos::osversion StrCpy $R0 $0 IntCmp $R0 6 HasDefaultPrograms NoDefaultPrograms HasDefaultPrograms HasDefaultPrograms: ; Unregister from Default Programs ${UnRegisterCapabilities} Goto done NoDefaultPrograms: ; Remove file associations ${unregisterExtension} ".mp3" "MP3 Audio File" ${unregisterExtension} ".flac" "FLAC Audio File" ${unregisterExtension} ".ogg" "OGG Audio File" ${unregisterExtension} ".spx" "OGG Speex Audio File" ${unregisterExtension} ".mp4" "MP4 Audio File" ${unregisterExtension} ".aac" "AAC Audio File" ${unregisterExtension} ".wma" "WMA Audio File" ${unregisterExtension} ".wav" "WAV Audio File" ${unregisterExtension} ".pls" "PLS Audio File" ${unregisterExtension} ".m3u" "M3U Audio File" ${unregisterExtension} ".xspf" "XSPF Audio File" ${unregisterExtension} ".asx" "Windows Media Audio/Video playlist" done: SectionEnd clementine-1.2.0+dfsg/dist/windows/clementine.nsi.in000066400000000000000000004123421223327513400224640ustar00rootroot00000000000000!define PRODUCT_NAME "Clementine" !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" !define PRODUCT_INSTALL_DIR "$PROGRAMFILES\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" Name "${PRODUCT_NAME}" OutFile "${PRODUCT_NAME}Setup-@CLEMENTINE_VERSION_SPARKLE@.exe" InstallDir "${PRODUCT_INSTALL_DIR}" ShowInstDetails show ShowUnInstDetails show RequestExecutionLevel admin 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" ; 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" SectionEnd Section "Clementine" Clementine SetOutPath "$INSTDIR" File "avcodec-53.dll" File "avformat-53.dll" File "avutil-51.dll" File "clementine.exe" File "clementine-tagreader.exe" File "clementine-spotifyblob.exe" File "clementine.ico" File "glew32.dll" File "intl.dll" File "libcdio-14.dll" File "libeay32.dll" File "libexpat-1.dll" File "libfaac.dll" File "libfaad.dll" File "libfftw3-3.dll" File "libFLAC.dll" File "libgcc_s_sjlj-1.dll" File "libgcrypt-11.dll" File "libgdk_pixbuf-2.0-0.dll" File "libgio-2.0-0.dll" File "libglib-2.0-0.dll" File "libgmodule-2.0-0.dll" File "libgnutls-26.dll" File "libgobject-2.0-0.dll" File "libgpg-error-0.dll" File "libgstapp-0.10-0.dll" File "libgstaudio-0.10-0.dll" File "libgstbase-0.10-0.dll" File "libgstcdda-0.10-0.dll" File "libgstcontroller-0.10-0.dll" File "libgstdataprotocol-0.10-0.dll" File "libgstfft-0.10-0.dll" File "libgstinterfaces-0.10-0.dll" File "libgstnet-0.10-0.dll" File "libgstnetbuffer-0.10-0.dll" File "libgstpbutils-0.10-0.dll" File "libgstreamer-0.10-0.dll" File "libgstriff-0.10-0.dll" File "libgstrtp-0.10-0.dll" File "libgstrtsp-0.10-0.dll" File "libgstsdp-0.10-0.dll" File "libgsttag-0.10-0.dll" File "libgthread-2.0-0.dll" File "libid3tag.dll" File "liblastfm.dll" File "libmad.dll" File "libmms-0.dll" File "libmp3lame-0.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 "libpng14-14.dll" File "libprotobuf-7.dll" File "libqjson.dll" File "libsoup-2.4-1.dll" File "libspeex-1.dll" File "libspotify.dll" File "libstdc++-6.dll" File "libtag.dll" File "libtasn1-3.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" ; Check the OS. If Vista or newer, use Default Programs nsisos::osversion StrCpy $R0 $0 IntCmp $R0 6 HasDefaultPrograms NoDefaultPrograms HasDefaultPrograms HasDefaultPrograms: ; Register Clementine with Default Programs Var /GLOBAL AppIcon Var /GLOBAL AppExe StrCpy $AppExe "$INSTDIR\clementine.exe" StrCpy $AppIcon "$INSTDIR\clementine.ico" ${RegisterCapabilities} ${RegisterMediaType} ".mp3" $AppExe $AppIcon "MP3 Audio File" ${RegisterMediaType} ".flac" $AppExe $AppIcon "FLAC Audio File" ${RegisterMediaType} ".ogg" $AppExe $AppIcon "OGG Audio File" ${RegisterMediaType} ".spx" $AppExe $AppIcon "OGG Speex Audio File" ${RegisterMediaType} ".m4a" $AppExe $AppIcon "MP4 Audio File" ${RegisterMediaType} ".aac" $AppExe $AppIcon "AAC Audio File" ${RegisterMediaType} ".wma" $AppExe $AppIcon "WMA Audio File" ${RegisterMediaType} ".wav" $AppExe $AppIcon "WAV Audio File" ${RegisterMediaType} ".pls" $AppExe $AppIcon "PLS Audio File" ${RegisterMediaType} ".m3u" $AppExe $AppIcon "M3U Audio File" ${RegisterMediaType} ".xspf" $AppExe $AppIcon "XSPF Audio File" ${RegisterMediaType} ".asx" $AppExe $AppIcon "Windows Media Audio/Video playlist" ${RegisterMimeType} "audio/mp3" "mp3" "{cd3afa76-b84f-48f0-9393-7edc34128127}" ${RegisterMimeType} "audio/mp4" "m4a" "{cd3afa7c-b84f-48f0-9393-7edc34128127}" ${RegisterMimeType} "audio/x-ms-wma" "wma" "{cd3afa84-b84f-48f0-9393-7edc34128127}" ${RegisterMimeType} "audio/wav" "wav" "{cd3afa7b-b84f-48f0-9393-7edc34128127}" ${RegisterMimeType} "audio/mpegurl" "m3u" "{cd3afa78-b84f-48f0-9393-7edc34128127}" ${RegisterMimeType} "application/x-wmplayer" "asx" "{cd3afa96-b84f-48f0-9393-7edc34128127}" Goto done NoDefaultPrograms: ${registerExtension} "$INSTDIR\clementine.exe" ".mp3" "MP3 Audio File" ${registerExtension} "$INSTDIR\clementine.exe" ".flac" "FLAC Audio File" ${registerExtension} "$INSTDIR\clementine.exe" ".ogg" "OGG Audio File" ${registerExtension} "$INSTDIR\clementine.exe" ".spx" "OGG Speex Audio File" ${registerExtension} "$INSTDIR\clementine.exe" ".m4a" "MP4 Audio File" ${registerExtension} "$INSTDIR\clementine.exe" ".aac" "AAC Audio File" ${registerExtension} "$INSTDIR\clementine.exe" ".wma" "WMA Audio File" ${registerExtension} "$INSTDIR\clementine.exe" ".wav" "WAV Audio File" ${registerExtension} "$INSTDIR\clementine.exe" ".pls" "PLS Audio File" ${registerExtension} "$INSTDIR\clementine.exe" ".m3u" "M3U Audio File" ${registerExtension} "$INSTDIR\clementine.exe" ".xspf" "XSPF Audio File" ${registerExtension} "$INSTDIR\clementine.exe" ".asx" "Windows Media Audio/Video playlist" 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=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=libgstdecodebin2.dll" "gstreamer-plugins\libgstdecodebin2.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=libgstffmpeg.dll" "gstreamer-plugins\libgstffmpeg.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=libgstlame.dll" "gstreamer-plugins\libgstlame.dll" File "/oname=libgstmad.dll" "gstreamer-plugins\libgstmad.dll" File "/oname=libgstmms.dll" "gstreamer-plugins\libgstmms.dll" File "/oname=libgstmpegaudioparse.dll" "gstreamer-plugins\libgstmpegaudioparse.dll" File "/oname=libgstogg.dll" "gstreamer-plugins\libgstogg.dll" File "/oname=libgstqtdemux.dll" "gstreamer-plugins\libgstqtdemux.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 Section "Start menu items" startmenu ; Create Start Menu folders and shortcuts. SetShellVarContext all CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}" CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\clementine.exe" CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Uninstall.lnk" "$INSTDIR\Uninstall.exe" SectionEnd Section "Uninstaller" ; Create uninstaller WriteUninstaller "$INSTDIR\Uninstall.exe" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "${PRODUCT_NAME}" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\Uninstall.exe" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\clementine.ico" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_DISPLAY_VERSION}" WriteRegDWORD ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "VersionMajor" "${PRODUCT_VERSION_MAJOR}" WriteRegDWORD ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "VersionMinor" "${PRODUCT_VERSION_MINOR}" WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}" 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\avcodec-53.dll" Delete "$INSTDIR\avformat-53.dll" Delete "$INSTDIR\avutil-51.dll" Delete "$INSTDIR\clementine.ico" Delete "$INSTDIR\clementine.exe" Delete "$INSTDIR\clementine-tagreader.exe" Delete "$INSTDIR\clementine-spotifyblob.exe" Delete "$INSTDIR\glew32.dll" Delete "$INSTDIR\intl.dll" Delete "$INSTDIR\libcdio-14.dll" Delete "$INSTDIR\libeay32.dll" Delete "$INSTDIR\libexpat-1.dll" Delete "$INSTDIR\libfaac.dll" Delete "$INSTDIR\libfaad.dll" Delete "$INSTDIR\libfftw3-3.dll" Delete "$INSTDIR\libFLAC.dll" Delete "$INSTDIR\libgcc_s_sjlj-1.dll" Delete "$INSTDIR\libgcrypt-11.dll" Delete "$INSTDIR\libgdk_pixbuf-2.0-0.dll" Delete "$INSTDIR\libgio-2.0-0.dll" Delete "$INSTDIR\libglib-2.0-0.dll" Delete "$INSTDIR\libgmodule-2.0-0.dll" Delete "$INSTDIR\libgnutls-26.dll" Delete "$INSTDIR\libgobject-2.0-0.dll" Delete "$INSTDIR\libgpg-error-0.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\libgthread-2.0-0.dll" Delete "$INSTDIR\libid3tag.dll" Delete "$INSTDIR\libimobiledevice-1.dll" Delete "$INSTDIR\liblastfm.dll" Delete "$INSTDIR\libmad.dll" Delete "$INSTDIR\libmms-0.dll" Delete "$INSTDIR\libmp3lame-0.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\libpng14-14.dll" Delete "$INSTDIR\libprotobuf-7.dll" Delete "$INSTDIR\libqjson.dll" Delete "$INSTDIR\libsoup-2.4-1.dll" Delete "$INSTDIR\libspeex-1.dll" Delete "$INSTDIR\libspotify.dll" Delete "$INSTDIR\libstdc++-6.dll" Delete "$INSTDIR\libtag.dll" Delete "$INSTDIR\libtasn1-3.dll" Delete "$INSTDIR\libusbmuxd.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\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\libgstdecodebin2.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\libgstffmpeg.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\libgstlame.dll" Delete "$INSTDIR\gstreamer-plugins\libgstmad.dll" Delete "$INSTDIR\gstreamer-plugins\libgstmms.dll" Delete "$INSTDIR\gstreamer-plugins\libgstmpegaudioparse.dll" Delete "$INSTDIR\gstreamer-plugins\libgstogg.dll" Delete "$INSTDIR\gstreamer-plugins\libgstqtdemux.dll" Delete "$INSTDIR\gstreamer-plugins\libgstreplaygain.dll" Delete "$INSTDIR\gstreamer-plugins\libgstspectrum.dll" Delete "$INSTDIR\gstreamer-plugins\libgstspeex.dll" Delete "$INSTDIR\gstreamer-plugins\libgstsouphttpsrc.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 Delete "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" Delete "$SMPROGRAMS\${PRODUCT_NAME}\Uninstall.lnk" RMDir /r "$SMPROGRAMS\${PRODUCT_NAME}" ; Remove the entry from 'installed programs list' DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" ; Check the OS. If Vista or newer, use Default Programs nsisos::osversion StrCpy $R0 $0 IntCmp $R0 6 HasDefaultPrograms NoDefaultPrograms HasDefaultPrograms HasDefaultPrograms: ; Unregister from Default Programs ${UnRegisterCapabilities} Goto done NoDefaultPrograms: ; Remove file associations ${unregisterExtension} ".mp3" "MP3 Audio File" ${unregisterExtension} ".flac" "FLAC Audio File" ${unregisterExtension} ".ogg" "OGG Audio File" ${unregisterExtension} ".spx" "OGG Speex Audio File" ${unregisterExtension} ".mp4" "MP4 Audio File" ${unregisterExtension} ".aac" "AAC Audio File" ${unregisterExtension} ".wma" "WMA Audio File" ${unregisterExtension} ".wav" "WAV Audio File" ${unregisterExtension} ".pls" "PLS Audio File" ${unregisterExtension} ".m3u" "M3U Audio File" ${unregisterExtension} ".xspf" "XSPF Audio File" ${unregisterExtension} ".asx" "Windows Media Audio/Video playlist" done: SectionEnd clementine-1.2.0+dfsg/dist/windows/windres.rc.in000066400000000000000000000013631223327513400216240ustar00rootroot00000000000000clementine 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.0+dfsg/ext/000077500000000000000000000000001223327513400153565ustar00rootroot00000000000000clementine-1.2.0+dfsg/ext/clementine-spotifyblob/000077500000000000000000000000001223327513400220335ustar00rootroot00000000000000clementine-1.2.0+dfsg/ext/clementine-spotifyblob/CMakeLists.txt000066400000000000000000000036731223327513400246040ustar00rootroot00000000000000include_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) 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.0+dfsg/ext/clementine-spotifyblob/main.cpp000066400000000000000000000026511223327513400234670ustar00rootroot00000000000000/* 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(NULL, NULL); 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.0+dfsg/ext/clementine-spotifyblob/mediapipeline.cpp000066400000000000000000000124471223327513400253540ustar00rootroot00000000000000/* 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_(NULL), appsrc_(NULL), 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", NULL)); GstElement* gdppay = gst_element_factory_make("gdppay", NULL); tcpsink_ = gst_element_factory_make("tcpclientsink", NULL); if (!pipeline_ || !appsrc_ || !tcpsink_) { if (pipeline_) { gst_object_unref(GST_OBJECT(pipeline_)); pipeline_ = NULL; } if (appsrc_) { gst_object_unref(GST_OBJECT(appsrc_)); appsrc_ = NULL; } if (gdppay) { gst_object_unref(GST_OBJECT(gdppay)); } if (tcpsink_) { gst_object_unref(GST_OBJECT(tcpsink_)); tcpsink_ = NULL; } 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_, NULL); // Set the sink's port g_object_set(G_OBJECT(tcpsink_), "host", "127.0.0.1", NULL); g_object_set(G_OBJECT(tcpsink_), "port", port_, NULL); // 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), NULL); // We know the time of each buffer g_object_set(G_OBJECT(appsrc_), "format", GST_FORMAT_TIME, NULL); // 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, NULL); // 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, NULL); #if Q_BYTE_ORDER == Q_BIG_ENDIAN const int endianness = G_BIG_ENDIAN; #elif Q_BYTE_ORDER == Q_LITTLE_ENDIAN const int endianness = G_LITTLE_ENDIAN; #endif // Set caps GstCaps* caps = gst_caps_new_simple("audio/x-raw-int", "endianness", G_TYPE_INT, endianness, "signed", G_TYPE_BOOLEAN, TRUE, "width", G_TYPE_INT, 16, "depth", G_TYPE_INT, 16, "rate", G_TYPE_INT, sample_rate, "channels", G_TYPE_INT, channels, NULL); 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_and_alloc(length); memcpy(GST_BUFFER_DATA(buffer), data, length); GST_BUFFER_OFFSET(buffer) = offset_bytes_; GST_BUFFER_TIMESTAMP(buffer) = offset_bytes_ * kNsecPerSec / byte_rate_; GST_BUFFER_DURATION(buffer) = length * kNsecPerSec / byte_rate_; offset_bytes_ += length; GST_BUFFER_OFFSET_END(buffer) = offset_bytes_; 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.0+dfsg/ext/clementine-spotifyblob/mediapipeline.h000066400000000000000000000033461223327513400250170ustar00rootroot00000000000000/* 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.0+dfsg/ext/clementine-spotifyblob/spotify_utilities.cpp000066400000000000000000000034451223327513400263350ustar00rootroot00000000000000/* 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.0+dfsg/ext/clementine-spotifyblob/spotify_utilities.h000066400000000000000000000021571223327513400260010ustar00rootroot00000000000000/* 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.0+dfsg/ext/clementine-spotifyblob/spotify_utilities.mm000066400000000000000000000024651223327513400261650ustar00rootroot00000000000000#include "spotify_utilities.h" #import #import #import namespace utilities { QString GetUserDataDirectory() { NSAutoreleasePool* pool = [NSAutoreleasePool alloc]; [pool init]; 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"; } [pool drain]; return ret; } QString GetSettingsDirectory() { NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; 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]); [pool drain]; return path; } } clementine-1.2.0+dfsg/ext/clementine-spotifyblob/spotifyclient.cpp000066400000000000000000001021521223327513400254340ustar00rootroot00000000000000/* 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 "mediapipeline.h" #include "spotifyclient.h" #include "spotifykey.h" #include "spotifymessages.pb.h" #include "spotify_utilities.h" #include "core/logging.h" #include #include #include #include #include const int SpotifyClient::kSpotifyImageIDSize = 20; const int SpotifyClient::kWaveHeaderSize = 44; SpotifyClient::SpotifyClient(QObject* parent) : AbstractMessageHandler(NULL, parent), api_key_(QByteArray::fromBase64(kSpotifyApiKey)), protocol_socket_(new QTcpSocket(this)), session_(NULL), 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 ; isession_, 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 ; iadd_result()); } // Get the albums from the search. All these should be resolved by now. QList browses = pending_search_album_browses_.take(result); foreach (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 ; iadd_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_bytes()); } 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()); } } 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. NULL); } } 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 const int count = sp_playlistcontainer_num_playlists(pc); for (int i=0 ; iget_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 NULL"; return; } const int count = sp_playlistcontainer_num_playlists(container); for (int i=0 ; iadd_playlist(); msg->set_index(i); msg->set_name(sp_playlist_name(playlist)); 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); } } SendMessage(message); } sp_playlist* SpotifyClient::GetPlaylist(pb::spotify::PlaylistType type, int user_index) { sp_playlist* playlist = NULL; 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 = NULL; for (int i=0 ; ipending_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 ; itracks_ << track; } } // If any of the tracks aren't loaded yet we have to wait foreach (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_; foreach (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::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 ; iadd_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, sizeof(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, sizeof(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)); foreach (const PendingLoadPlaylist& load, me->pending_load_playlists_) { PlaylistStateChangedForLoadPlaylist(load.playlist_, me); } foreach (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 NULL"; return; } const int count = sp_playlistcontainer_num_playlists(container); for (int i=0 ; iGetDownloadProgress(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_bytes) { // 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; } // Remove this from the pending list now pending_playback_requests_.removeAll(req); // 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_); 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_); } 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 = NULL; for (int i=0 ; iset_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 ; iConvertTrack(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. NULL, &ToplistBrowseComplete, this); pending_toplist_browses_[browse] = req; } 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.0+dfsg/ext/clementine-spotifyblob/spotifyclient.h000066400000000000000000000155431223327513400251100ustar00rootroot00000000000000/* 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 = 0); ~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 StartPlayback(const pb::spotify::PlaybackRequest& req); void Seek(qint64 offset_bytes); 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 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.0+dfsg/ext/clementine-spotifyblob/spotifykey.h000066400000000000000000000030571223327513400244170ustar00rootroot00000000000000/* 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.0+dfsg/ext/clementine-tagreader/000077500000000000000000000000001223327513400214355ustar00rootroot00000000000000clementine-1.2.0+dfsg/ext/clementine-tagreader/CMakeLists.txt000066400000000000000000000024741223327513400242040ustar00rootroot00000000000000include_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.0+dfsg/ext/clementine-tagreader/data/000077500000000000000000000000001223327513400223465ustar00rootroot00000000000000clementine-1.2.0+dfsg/ext/clementine-tagreader/data/data.qrc000066400000000000000000000001341223327513400237640ustar00rootroot00000000000000 godaddy-root.pem clementine-1.2.0+dfsg/ext/clementine-tagreader/data/godaddy-root.pem000066400000000000000000000026501223327513400254500ustar00rootroot00000000000000-----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.0+dfsg/ext/clementine-tagreader/main.cpp000066400000000000000000000036211223327513400230670ustar00rootroot00000000000000/* 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,NULL); 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)); TagReaderWorker worker(&socket); return a.exec(); } clementine-1.2.0+dfsg/ext/clementine-tagreader/tagreaderworker.cpp000066400000000000000000000072631223327513400253410ustar00rootroot00000000000000/* 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.0+dfsg/ext/clementine-tagreader/tagreaderworker.h000066400000000000000000000022721223327513400250010ustar00rootroot00000000000000/* 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.0+dfsg/ext/libclementine-common/000077500000000000000000000000001223327513400214565ustar00rootroot00000000000000clementine-1.2.0+dfsg/ext/libclementine-common/CMakeLists.txt000066400000000000000000000013011223327513400242110ustar00rootroot00000000000000include_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 ) 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.0+dfsg/ext/libclementine-common/core/000077500000000000000000000000001223327513400224065ustar00rootroot00000000000000clementine-1.2.0+dfsg/ext/libclementine-common/core/closure.cpp000066400000000000000000000040361223327513400245710ustar00rootroot00000000000000/* 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 #include "core/timeconstants.h" namespace _detail { ClosureBase::ClosureBase(ObjectHelper* helper) : helper_(helper) { } ClosureBase::~ClosureBase() { } CallbackClosure::CallbackClosure( QObject* sender, const char* signal, std::tr1::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::tr1::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.0+dfsg/ext/libclementine-common/core/closure.h000066400000000000000000000142161223327513400242370ustar00rootroot00000000000000/* 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 #include namespace _detail { class ObjectHelper; // Interface for ObjectHelper to call on signal emission. class ClosureBase : boost::noncopyable { public: virtual ~ClosureBase(); virtual void Invoke() = 0; // Tests only. ObjectHelper* helper() const; protected: explicit ClosureBase(ObjectHelper*); ObjectHelper* helper_; }; // 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: boost::scoped_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)), // boost::bind is the easiest way to store an argument list. function_(boost::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()); } boost::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::tr1::function callback); virtual void Invoke(); private: std::tr1::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::tr1::function callback); template _detail::ClosureBase* NewClosure( QObject* sender, const char* signal, std::tr1::function callback, const Args&... args) { return NewClosure(sender, signal, boost::bind(callback, args...)); } template _detail::ClosureBase* NewClosure( QObject* sender, const char* signal, void (*callback)(Args...), const Args&... args) { return NewClosure(sender, signal, boost::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, boost::bind(callback, receiver, args...)); } void DoAfter(QObject* receiver, const char* slot, int msec); void DoInAMinuteOrSo(QObject* receiver, const char* slot); #endif // CLOSURE_H clementine-1.2.0+dfsg/ext/libclementine-common/core/concurrentrun.h000066400000000000000000000101411223327513400254630ustar00rootroot00000000000000/* 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 #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(boost::function function, Args... args) : function_(boost::bind(function, args...)) { } virtual void run() { this->reportResult(function_()); this->reportFinished(); } private: boost::function function_; }; // Partial specialisation for void return type. template class ThreadFunctor : public ThreadFunctorBase { public: ThreadFunctor(boost::function function, Args... args) : function_(boost::bind(function, args...)) { } virtual void run() { function_(); this->reportFinished(); } private: boost::function function_; }; /* Run functions */ namespace ConcurrentRun { // Empty argument form. template QFuture Run( QThreadPool* threadpool, boost::function function) { return (new ThreadFunctor(function))->Start(threadpool); } // Function object with arguments form. template QFuture Run( QThreadPool* threadpool, boost::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, boost::function(function), args...); } } #endif // CONCURRENTRUN_H clementine-1.2.0+dfsg/ext/libclementine-common/core/logging.cpp000066400000000000000000000154071223327513400245470ustar00rootroot00000000000000/* 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 = NULL; static QIODevice* sNullDevice = NULL; const char* kDefaultLogLevels = "GstEnginePipeline:2,*:3"; static const char* kMessageHandlerMagic = "__logging_message__"; static const int kMessageHandlerMagicLength = strlen(kMessageHandlerMagic); static QtMsgHandler sOriginalMessageHandler = NULL; 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; } foreach (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; foreach (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 = NULL; 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(), NULL, NULL, &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 clementine-1.2.0+dfsg/ext/libclementine-common/core/logging.h000066400000000000000000000033671223327513400242160ustar00rootroot00000000000000/* 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 #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; } #endif // LOGGING_H clementine-1.2.0+dfsg/ext/libclementine-common/core/messagehandler.cpp000066400000000000000000000061751223327513400261050ustar00rootroot00000000000000/* 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_(NULL), flush_abstract_socket_(NULL), flush_local_socket_(NULL), 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.0+dfsg/ext/libclementine-common/core/messagehandler.h000066400000000000000000000131421223327513400255420ustar00rootroot00000000000000/* 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() { foreach (ReplyType* reply, pending_replies_) { reply->Abort(); } pending_replies_.clear(); } #endif // MESSAGEHANDLER_H clementine-1.2.0+dfsg/ext/libclementine-common/core/messagereply.cpp000066400000000000000000000023661223327513400256210ustar00rootroot00000000000000/* 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.0+dfsg/ext/libclementine-common/core/messagereply.h000066400000000000000000000053631223327513400252660ustar00rootroot00000000000000/* 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 = 0); 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 = 0); 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.0+dfsg/ext/libclementine-common/core/override.h000066400000000000000000000022261223327513400244000ustar00rootroot00000000000000/* 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.0+dfsg/ext/libclementine-common/core/waitforsignal.cpp000066400000000000000000000016461223327513400257720ustar00rootroot00000000000000/* 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.0+dfsg/ext/libclementine-common/core/waitforsignal.h000066400000000000000000000015611223327513400254330ustar00rootroot00000000000000/* 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.0+dfsg/ext/libclementine-common/core/workerpool.cpp000066400000000000000000000015011223327513400253120ustar00rootroot00000000000000/* 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.0+dfsg/ext/libclementine-common/core/workerpool.h000066400000000000000000000276171223327513400247770ustar00rootroot00000000000000/* 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 = 0); 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 = 0); ~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() { foreach (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(); } } } foreach (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 foreach (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 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 ; iis_device_closed()) { next_worker_ = (worker_index + 1) % workers_.count(); return workers_[worker_index].handler_; } } return NULL; } #endif // WORKERPOOL_H clementine-1.2.0+dfsg/ext/libclementine-remote/000077500000000000000000000000001223327513400214615ustar00rootroot00000000000000clementine-1.2.0+dfsg/ext/libclementine-remote/CMakeLists.txt000066400000000000000000000004401223327513400242170ustar00rootroot00000000000000include_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.0+dfsg/ext/libclementine-remote/remotecontrolmessages.proto000066400000000000000000000171001223327513400271710ustar00rootroot00000000000000package 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; // 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; } // Valid Engine states enum EngineState { Empty = 0; Idle = 1; Playing = 2; Paused = 3; } // Song Metadata message SongMetadata { 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) } // 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; } // 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]; } // 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; } message RequestDownloadSongs { optional DownloadItem download_item = 1; optional int32 playlist_id = 2; } 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; } message ResponseLibraryChunk { optional int32 chunk_number = 1; optional int32 chunk_count = 2; optional bytes data = 3; optional int32 size = 4; } message ResponseSongOffer { optional bool accepted = 1; // true = client wants to download item } message RequestRateSong { optional float rating = 1; // 0 to 1 } // The message itself message Message { optional int32 version = 1 [default=11]; 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 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; } clementine-1.2.0+dfsg/ext/libclementine-spotifyblob/000077500000000000000000000000001223327513400225225ustar00rootroot00000000000000clementine-1.2.0+dfsg/ext/libclementine-spotifyblob/CMakeLists.txt000066400000000000000000000006461223327513400252700ustar00rootroot00000000000000include_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.0+dfsg/ext/libclementine-spotifyblob/blobversion.h.in000066400000000000000000000015701223327513400256270ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/ext/libclementine-spotifyblob/spotifymessages.proto000066400000000000000000000117641223327513400270450ustar00rootroot00000000000000/* 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 bool is_offline = 3; // Offline sync progress between 0-100. optional int32 download_progress = 4; } 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_bytes = 1; } enum Bitrate { Bitrate96k = 1; Bitrate160k = 2; Bitrate320k = 3; } message PlaybackSettings { optional Bitrate bitrate = 1 [default = Bitrate320k]; optional bool volume_normalisation = 2 [default = false]; } // NEXT_ID: 21 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; } clementine-1.2.0+dfsg/ext/libclementine-tagreader/000077500000000000000000000000001223327513400221245ustar00rootroot00000000000000clementine-1.2.0+dfsg/ext/libclementine-tagreader/CMakeLists.txt000066400000000000000000000015321223327513400246650ustar00rootroot00000000000000include_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.0+dfsg/ext/libclementine-tagreader/cloudstream.cpp000066400000000000000000000132401223327513400251520ustar00rootroot00000000000000/* 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); // The Ubuntu One server applies the byte range to the gzipped data, rather // than the raw data so we must disable compression. if (url_.host() == "files.one.ubuntu.com") { request.setRawHeader("Accept-Encoding", "identity"); } 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) { foreach (const QSslError& error, errors) { qLog(Debug) << error.error() << error.errorString(); qLog(Debug) << error.certificate(); } } clementine-1.2.0+dfsg/ext/libclementine-tagreader/cloudstream.h000066400000000000000000000047351223327513400246300ustar00rootroot00000000000000/* 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.0+dfsg/ext/libclementine-tagreader/fmpsparser.cpp000066400000000000000000000103261223327513400250140ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 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, boost::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, boost::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.0+dfsg/ext/libclementine-tagreader/fmpsparser.h000066400000000000000000000035011223327513400244560ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/ext/libclementine-tagreader/tagreader.cpp000066400000000000000000001064261223327513400245770ustar00rootroot00000000000000/* 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 #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" using boost::scoped_ptr; // 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"; 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()); scoped_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(), NULL, song->mutable_title()); Decode(tag->artist(), NULL, song->mutable_artist()); Decode(tag->album(), NULL, song->mutable_album()); Decode(tag->genre(), NULL, song->mutable_genre()); song->set_year(tag->year()); song->set_track(tag->track()); song->set_valid(true); } QString disc; QString compilation; // 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(), NULL, &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(), NULL, song->mutable_composer()); if (!map["TIT1"].isEmpty()) // content group Decode(map["TIT1"].front()->toString(), NULL, song->mutable_grouping()); if (!map["TPE1"].isEmpty()) // ID3v2: lead performer/soloist Decode(map["TPE1"].front()->toString(), NULL, song->mutable_performer()); if (!map["TPE2"].isEmpty()) // non-standard: Apple, Microsoft Decode(map["TPE2"].front()->toString(), NULL, song->mutable_albumartist()); if (!map["TCMP"].isEmpty()) compilation = TStringToQString(map["TCMP"].front()->toString()).trimmed(); 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"][i]); if (frame && TStringToQString(frame->description()) != "iTunNORM") { Decode(frame->text(), NULL, song->mutable_comment()); break; } } // Parse FMPS frames for (int i=0 ; i(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(), NULL, &disc, &compilation, song); #ifdef TAGLIB_HAS_FLAC_PICTURELIST if (!file->pictureList().isEmpty()) { song->set_art_automatic(kEmbeddedCover); } #endif } Decode(tag->comment(), NULL, 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(), NULL, 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(", "), NULL, song->mutable_composer()); } if(items.contains("\251grp")) { Decode(items["\251grp"].toStringList().toString(" "), NULL, song->mutable_grouping()); } Decode(mp4_tag->comment(), NULL, 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); } } } } #endif else if (tag) { Decode(tag->comment(), NULL, 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 (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["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["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); } 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; scoped_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())); 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("TPE1", song.performer(), tag); 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(), NULL, 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; scoped_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(), NULL, 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; scoped_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(), NULL, 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); // Remove the frame if it already exists while (tag->frameListMap().contains(id_vector) && tag->frameListMap()[id_vector].size() != 0) { tag->removeFrame(tag->frameListMap()[id_vector].front()); } // Create and add a new frame TagLib::ID3v2::TextIdentificationFrame* frame = new TagLib::ID3v2::TextIdentificationFrame(id_vector, TagLib::String::UTF8); frame->setText(StdStringToTaglibString(value)); tag->addFrame(frame); } bool TagReader::IsMediaFile(const QString& filename) const { qLog(Debug) << "Checking for valid file" << filename; scoped_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(); // 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; CloudStream* stream = new CloudStream( download_url, title, size, authorisation_header, network_); stream->Precache(); scoped_ptr tag; if (mime_type == "audio/mpeg" && title.endsWith(".mp3")) { tag.reset(new TagLib::MPEG::File( stream, // Takes ownership. 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, true, TagLib::AudioProperties::Accurate)); } else if (mime_type == "application/ogg" || mime_type == "audio/ogg") { tag.reset(new TagLib::Ogg::Vorbis::File( stream, true, TagLib::AudioProperties::Accurate)); } #ifdef TAGLIB_HAS_OPUS else if (mime_type == "application/opus" || mime_type == "audio/opus") { tag.reset(new TagLib::Ogg::Opus::File( stream, true, TagLib::AudioProperties::Accurate)); } #endif else if (mime_type == "application/x-flac" || mime_type == "audio/flac" || mime_type == "audio/x-flac") { tag.reset(new TagLib::FLAC::File( stream, TagLib::ID3v2::FrameFactory::instance(), true, TagLib::AudioProperties::Accurate)); } else if (mime_type == "audio/x-ms-wma") { tag.reset(new TagLib::ASF::File( stream, 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 = NULL; 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.0+dfsg/ext/libclementine-tagreader/tagreader.h000066400000000000000000000107741223327513400242440ustar00rootroot00000000000000/* 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; 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.0+dfsg/ext/libclementine-tagreader/tagreadermessages.proto000066400000000000000000000066131223327513400267050ustar00rootroot00000000000000package 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; } 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.0+dfsg/gst/000077500000000000000000000000001223327513400153535ustar00rootroot00000000000000clementine-1.2.0+dfsg/gst/moodbar/000077500000000000000000000000001223327513400167765ustar00rootroot00000000000000clementine-1.2.0+dfsg/gst/moodbar/01-fftw-plan-mutex.patch000066400000000000000000000016711223327513400233000ustar00rootroot00000000000000From 0b62ebc38d1cc0202c6f57c4e096fa0b68a41baf Mon Sep 17 00:00:00 2001 From: David Sansome Date: Sun, 27 May 2012 17:00:32 +0100 Subject: [PATCH] Protect calls to fftwf_plan_dft_r2c_1d with a mutex --- plugin/gstfftwspectrum.c | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/plugin/gstfftwspectrum.c b/plugin/gstfftwspectrum.c index 147e606..f6e2427 100644 --- a/plugin/gstfftwspectrum.c +++ b/plugin/gstfftwspectrum.c @@ -302,10 +302,14 @@ alloc_fftw_data (GstFFTWSpectrum *conv) * outputs are the hermetian conjugates). This should be optimal for * implementing filters. */ + + static GStaticMutex mutex = G_STATIC_MUTEX_INIT; + g_static_mutex_lock(&mutex); conv->fftw_plan = fftwf_plan_dft_r2c_1d(conv->size, conv->fftw_in, (fftwf_complex *) conv->fftw_out, conv->hi_q ? FFTW_MEASURE : FFTW_ESTIMATE); + g_static_mutex_unlock(&mutex); } -- 1.7.5.4 clementine-1.2.0+dfsg/gst/moodbar/CMakeLists.txt000066400000000000000000000011741223327513400215410ustar00rootroot00000000000000cmake_minimum_required(VERSION 2.6) set(CMAKE_C_FLAGS "-Wall") set(CMAKE_CXX_FLAGS "-Woverloaded-virtual -Wall") 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 gstfftwspectrum.c gstmoodbar.c spectrum.c ) add_library(gstmoodbar STATIC ${SOURCES} ) target_link_libraries(gstmoodbar ${GOBJECT_LIBRARIES} ${GLIB_LIBRARIES} ${GSTREAMER_LIBRARIES} ${GSTREAMER_BASE_LIBRARIES} ${FFTW3_FFTW_LIBRARY} ) clementine-1.2.0+dfsg/gst/moodbar/gstfftwspectrum.c000066400000000000000000000453131223327513400224170ustar00rootroot00000000000000/* GStreamer FFTW-based signal-to-spectrum converter * Copyright (C) 2006 Joseph Rabinoff */ /*************************************************************************** * * * 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. * * * ***************************************************************************/ /** * SECTION:element-fftwspectrum * * * Example launch line * * * gst-launch audiotestsrc ! audioconvert ! fftwspectrum ! fftwunspectrum ! audioconvert ! alsasink * * * */ /* This is a simple plugin to take an audio signal and return its * Fourier transform, using fftw3. It takes a specified number N of * samples and returns the first N/2+1 (complex) Fourier transform * values (the other half of the values being the complex conjugates * of the first). The modulus of these values correspond to the * strength of the signal in their various bands, and the phase gives * information about the phase of the signal. The step by which the * transform increments is also variable, so it can return redundant * data (to reduce artifacts when converting back into a signal). */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include "gstfftwspectrum.h" #include "spectrum.h" GST_DEBUG_CATEGORY (gst_fftwspectrum_debug); #define GST_CAT_DEFAULT gst_fftwspectrum_debug /* Filter signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; /* The size and step arguments are actually only default values * used to fixate the size and step properties of the source cap. */ enum { ARG_0, ARG_DEF_SIZE, ARG_DEF_STEP, ARG_HIQUALITY }; #define DEF_SIZE_DEFAULT 1024 #define DEF_STEP_DEFAULT 512 #define HIQUALITY_DEFAULT TRUE static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ( SPECTRUM_SIGNAL_CAPS ) ); /* See spectrum.h for a definition of the frequency caps */ static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ( SPECTRUM_FREQ_CAPS ) ); GST_BOILERPLATE (GstFFTWSpectrum, gst_fftwspectrum, GstElement, GST_TYPE_ELEMENT); static void gst_fftwspectrum_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); static void gst_fftwspectrum_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); static gboolean gst_fftwspectrum_set_sink_caps (GstPad *pad, GstCaps *caps); static gboolean gst_fftwspectrum_set_src_caps (GstPad *pad, GstCaps *caps); static void gst_fftwspectrum_fixatecaps (GstPad *pad, GstCaps *caps); static GstCaps *gst_fftwspectrum_getcaps (GstPad *pad); static GstFlowReturn gst_fftwspectrum_chain (GstPad *pad, GstBuffer *buf); static GstStateChangeReturn gst_fftwspectrum_change_state (GstElement *element, GstStateChange transition); #define OUTPUT_SIZE(conv) (((conv)->size/2+1)*sizeof(fftw_complex)) /***************************************************************/ /* GObject boilerplate stuff */ /***************************************************************/ static void gst_fftwspectrum_base_init (gpointer gclass) { static GstElementDetails element_details = { "FFTW-based Fourier transform", "Filter/Converter/Spectrum", "Convert a raw audio stream into a frequency spectrum", "Joe Rabinoff " }; GstElementClass *element_class = GST_ELEMENT_CLASS (gclass); gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&src_factory)); gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&sink_factory)); gst_element_class_set_details (element_class, &element_details); } /* initialize the plugin's class */ static void gst_fftwspectrum_class_init (GstFFTWSpectrumClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gobject_class->set_property = gst_fftwspectrum_set_property; gobject_class->get_property = gst_fftwspectrum_get_property; g_object_class_install_property (gobject_class, ARG_DEF_SIZE, g_param_spec_int ("def-size", "Default Size", "Apply a Fourier transform to this many samples at a time (default value)", 1, G_MAXINT32, DEF_SIZE_DEFAULT, G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, ARG_DEF_STEP, g_param_spec_int ("def-step", "Default Step", "Advance the stream this many samples each time (default value)", 1, G_MAXINT32, DEF_STEP_DEFAULT, G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, ARG_HIQUALITY, g_param_spec_boolean ("hiquality", "High Quality", "Use a more time-consuming, higher quality algorithm chooser", HIQUALITY_DEFAULT, G_PARAM_READWRITE)); gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_fftwspectrum_change_state); } /* initialize the new element * instantiate pads and add them to element * set functions * initialize structure */ static void gst_fftwspectrum_init (GstFFTWSpectrum * conv, GstFFTWSpectrumClass * gclass) { GstElementClass *klass = GST_ELEMENT_GET_CLASS (conv); conv->sinkpad = gst_pad_new_from_template (gst_element_class_get_pad_template (klass, "sink"), "sink"); gst_pad_set_setcaps_function (conv->sinkpad, GST_DEBUG_FUNCPTR (gst_fftwspectrum_set_sink_caps)); gst_pad_set_getcaps_function (conv->sinkpad, GST_DEBUG_FUNCPTR (gst_fftwspectrum_getcaps)); gst_pad_set_chain_function (conv->sinkpad, GST_DEBUG_FUNCPTR (gst_fftwspectrum_chain)); conv->srcpad = gst_pad_new_from_template (gst_element_class_get_pad_template (klass, "src"), "src"); gst_pad_set_setcaps_function (conv->srcpad, GST_DEBUG_FUNCPTR (gst_fftwspectrum_set_src_caps)); gst_pad_set_getcaps_function (conv->srcpad, GST_DEBUG_FUNCPTR (gst_fftwspectrum_getcaps)); gst_pad_set_fixatecaps_function (conv->srcpad, GST_DEBUG_FUNCPTR (gst_fftwspectrum_fixatecaps)); gst_element_add_pad (GST_ELEMENT (conv), conv->sinkpad); gst_element_add_pad (GST_ELEMENT (conv), conv->srcpad); /* These are set once the (source) capabilities are determined */ conv->rate = 0; conv->size = 0; conv->step = 0; /* These are set when we change to READY */ conv->fftw_in = NULL; conv->fftw_out = NULL; conv->fftw_plan = NULL; /* These are set when we start receiving data */ conv->samples = NULL; conv->numsamples = 0; conv->timestamp = 0; conv->offset = 0; /* Properties */ conv->def_size = DEF_SIZE_DEFAULT; conv->def_step = DEF_STEP_DEFAULT; conv->hi_q = HIQUALITY_DEFAULT; } static void gst_fftwspectrum_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstFFTWSpectrum *conv = GST_FFTWSPECTRUM (object); switch (prop_id) { case ARG_DEF_SIZE: conv->def_size = g_value_get_int (value); break; case ARG_DEF_STEP: conv->def_step = g_value_get_int (value); break; case ARG_HIQUALITY: conv->hi_q = g_value_get_boolean (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_fftwspectrum_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstFFTWSpectrum *conv = GST_FFTWSPECTRUM (object); switch (prop_id) { case ARG_DEF_SIZE: g_value_set_int (value, conv->def_size); break; case ARG_DEF_STEP: g_value_set_int (value, conv->def_step); break; case ARG_HIQUALITY: g_value_set_boolean (value, conv->hi_q); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } /* Allocate and deallocate fftw state data */ static void free_fftw_data (GstFFTWSpectrum *conv) { if(conv->fftw_plan != NULL) fftw_destroy_plan (conv->fftw_plan); if(conv->fftw_in != NULL) fftw_free (conv->fftw_in); if(conv->fftw_out != NULL) fftw_free (conv->fftw_out); conv->fftw_in = NULL; conv->fftw_out = NULL; conv->fftw_plan = NULL; } static void alloc_fftw_data (GstFFTWSpectrum *conv) { free_fftw_data (conv); GST_DEBUG ("Allocating data for size = %d and step = %d", conv->size, conv->step); conv->fftw_in = (double *) fftw_malloc (sizeof(double) * conv->size); conv->fftw_out = (double *) fftw_malloc (OUTPUT_SIZE (conv)); /* We use the simplest real-to-complex algorithm, which takes n real * inputs and returns floor(n/2) + 1 complex outputs (the other n/2 * outputs are the hermetian conjugates). This should be optimal for * implementing filters. */ static GStaticMutex mutex = G_STATIC_MUTEX_INIT; g_static_mutex_lock(&mutex); conv->fftw_plan = fftw_plan_dft_r2c_1d(conv->size, conv->fftw_in, (fftw_complex *) conv->fftw_out, conv->hi_q ? FFTW_MEASURE : FFTW_ESTIMATE); g_static_mutex_unlock(&mutex); } /***************************************************************/ /* Capabilities negotiation */ /***************************************************************/ /* The input and output capabilities are only related by the "rate" * parameter, which is propagated so that an audio signal can be * reconstructed eventually. This module does no rate conversion. * * The way I understand it, there are two times when caps negotiation * takes place: (1) when a sink pad receives either its first buffer, * or a buffer with a new caps type, and (2) when a source pad request * a buffer from something downstream, and the returned allocated * buffer has different caps from the ones already negotiated. In the * first case, _set_sink_caps is called, and in the second, _set_src_caps * is called. * When (1) occurs, we remember the rate (the only variable parameter * in the source) and set the source caps. Then _set_src_caps is called. * In _set_src_caps, we check that the rate hasn't changed, and figure out * or remember appropriate size and step attributes. If _set_src_caps is * called from _set_sink_caps, this completes our setting up our internal * configuration; if it is called from (2), we reconfigure just the source * part of the internal configuration. */ static gboolean gst_fftwspectrum_set_sink_caps (GstPad * pad, GstCaps * caps) { GstFFTWSpectrum *conv; GstCaps *srccaps, *newsrccaps; GstStructure *newstruct; gint rate; gboolean res; conv = GST_FFTWSPECTRUM (gst_pad_get_parent (pad)); srccaps = gst_pad_get_allowed_caps (conv->srcpad); newsrccaps = gst_caps_copy_nth (srccaps, 0); gst_caps_unref (srccaps); newstruct = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (newstruct, "rate", &rate)) { gst_caps_unref (newsrccaps); gst_object_unref (conv); return FALSE; } /* Fixate the source caps with the given rate */ gst_caps_set_simple (newsrccaps, "rate", G_TYPE_INT, rate, NULL); gst_pad_fixate_caps (conv->srcpad, newsrccaps); conv->rate = rate; res = gst_pad_set_caps (conv->srcpad, newsrccaps); if (!res) conv->rate = 0; gst_caps_unref (newsrccaps); gst_object_unref (conv); return res; } static gboolean gst_fftwspectrum_set_src_caps (GstPad * pad, GstCaps * caps) { GstFFTWSpectrum *conv; gboolean res = FALSE; GstStructure *newstruct; gint rate; conv = GST_FFTWSPECTRUM (gst_pad_get_parent (pad)); newstruct = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (newstruct, "rate", &rate)) goto out; /* Assume caps negotiation has already taken place */ if (rate == conv->rate) { gint size, step; if (!gst_structure_get_int (newstruct, "size", &size)) goto out; if (!gst_structure_get_int (newstruct, "step", &step)) goto out; if (conv->size != size || conv->step != step) { conv->size = size; conv->step = step; /* Re-allocate the fftw data */ if (GST_STATE (GST_ELEMENT (conv)) >= GST_STATE_READY) alloc_fftw_data (conv); } res = TRUE; } out: gst_object_unref (conv); return res; } /* The only thing that can constrain the caps is the rate. */ static GstCaps * gst_fftwspectrum_getcaps (GstPad *pad) { GstFFTWSpectrum *conv; GstCaps *tmplcaps; conv = GST_FFTWSPECTRUM (gst_pad_get_parent (pad)); tmplcaps = gst_caps_copy (gst_pad_get_pad_template_caps (pad)); if(conv->rate != 0) { /* Assumes the template caps are simple */ gst_caps_set_simple (tmplcaps, "rate", G_TYPE_INT, conv->rate, NULL); } gst_object_unref (conv); return tmplcaps; } /* This is called when the source pad needs to choose its capabilities * when it has a choice and nobody's forcing its hand. In this case * we take our hint from the def_size and def_step properties. */ static void gst_fftwspectrum_fixatecaps (GstPad *pad, GstCaps *caps) { GstFFTWSpectrum *conv; GstStructure *s; const GValue *val; conv = GST_FFTWSPECTRUM (gst_pad_get_parent (pad)); s = gst_caps_get_structure (caps, 0); val = gst_structure_get_value (s, "size"); if (val == NULL) gst_caps_set_simple (caps, "size", G_TYPE_INT, conv->def_size, NULL); else if (G_VALUE_TYPE (val) == GST_TYPE_INT_RANGE) { gint sizemin, sizemax; sizemin = gst_value_get_int_range_min (val); sizemax = gst_value_get_int_range_max (val); gst_caps_set_simple (caps, "size", G_TYPE_INT, CLAMP (conv->def_size, sizemin, sizemax), NULL); } /* else it should be already fixed */ val = gst_structure_get_value (s, "step"); if (val == NULL) gst_caps_set_simple (caps, "step", G_TYPE_INT, conv->def_step, NULL); else if (G_VALUE_TYPE (val) == GST_TYPE_INT_RANGE) { gint stepmin, stepmax; stepmin = gst_value_get_int_range_min (val); stepmax = gst_value_get_int_range_max (val); gst_caps_set_simple (caps, "step", G_TYPE_INT, CLAMP (conv->def_step, stepmin, stepmax), NULL); } /* else it should be already fixed */ /* Assume rate is already fixed (if not it'll be fixed by default) */ gst_object_unref (conv); } /***************************************************************/ /* Actual conversion */ /***************************************************************/ static GstStateChangeReturn gst_fftwspectrum_change_state (GstElement * element, GstStateChange transition) { GstFFTWSpectrum *conv = GST_FFTWSPECTRUM (element); GstStateChangeReturn res; switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: alloc_fftw_data (conv); break; case GST_STATE_CHANGE_READY_TO_PAUSED: conv->samples = (gdouble *) g_malloc (sizeof(gdouble)); conv->numsamples = 0; conv->timestamp = 0; conv->offset = 0; break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: break; default: break; } res = parent_class->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_READY: g_free(conv->samples); conv->samples = NULL; conv->numsamples = 0; conv->timestamp = 0; conv->offset = 0; break; case GST_STATE_CHANGE_READY_TO_NULL: free_fftw_data (conv); break; default: break; } return res; } /* Adds the samples contained in buf to the end of conv->samples, * updating conv->numsamples. */ static void push_samples (GstFFTWSpectrum *conv, GstBuffer *buf) { gint newsamples = GST_BUFFER_SIZE (buf) / sizeof (gdouble); gint oldsamples = conv->numsamples; conv->numsamples += newsamples; conv->samples = g_realloc (conv->samples, conv->numsamples * sizeof (gdouble)); memcpy (&conv->samples[oldsamples], GST_BUFFER_DATA (buf), newsamples * sizeof (gdouble)); /* GST_LOG ("Added %d samples", newsamples); */ } /* This basically does the opposite of push_samples, but takes samples * off the front. */ static void shift_samples (GstFFTWSpectrum *conv, gint toshift) { gdouble *oldsamples = conv->samples; conv->numsamples -= toshift; conv->samples = g_malloc (MAX (conv->numsamples, 1) * sizeof (double)); memcpy (conv->samples, &oldsamples[toshift], conv->numsamples * sizeof (gdouble)); g_free (oldsamples); /* Fix the timestamp and offset */ conv->timestamp += gst_util_uint64_scale_int (GST_SECOND, toshift, conv->rate); conv->offset += toshift; /* GST_LOG ("Disposed of %d samples (time: %" GST_TIME_FORMAT " offset: %llu)", toshift, GST_TIME_ARGS(conv->timestamp), conv->offset); */ } /* This function queues samples until there are at least * max (conv->size, conv->step) samples to process. We * then process samples in chunks of conv->size and increment * by conv->step. */ static GstFlowReturn gst_fftwspectrum_chain (GstPad * pad, GstBuffer * buf) { GstFFTWSpectrum *conv; GstBuffer *outbuf; GstFlowReturn res = GST_FLOW_OK; conv = GST_FFTWSPECTRUM (gst_pad_get_parent (pad)); push_samples (conv, buf); gst_buffer_unref (buf); while (conv->numsamples >= MAX (conv->size, conv->step)) { res = gst_pad_alloc_buffer_and_set_caps (conv->srcpad, conv->offset, OUTPUT_SIZE (conv), GST_PAD_CAPS(conv->srcpad), &outbuf); if (res != GST_FLOW_OK) break; GST_BUFFER_SIZE (outbuf) = OUTPUT_SIZE (conv); GST_BUFFER_OFFSET (outbuf) = conv->offset; GST_BUFFER_OFFSET_END (outbuf) = conv->offset + conv->step; GST_BUFFER_TIMESTAMP (outbuf) = conv->timestamp; GST_BUFFER_DURATION (outbuf) = gst_util_uint64_scale_int (GST_SECOND, conv->step, conv->rate); /* Do the Fourier transform */ memcpy (conv->fftw_in, conv->samples, conv->size * sizeof (double)); fftw_execute (conv->fftw_plan); { /* Normalize */ gint i; gfloat root = sqrtf (conv->size); for (i = 0; i < 2*(conv->size/2+1); ++i) conv->fftw_out[i] /= root; } memcpy (GST_BUFFER_DATA (outbuf), conv->fftw_out, OUTPUT_SIZE (conv)); res = gst_pad_push (conv->srcpad, outbuf); shift_samples (conv, conv->step); if (res != GST_FLOW_OK) break; } gst_object_unref (conv); return res; } clementine-1.2.0+dfsg/gst/moodbar/gstfftwspectrum.h000066400000000000000000000036741223327513400224300ustar00rootroot00000000000000/* GStreamer FFTW-based signal-to-spectrum converter * Copyright (C) 2006 Joseph Rabinoff */ /*************************************************************************** * * * 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 __GST_FFTWSPECTRUM_H__ #define __GST_FFTWSPECTRUM_H__ #include #include G_BEGIN_DECLS /* #defines don't like whitespacey bits */ #define GST_TYPE_FFTWSPECTRUM \ (gst_fftwspectrum_get_type()) #define GST_FFTWSPECTRUM(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_FFTWSPECTRUM,GstFFTWSpectrum)) #define GST_FFTWSPECTRUM_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_FFTWSPECTRUM,GstFFTWSpectrumClass)) typedef struct _GstFFTWSpectrum GstFFTWSpectrum; typedef struct _GstFFTWSpectrumClass GstFFTWSpectrumClass; struct _GstFFTWSpectrum { GstElement element; GstPad *sinkpad, *srcpad; /* Stream data */ gint rate, size, step; /* Actual queued (incoming) stream */ gdouble *samples; gint numsamples; GstClockTime timestamp; /* Timestamp of the first sample */ guint64 offset; /* Offset of the first sample */ /* State data for fftw */ double *fftw_in; double *fftw_out; fftw_plan fftw_plan; /* Properties */ gint32 def_size, def_step; gboolean hi_q; }; struct _GstFFTWSpectrumClass { GstElementClass parent_class; }; GType gst_fftwspectrum_get_type (void); G_END_DECLS #endif /* __GST_FFTWSPECTRUM_H__ */ clementine-1.2.0+dfsg/gst/moodbar/gstmoodbar.c000066400000000000000000000424031223327513400213060ustar00rootroot00000000000000/* GStreamer spectrum analysis toy * Copyright (C) 2006 Joseph Rabinoff * Some code copyright (C) 2005 Gav Wood */ /*************************************************************************** * * * 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. * * * ***************************************************************************/ /** * SECTION:element-moodbar * * * Example launch line * * * gst-launch filesrc location=test.mp3 ! mad ! audioconvert ! fftwspectrum ! moodbar height=50 ! pngenc ! filesink location=test.png * * * */ /* This plugin is based on the Moodbar code in Amarok version 1.4.0a, * written by Gav Wood. The algorithm is basically the same as the * one applied there, and the normalizing code below is taken directly * from Gav Wood's Exscalibar package. */ /* This plugin takes a frequency-domain stream, does some simple * analysis, and returns a string of (unsigned char) rgb triples * that represent the magnitude of various sections of the stream. * Since we have to perform some normalization, we queue up all * of our analysis until we get an EOS event, at which point we * normalize and do the output. If a max-width is specified, the * output is scaled down to the desired width if necessary. */ /* More precisely, the analysis performed is as follows: * (1) the spectrum is broken into 24 parts, called "bark bands" * (Gav's terminology), as given in bark_bands below * (2) we compute the size of the first 8 bark bands and store * that as the "red" component; similarly for blue and green * (3) after receiving an EOS, we normalize all of the analysis * done in (1) and (2) and return a stream of rgb triples * (application/x-raw-rgb) */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include "gstmoodbar.h" #include "spectrum.h" GST_DEBUG_CATEGORY (gst_moodbar_debug); #define GST_CAT_DEFAULT gst_moodbar_debug /* Filter signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; enum { ARG_0, ARG_HEIGHT, ARG_MAX_WIDTH }; static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ( SPECTRUM_FREQ_CAPS ) ); static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ( "video/x-raw-rgb, " "bpp = (int) 24, " "depth = (int) 24, " "height = (int) [ 1, MAX ], " "width = (int) [ 1, MAX ], " "framerate = (fraction) 0/1" ) ); GST_BOILERPLATE (GstMoodbar, gst_moodbar, GstElement, GST_TYPE_ELEMENT); static void gst_moodbar_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); static void gst_moodbar_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); static gboolean gst_moodbar_set_sink_caps (GstPad *pad, GstCaps *caps); static gboolean gst_moodbar_sink_event (GstPad *pad, GstEvent *event); static GstFlowReturn gst_moodbar_chain (GstPad *pad, GstBuffer *buf); static GstStateChangeReturn gst_moodbar_change_state (GstElement *element, GstStateChange transition); static void gst_moodbar_finish (GstMoodbar *mood); /* This is a failsafe so we don't eat up all of a computer's memory * if we hit an endless stream. */ #define MAX_TRIPLES (1024*1024*4) #define NUMFREQS(mood) ((mood)->size/2+1) /* Allocate mood->r, mood->g, and mood->b in chunks of this many */ #define FRAME_CHUNK 1000 /* Default height of the output image */ #define HEIGHT_DEFAULT 1 /* Default max-width of the output image, or 0 for no rescaling */ #define MAX_WIDTH_DEFAULT 0 /* We use this table to break up the incoming spectrum into segments */ static const guint bark_bands[24] = { 100, 200, 300, 400, 510, 630, 770, 920, 1080, 1270, 1480, 1720, 2000, 2320, 2700, 3150, 3700, 4400, 5300, 6400, 7700, 9500, 12000, 15500 }; /***************************************************************/ /* GObject boilerplate stuff */ /***************************************************************/ static void gst_moodbar_base_init (gpointer gclass) { static GstElementDetails element_details = { "Moodbar analyzer", "Filter/Converter/Moodbar", "Convert a spectrum into a stream of (uchar) rgb triples representing its \"mood\"", "Joe Rabinoff " }; GstElementClass *element_class = GST_ELEMENT_CLASS (gclass); gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&src_factory)); gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&sink_factory)); gst_element_class_set_details (element_class, &element_details); } /* initialize the plugin's class */ static void gst_moodbar_class_init (GstMoodbarClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gobject_class->set_property = gst_moodbar_set_property; gobject_class->get_property = gst_moodbar_get_property; g_object_class_install_property (gobject_class, ARG_HEIGHT, g_param_spec_int ("height", "Image height", "The height of the resulting raw image", 1, G_MAXINT32, HEIGHT_DEFAULT, G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, ARG_MAX_WIDTH, g_param_spec_int ("max-width", "Image maximum width", "The maximum width of the resulting raw image, or 0 for no rescaling", 0, G_MAXINT32, MAX_WIDTH_DEFAULT, G_PARAM_READWRITE)); gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_moodbar_change_state); } /* initialize the new element * instantiate pads and add them to element * set functions * initialize structure */ static void gst_moodbar_init (GstMoodbar *mood, GstMoodbarClass *gclass) { GstElementClass *klass = GST_ELEMENT_GET_CLASS (mood); mood->sinkpad = gst_pad_new_from_template (gst_element_class_get_pad_template (klass, "sink"), "sink"); gst_pad_set_setcaps_function (mood->sinkpad, GST_DEBUG_FUNCPTR (gst_moodbar_set_sink_caps)); gst_pad_set_event_function (mood->sinkpad, GST_DEBUG_FUNCPTR (gst_moodbar_sink_event)); gst_pad_set_chain_function (mood->sinkpad, GST_DEBUG_FUNCPTR (gst_moodbar_chain)); mood->srcpad = gst_pad_new_from_template (gst_element_class_get_pad_template (klass, "src"), "src"); gst_element_add_pad (GST_ELEMENT (mood), mood->sinkpad); gst_element_add_pad (GST_ELEMENT (mood), mood->srcpad); /* These are set once the (sink) capabilities are determined */ mood->rate = 0; mood->size = 0; mood->barkband_table = NULL; /* These are allocated when we change to PAUSED */ mood->r = NULL; mood->g = NULL; mood->b = NULL; mood->numframes = 0; /* Property */ mood->height = HEIGHT_DEFAULT; mood->max_width = MAX_WIDTH_DEFAULT; } static void gst_moodbar_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { GstMoodbar *mood = GST_MOODBAR (object); switch (prop_id) { case ARG_HEIGHT: mood->height = (guint) g_value_get_int (value); break; case ARG_MAX_WIDTH: mood->max_width = (guint) g_value_get_int (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_moodbar_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { GstMoodbar *mood = GST_MOODBAR (object); switch (prop_id) { case ARG_HEIGHT: g_value_set_int (value, (int) mood->height); break; case ARG_MAX_WIDTH: g_value_set_int (value, (int) mood->max_width); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } /***************************************************************/ /* Pad handling */ /***************************************************************/ /* This calculates a table that caches which bark band slot each * incoming band is supposed to go in. */ static void calc_barkband_table (GstMoodbar *mood) { guint i; guint barkband = 0; /* Avoid divide-by-zero */ if (!mood->size || !mood->rate) return; if (mood->barkband_table) g_free (mood->barkband_table); mood->barkband_table = g_malloc (NUMFREQS (mood) * sizeof (guint)); for (i = 0; i < NUMFREQS (mood); ++i) { if (barkband < 23 && (guint) GST_SPECTRUM_BAND_FREQ (i, mood->size, mood->rate) >= bark_bands[barkband]) barkband++; mood->barkband_table[i] = barkband; /* GST_LOG ("Band %d (frequency %f) -> barkband %d (frequency %d)", i, GST_SPECTRUM_BAND_FREQ (i, mood->size, mood->rate), barkband, bark_bands[barkband]); */ } } /* Setting the sink caps just gets the rate and size parameters. * Note that we do not support upstream caps renegotiation, since * we could only possibly scale the height anyway. */ static gboolean gst_moodbar_set_sink_caps (GstPad *pad, GstCaps *caps) { GstMoodbar *mood; GstStructure *newstruct; gint rate, size; gboolean res = FALSE; mood = GST_MOODBAR (gst_pad_get_parent (pad)); newstruct = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (newstruct, "rate", &rate) || !gst_structure_get_int (newstruct, "size", &size)) goto out; res = TRUE; mood->rate = rate; mood->size = (guint) size; calc_barkband_table (mood); out: gst_object_unref (mood); return res; } static gboolean gst_moodbar_sink_event (GstPad *pad, GstEvent *event) { GstMoodbar *mood; gboolean res = TRUE; mood = GST_MOODBAR (gst_pad_get_parent (pad)); if (GST_EVENT_TYPE (event) == GST_EVENT_EOS) gst_moodbar_finish (mood); res = gst_pad_push_event (mood->srcpad, event); gst_object_unref (mood); return res; } /***************************************************************/ /* Actual analysis */ /***************************************************************/ static GstStateChangeReturn gst_moodbar_change_state (GstElement *element, GstStateChange transition) { GstMoodbar *mood = GST_MOODBAR (element); GstStateChangeReturn res; switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: calc_barkband_table (mood); break; case GST_STATE_CHANGE_READY_TO_PAUSED: mood->r = (gdouble *) g_malloc (FRAME_CHUNK * sizeof(gdouble)); mood->g = (gdouble *) g_malloc (FRAME_CHUNK * sizeof(gdouble)); mood->b = (gdouble *) g_malloc (FRAME_CHUNK * sizeof(gdouble)); mood->numframes = 0; break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: break; default: break; } res = parent_class->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_READY: g_free (mood->r); g_free (mood->g); g_free (mood->b); mood->r = NULL; mood->g = NULL; mood->b = NULL; mood->numframes = 0; break; case GST_STATE_CHANGE_READY_TO_NULL: g_free (mood->barkband_table); mood->barkband_table = NULL; break; default: break; } return res; } /* We allocate r, g, b frames in chunks of FRAME_CHUNK so we don't * have to realloc every time a buffer comes in. */ static gboolean allocate_another_frame (GstMoodbar *mood) { mood->numframes++; /* Failsafe */ if (mood->numframes == MAX_TRIPLES) return FALSE; if(mood->numframes % FRAME_CHUNK == 0) { guint size = (mood->numframes + FRAME_CHUNK) * sizeof (gdouble); mood->r = (gdouble *) g_realloc (mood->r, size); mood->g = (gdouble *) g_realloc (mood->g, size); mood->b = (gdouble *) g_realloc (mood->b, size); if (mood->r == NULL || mood->g == NULL || mood->b == NULL) return FALSE; } return TRUE; } /* This function does most of the analysis on the spectra we * get as input and caches them. We actually push buffers * once we receive an EOS signal. */ static GstFlowReturn gst_moodbar_chain (GstPad *pad, GstBuffer *buf) { GstMoodbar *mood = GST_MOODBAR (gst_pad_get_parent (pad)); guint i; gdouble amplitudes[24], rgb[3] = {0.f, 0.f, 0.f}; gdouble *out, real, imag; guint numfreqs = NUMFREQS (mood); if (GST_BUFFER_SIZE (buf) != numfreqs * sizeof (gdouble) * 2) { gst_object_unref (mood); return GST_FLOW_ERROR; } out = (gdouble *) GST_BUFFER_DATA (buf); if (!allocate_another_frame (mood)) return GST_FLOW_ERROR; /* Calculate total amplitudes for the different bark bands */ for (i = 0; i < 24; ++i) amplitudes[i] = 0.f; for (i = 0; i < numfreqs; ++i) { real = out[2*i]; imag = out[2*i + 1]; amplitudes[mood->barkband_table[i]] += sqrtf (real*real + imag*imag); } /* Now divide the bark bands into thirds and compute their total * amplitudes */ for (i = 0; i < 24; ++i) rgb[i/8] += amplitudes[i] * amplitudes[i]; rgb[0] = sqrtf (rgb[0]); rgb[1] = sqrtf (rgb[1]); rgb[2] = sqrtf (rgb[2]); mood->r[mood->numframes] = rgb[0]; mood->g[mood->numframes] = rgb[1]; mood->b[mood->numframes] = rgb[2]; gst_buffer_unref (buf); gst_object_unref (mood); return GST_FLOW_OK; } /* The normalization code was copied from Gav Wood's Exscalibar * library, normalise.cpp */ static void normalize (gdouble *vals, guint numvals) { gdouble mini, maxi, tu = 0.f, tb = 0.f; gdouble avgu = 0.f, avgb = 0.f, delta, avg = 0.f; gdouble avguu = 0.f, avgbb = 0.f; guint i; gint t = 0; if (!numvals) return; mini = maxi = vals[0]; for (i = 1; i < numvals; i++) { if (vals[i] > maxi) maxi = vals[i]; else if (vals[i] < mini) mini = vals[i]; } for (i = 0; i < numvals; i++) { if(vals[i] != mini && vals[i] != maxi) { avg += vals[i] / ((gdouble) numvals); t++; } } for (i = 0; i < numvals; i++) { if (vals[i] != mini && vals[i] != maxi) { if (vals[i] > avg) { avgu += vals[i]; tu++; } else { avgb += vals[i]; tb++; } } } avgu /= (gdouble) tu; avgb /= (gdouble) tb; tu = 0.f; tb = 0.f; for (i = 0; i < numvals; i++) { if (vals[i] != mini && vals[i] != maxi) { if (vals[i] > avgu) { avguu += vals[i]; tu++; } else if (vals[i] < avgb) { avgbb += vals[i]; tb++; } } } avguu /= (gdouble) tu; avgbb /= (gdouble) tb; mini = MAX (avg + (avgb - avg) * 2.f, avgbb); maxi = MIN (avg + (avgu - avg) * 2.f, avguu); delta = maxi - mini; if (delta == 0.f) delta = 1.f; for (i = 0; i < numvals; i++) vals[i] = finite (vals[i]) ? MIN(1.f, MAX(0.f, (vals[i] - mini) / delta)) : 0.f; } /* This function normalizes all of the cached r,g,b data and * finally pushes a monster buffer with all of our output. */ static void gst_moodbar_finish (GstMoodbar *mood) { GstBuffer *buf; guchar *data; guint line; guint output_width; if (mood->max_width == 0 || mood->numframes <= mood->max_width) output_width = mood->numframes; else output_width = mood->max_width; normalize (mood->r, mood->numframes); normalize (mood->g, mood->numframes); normalize (mood->b, mood->numframes); buf = gst_buffer_new_and_alloc (output_width * mood->height * 3 * sizeof (guchar)); if (!buf) return; /* Don't set the timestamp, duration, etc. since it's irrelevant */ GST_BUFFER_OFFSET (buf) = 0; data = (guchar *) GST_BUFFER_DATA (buf); gdouble r, g, b; guint i, j, n; guint start, end; for (line = 0; line < mood->height; ++line) { for (i = 0; i < output_width; ++i) { r = 0.f; g = 0.f; b = 0.f; start = i * mood->numframes / output_width; end = (i + 1) * mood->numframes / output_width; if ( start == end ) end = start + 1; for( j = start; j < end; j++ ) { r += mood->r[j] * 255.f; g += mood->g[j] * 255.f; b += mood->b[j] * 255.f; } n = end - start; *(data++) = (guchar) (r / ((gdouble) n)); *(data++) = (guchar) (g / ((gdouble) n)); *(data++) = (guchar) (b / ((gdouble) n)); } } { /* Now we (finally) know the width of the image we're pushing */ GstCaps *caps = gst_caps_copy (gst_pad_get_caps (mood->srcpad)); gboolean res; gst_caps_set_simple (caps, "width", G_TYPE_INT, output_width, NULL); gst_caps_set_simple (caps, "height", G_TYPE_INT, mood->height, NULL); res = gst_pad_set_caps (mood->srcpad, caps); if (res) gst_buffer_set_caps (buf, caps); gst_caps_unref (caps); if (!res) return; } gst_pad_push (mood->srcpad, buf); } clementine-1.2.0+dfsg/gst/moodbar/gstmoodbar.h000066400000000000000000000032311223327513400213070ustar00rootroot00000000000000/* GStreamer spectrum analysis toy * Copyright (C) 2006 Joseph Rabinoff * Some code copyright (C) 2005 Gav Wood */ /*************************************************************************** * * * 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 __GST_MOODBAR_H__ #define __GST_MOODBAR_H__ #include G_BEGIN_DECLS /* #defines don't like whitespacey bits */ #define GST_TYPE_MOODBAR \ (gst_moodbar_get_type()) #define GST_MOODBAR(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MOODBAR,GstMoodbar)) #define GST_MOODBAR_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MOODBAR,GstMoodbarClass)) typedef struct _GstMoodbar GstMoodbar; typedef struct _GstMoodbarClass GstMoodbarClass; struct _GstMoodbar { GstElement element; GstPad *sinkpad, *srcpad; /* Stream data */ gint rate, size; /* Cached band -> bark band table */ guint *barkband_table; /* Queued moodbar data */ gdouble *r, *g, *b; guint numframes; /* Property */ guint height; guint max_width; }; struct _GstMoodbarClass { GstElementClass parent_class; }; GType gst_moodbar_get_type (void); G_END_DECLS #endif /* __GST_MOODBAR_H__ */ clementine-1.2.0+dfsg/gst/moodbar/spectrum.c000066400000000000000000000042021223327513400210020ustar00rootroot00000000000000/* GStreamer moodbar plugin globals * Copyright (C) 2006 Joseph Rabinoff */ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include #include "gstfftwspectrum.h" #include "gstmoodbar.h" #include "spectrum.h" /***************************************************************/ /* Plugin managing */ /***************************************************************/ GST_DEBUG_CATEGORY_EXTERN (gst_fftwspectrum_debug); GST_DEBUG_CATEGORY_EXTERN (gst_moodbar_debug); /* entry point to initialize the plug-in * initialize the plug-in itself * register the element factories and pad templates * register the features * * exchange the string 'plugin' with your elemnt name */ static gboolean plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "fftwspectrum", GST_RANK_NONE, GST_TYPE_FFTWSPECTRUM)) return FALSE; if (!gst_element_register (plugin, "moodbar", GST_RANK_NONE, GST_TYPE_MOODBAR)) return FALSE; GST_DEBUG_CATEGORY_INIT (gst_fftwspectrum_debug, "fftwspectrum", 0, "FFTW Sample-to-Spectrum Converter Plugin"); GST_DEBUG_CATEGORY_INIT (gst_moodbar_debug, "moodbar", 0, "Moodbar analyzer"); return TRUE; } void gstmoodbar_register_static() { gst_plugin_register_static( GST_VERSION_MAJOR, GST_VERSION_MINOR, "moodbar", "Frequency analyzer and converter plugin", plugin_init, "0.1.2", "GPL", "Moodbar", "Moodbar", "http://amarok.kde.org/wiki/Moodbar"); } clementine-1.2.0+dfsg/gst/moodbar/spectrum.h000066400000000000000000000047211223327513400210150ustar00rootroot00000000000000/* GStreamer moodbar plugin globals * Copyright (C) 2006 Joseph Rabinoff */ /*************************************************************************** * * * 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 __SPECTRUM_H__ #define __SPECTRUM_H__ /* Since fftwspectrum and fftwunspectrum are supposed to be * opposites, they'll be using the same caps: */ #define SPECTRUM_SIGNAL_CAPS "audio/x-raw-float, " \ "rate = (int) [ 1, MAX ], " \ "channels = (int) 1, " \ "endianness = (int) BYTE_ORDER, " \ "width = (int) 64, " \ "signed = (boolean) true" /* audio/x-spectrum-complex-float is an array of complex floats. A * complex float is just a pair (r, i) of a real float and an * imaginary float, each with the specified width. The properties * are as follows: * rate: the rate of the original signal * size: the number of signals processed to make the current buffer * step: the number of signals advanced after the current buffer * width: the size of the real & imaginary parts of the data * endianness: ditto * * Each audio/x-spectrum-complex-float buffer represents the Fourier * transform of size samples, and hence _must_ have exactly * floor(size/2) + 1 complex floats in it; in other words, its * buffer size must be (floor(size/2) + 1) * 2 * sizeof(gfloat) */ #define SPECTRUM_FREQ_CAPS "audio/x-spectrum-complex-float, " \ "rate = (int) [ 1, MAX ], " \ "endianness = (int) BYTE_ORDER, " \ "width = (int) 64, " \ "size = (int) [ 1, MAX ], " \ "step = (int) [ 1, MAX ]" /* Given a band number from a spectrum made from size audio * samples at the given rate, return the frequency that band * corresponds to. */ #define GST_SPECTRUM_BAND_FREQ(band, size, rate) \ (((gfloat)(band))*((gfloat)(rate))/((gfloat)(size))) #ifdef __cplusplus extern "C" { #endif void gstmoodbar_register_static(); #ifdef __cplusplus } #endif #endif /* __SPECTRUM_H__ */ clementine-1.2.0+dfsg/src/000077500000000000000000000000001223327513400153455ustar00rootroot00000000000000clementine-1.2.0+dfsg/src/CMakeLists.txt000066400000000000000000001204271223327513400201130ustar00rootroot00000000000000 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) 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_LIBINDICATE) link_directories(${INDICATEQT_LIBRARY_DIRS}) include_directories(${INDICATEQT_INCLUDE_DIRS}) endif(HAVE_LIBINDICATE) 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/sonogram.cpp analyzers/turbine.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/fht.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/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/discogscoverprovider.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/filesystemdevice.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/groovesharksearchprovider.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/cloudfileservice.cpp internet/digitallyimportedclient.cpp internet/digitallyimportedservicebase.cpp internet/digitallyimportedsettingspage.cpp internet/digitallyimportedurlhandler.cpp internet/geolocator.cpp internet/groovesharkradio.cpp internet/groovesharkservice.cpp internet/groovesharksettingspage.cpp internet/groovesharkurlhandler.cpp internet/icecastbackend.cpp internet/icecastfilterwidget.cpp internet/icecastmodel.cpp internet/icecastservice.cpp internet/internetmodel.cpp internet/internetplaylistitem.cpp internet/internetservice.cpp internet/internetview.cpp internet/internetviewcontainer.cpp internet/jamendodynamicplaylist.cpp internet/jamendoplaylistitem.cpp internet/jamendoservice.cpp internet/localredirectserver.cpp internet/magnatunedownloaddialog.cpp internet/magnatuneplaylistitem.cpp internet/magnatuneservice.cpp internet/magnatunesettingspage.cpp internet/magnatuneurlhandler.cpp internet/oauthenticator.cpp internet/savedradio.cpp internet/searchboxwidget.cpp internet/somafmservice.cpp internet/somafmurlhandler.cpp internet/soundcloudservice.cpp internet/spotifyserver.cpp internet/spotifyservice.cpp internet/spotifysettingspage.cpp internet/subsonicservice.cpp internet/subsonicsettingspage.cpp internet/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/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/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 podcasts/addpodcastbyurl.cpp podcasts/addpodcastdialog.cpp podcasts/addpodcastpage.cpp podcasts/fixedopmlpage.cpp podcasts/gpoddersearchpage.cpp podcasts/gpoddersync.cpp podcasts/gpoddertoptagsmodel.cpp podcasts/gpoddertoptagspage.cpp podcasts/itunessearchpage.cpp podcasts/podcast.cpp podcasts/podcastbackend.cpp podcasts/podcastdiscoverymodel.cpp podcasts/podcastdownloader.cpp podcasts/podcastepisode.cpp podcasts/podcastinfowidget.cpp podcasts/podcastservice.cpp podcasts/podcastservicemodel.cpp podcasts/podcastsettingspage.cpp podcasts/podcastparser.cpp podcasts/podcastupdater.cpp 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/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/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/discogscoverprovider.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/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/groovesharksearchprovider.h globalsearch/searchprovider.h globalsearch/simplesearchprovider.h globalsearch/soundcloudsearchprovider.h globalsearch/spotifysearchprovider.h globalsearch/suggestionwidget.h internet/cloudfileservice.h internet/digitallyimportedclient.h internet/digitallyimportedservicebase.h internet/digitallyimportedsettingspage.h internet/geolocator.h internet/groovesharkservice.h internet/groovesharksettingspage.h internet/groovesharkurlhandler.h internet/icecastbackend.h internet/icecastfilterwidget.h internet/icecastmodel.h internet/icecastservice.h internet/internetmimedata.h internet/internetmodel.h internet/internetservice.h internet/internetsongmimedata.h internet/internetview.h internet/internetviewcontainer.h internet/jamendodynamicplaylist.h internet/jamendoservice.h internet/localredirectserver.h internet/magnatunedownloaddialog.h internet/magnatuneservice.h internet/magnatunesettingspage.h internet/oauthenticator.h internet/savedradio.h internet/searchboxwidget.h internet/somafmservice.h internet/somafmurlhandler.h internet/soundcloudservice.h internet/spotifyserver.h internet/spotifyservice.h internet/spotifysettingspage.h internet/subsonicservice.h internet/subsonicsettingspage.h internet/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 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/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 podcasts/addpodcastbyurl.h podcasts/addpodcastdialog.h podcasts/addpodcastpage.h podcasts/fixedopmlpage.h podcasts/gpoddersearchpage.h podcasts/gpoddersync.h podcasts/gpoddertoptagsmodel.h podcasts/gpoddertoptagspage.h podcasts/itunessearchpage.h podcasts/podcastbackend.h podcasts/podcastdiscoverymodel.h podcasts/podcastdownloader.h podcasts/podcastinfowidget.h podcasts/podcastservice.h podcasts/podcastservicemodel.h podcasts/podcastsettingspage.h podcasts/podcastupdater.h 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/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 globalsearch/globalsearchsettingspage.ui globalsearch/globalsearchview.ui globalsearch/searchproviderstatuswidget.ui globalsearch/suggestionwidget.ui internet/digitallyimportedsettingspage.ui internet/groovesharksettingspage.ui internet/icecastfilterwidget.ui internet/internetviewcontainer.ui internet/magnatunedownloaddialog.ui internet/magnatunesettingspage.ui internet/searchboxwidget.ui internet/spotifysettingspage.ui internet/subsonicsettingspage.ui library/groupbydialog.ui library/libraryfilterwidget.ui library/librarysettingspage.ui library/libraryviewcontainer.ui playlist/dynamicplaylistcontrols.ui playlist/playlistcontainer.ui playlist/playlistlistcontainer.ui playlist/playlistsequence.ui playlist/queuemanager.ui podcasts/addpodcastbyurl.ui podcasts/addpodcastdialog.ui podcasts/gpoddersearchpage.ui podcasts/itunessearchpage.ui podcasts/podcastinfowidget.ui 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 globalsearch/lastfmsearchprovider.cpp internet/fixlastfm.cpp internet/lastfmcompat.cpp internet/lastfmservice.cpp internet/lastfmsettingspage.cpp internet/lastfmstationdialog.cpp internet/lastfmurlhandler.cpp songinfo/echonestsimilarartists.cpp songinfo/echonesttags.cpp songinfo/lastfmtrackinfoprovider.cpp songinfo/tagwidget.cpp HEADERS covers/lastfmcoverprovider.h internet/lastfmservice.h internet/lastfmsettingspage.h internet/lastfmstationdialog.h songinfo/echonestsimilarartists.h songinfo/echonesttags.h songinfo/lastfmtrackinfoprovider.h songinfo/tagwidget.h UI internet/lastfmsettingspage.ui internet/lastfmstationdialog.ui ) optional_source(HAVE_SPOTIFY_DOWNLOADER SOURCES internet/spotifyblobdownloader.cpp HEADERS internet/spotifyblobdownloader.h INCLUDE_DIRECTORIES ${QCA_INCLUDE_DIRS} ) # Platform specific - OS X optional_source(APPLE INCLUDE_DIRECTORIES ${GROWL}/Headers ${CMAKE_CURRENT_SOURCE_DIR}/../3rdparty/google-breakpad/client/mac/build/Release/Breakpad.framework SOURCES core/macfslistener.mm core/macglobalshortcutbackend.mm core/mac_startup.mm core/scoped_nsautorelease_pool.mm devices/macdevicelister.mm 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 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) # Hack to get it to generate interfaces without namespaces - required # because otherwise org::freedesktop::UDisks and # org::freedesktop::UDisks::Device conflict. list(APPEND QT_DBUSXML2CPP_EXECUTABLE -N) # 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) 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 HEADERS devices/cddadevice.h devices/cddalister.h ) # 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/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/googledriveclient.cpp internet/googledriveservice.cpp internet/googledrivesettingspage.cpp internet/googledriveurlhandler.cpp HEADERS internet/googledriveclient.h internet/googledriveservice.h internet/googledrivesettingspage.h internet/googledriveurlhandler.h UI internet/googledrivesettingspage.ui ) # Ubuntu One file support optional_source(HAVE_UBUNTU_ONE SOURCES internet/ubuntuoneauthenticator.cpp internet/ubuntuoneservice.cpp internet/ubuntuonesettingspage.cpp internet/ubuntuoneurlhandler.cpp HEADERS internet/ubuntuoneauthenticator.h internet/ubuntuoneservice.h internet/ubuntuonesettingspage.h internet/ubuntuoneurlhandler.h UI internet/ubuntuonesettingspage.ui ) # Dropbox support optional_source(HAVE_DROPBOX SOURCES internet/dropboxauthenticator.cpp internet/dropboxservice.cpp internet/dropboxsettingspage.cpp internet/dropboxurlhandler.cpp HEADERS internet/dropboxauthenticator.h internet/dropboxservice.h internet/dropboxsettingspage.h internet/dropboxurlhandler.h UI internet/dropboxsettingspage.ui ) # Skydrive support optional_source(HAVE_SKYDRIVE SOURCES internet/skydriveservice.cpp internet/skydriveurlhandler.cpp HEADERS internet/skydriveservice.h internet/skydriveurlhandler.h ) # Box support optional_source(HAVE_BOX SOURCES internet/boxservice.cpp internet/boxsettingspage.cpp internet/boxurlhandler.cpp HEADERS internet/boxservice.h internet/boxsettingspage.h internet/boxurlhandler.h UI internet/boxsettingspage.ui ) # 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} ${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} z Qocoa ) 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}) target_link_libraries(clementine_lib ${GSTREAMER_CDDA_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_LIBINDICATE) target_link_libraries(clementine_lib ${INDICATEQT_LIBRARIES}) endif(HAVE_LIBINDICATE) 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 ${QCA_LIBRARIES} ) link_directories(${QCA_LIBRARY_DIRS}) endif(HAVE_SPOTIFY_DOWNLOADER) if (APPLE) target_link_libraries(clementine_lib ${GROWL} /System/Library/Frameworks/AppKit.framework /System/Library/Frameworks/Carbon.framework /System/Library/Frameworks/DiskArbitration.framework /System/Library/Frameworks/Foundation.framework /System/Library/Frameworks/IOKit.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) # Link against the qsqlite plugin on windows and mac if(HAVE_STATIC_SQLITE) set(3RDPARTY_SQLITE_LIBRARY qsqlite) target_link_libraries(clementine_lib qsqlite) endif(HAVE_STATIC_SQLITE) if (WIN32) target_link_libraries(clementine_lib ${ZLIB_LIBRARIES} ${QTSPARKLE_LIBRARIES} tinysvcmdns qtwin ) 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(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) install(DIRECTORY "${GROWL}/Versions/Current/Resources" DESTINATION "${CMAKE_BINARY_DIR}/clementine.app/Contents/Frameworks/Growl.framework") 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 codesign -s ${APPLE_DEVELOPER_ID} -fv ${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.0+dfsg/src/analyzers/000077500000000000000000000000001223327513400173555ustar00rootroot00000000000000clementine-1.2.0+dfsg/src/analyzers/COPYING000066400000000000000000000431131223327513400204120ustar00rootroot00000000000000 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.0+dfsg/src/analyzers/analyzer.cpp000066400000000000000000000006331223327513400217100ustar00rootroot00000000000000#include "analyzer.h" #include "engines/enginebase.h" AnalyzerBase::AnalyzerBase(QWidget* parent) : QGLWidget(parent), engine_(NULL) { } 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.0+dfsg/src/analyzers/analyzerbase.cpp000066400000000000000000000141471223327513400225500ustar00rootroot00000000000000/*************************************************************************** viswidget.cpp - description ------------------- begin : Die Jan 7 2003 copyright : (C) 2003 by Max Howell email : markey@web.de ***************************************************************************/ /*************************************************************************** * * * 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 "analyzerbase.h" #include //interpolate() #include //event() #include #include #include #include "engines/enginebase.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 make an INSTRUCTIONS file //can't mod scope in analyze you have to use transform //TODO 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 Analyzer::Base::Base( QWidget *parent, uint scopeSize ) : QWidget( parent ) , m_timeout( 40 ) // msec , m_fht( new FHT(scopeSize) ) , m_engine(NULL) , m_lastScope(512) , new_frame_(false) , is_playing_(false) { } void Analyzer::Base::hideEvent(QHideEvent *) { m_timer.stop(); } void Analyzer::Base::showEvent(QShowEvent *) { m_timer.start(timeout(), this); } void Analyzer::Base::transform( Scope &scope ) //virtual { //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( m_fht->size() ); float *front = static_cast( &scope.front() ); float* f = new float[ m_fht->size() ]; m_fht->copy( &f[0], front ); m_fht->logSpectrum( front, &f[0] ); m_fht->scale( front, 1.0 / 20 ); scope.resize( m_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( m_engine->state() ) { case Engine::Playing: { const Engine::Scope &thescope = m_engine->scope(); int i = 0; // convert to mono here - our built in analyzers need mono, but we the engines provide interleaved pcm for( uint x = 0; (int)x < m_fht->size(); ++x ) { m_lastScope[x] = double(thescope[i] + thescope[i+1]) / (2*(1<<15)); i += 2; } is_playing_ = true; transform( m_lastScope ); analyze( p, m_lastScope, new_frame_ ); //scope.resize( m_fht->size() ); break; } case Engine::Paused: is_playing_ = false; analyze(p, m_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 != m_fht->sizeExp() ) { delete m_fht; m_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 m_fht->size() / 2; } void Analyzer::Base::demo(QPainter& p) //virtual { 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 = double(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::polishEvent() { init(); //virtual } void Analyzer::interpolate( const Scope &inVec, Scope &outVec ) //static { double pos = 0.0; const double step = (double)inVec.size() / outVec.size(); for ( uint i = 0; i < outVec.size(); ++i, pos += step ) { const double error = pos - std::floor( pos ); const unsigned long offset = (unsigned long)pos; unsigned long indexLeft = offset + 0; if ( indexLeft >= inVec.size() ) indexLeft = inVec.size() - 1; unsigned long 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 ) //static { 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() != m_timer.timerId()) return; new_frame_ = true; update(); } clementine-1.2.0+dfsg/src/analyzers/analyzerbase.h000066400000000000000000000037631223327513400222170ustar00rootroot00000000000000// Maintainer: Max Howell , (C) 2004 // Copyright: See COPYING file that comes with this distribution #ifndef ANALYZERBASE_H #define ANALYZERBASE_H #ifdef __FreeBSD__ #include #endif #include "core/fht.h" //stack allocated and convenience #include "engines/engine_fwd.h" #include //stack allocated and convenience #include //stack allocated #include //baseclass #include //included for convenience #include //baseclass #ifdef Q_WS_MACX #include //included for convenience #include //included for convenience #else #include //included for convenience #include //included for convenience #endif class QEvent; class QPaintEvent; class QResizeEvent; namespace Analyzer { typedef std::vector Scope; class Base : public QWidget { Q_OBJECT public: ~Base() { delete m_fht; } uint timeout() const { return m_timeout; } void set_engine(EngineBase* engine) { m_engine = engine; } void changeTimeout( uint newTimeout ) { m_timeout = newTimeout; if (m_timer.isActive()) { m_timer.stop(); m_timer.start(m_timeout, this); } } protected: 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 ); virtual void init() {} virtual void transform( Scope& ); virtual void analyze( QPainter& p, const Scope&, bool new_frame) = 0; virtual void demo(QPainter& p); protected: QBasicTimer m_timer; uint m_timeout; FHT *m_fht; EngineBase* m_engine; Scope m_lastScope; bool new_frame_; bool is_playing_; }; void interpolate( const Scope&, Scope& ); void initSin( Scope&, const uint = 6000 ); } //END namespace Analyzer using Analyzer::Scope; #endif clementine-1.2.0+dfsg/src/analyzers/analyzercontainer.cpp000066400000000000000000000157351223327513400236240ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "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_(NULL), double_click_timer_(new QTimer(this)), ignore_next_click_(false), current_analyzer_(NULL), engine_(NULL) { 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(); 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(); // 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_ = NULL; Save(); } 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_); 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); } SaveFramerate(new_framerate); } void AnalyzerContainer::Load() { QSettings s; s.beginGroup(kSettingsGroup); // Analyzer QString type = s.value("type", "BlockAnalyzer").toString(); if (type.isEmpty()) { DisableAnalyzer(); disable_action_->setChecked(true); } else { for (int i=0 ; iclassName()) { ChangeAnalyzer(i); actions_[i]->setChecked(true); break; } } } // Framerate current_framerate_ = s.value(kSettingsFramerate, kMediumFramerate).toInt(); for (int i=0 ; iactions()[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::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.0+dfsg/src/analyzers/analyzercontainer.h000066400000000000000000000052341223327513400232620ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef ANALYZERCONTAINER_H #define ANALYZERCONTAINER_H #include #include #include #include "analyzerbase.h" #include "engines/engine_fwd.h" class AnalyzerContainer : public QWidget { Q_OBJECT public: 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(); 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); 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* visualisation_action_; QTimer* double_click_timer_; QPoint last_click_pos_; bool ignore_next_click_; 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 clementine-1.2.0+dfsg/src/analyzers/baranalyzer.cpp000066400000000000000000000124761223327513400224050ustar00rootroot00000000000000// // // C++ Implementation: $MODULE$ // // Description: // // // Author: Mark Kretschmann , (C) 2003 // // Copyright: See COPYING file that comes with this distribution // // #include "baranalyzer.h" #include //log10(), etc. #include #include const char* BarAnalyzer::kName = QT_TRANSLATE_NOOP("AnalyzerContainer", "Bar analyzer"); BarAnalyzer::BarAnalyzer( QWidget *parent ) : Analyzer::Base( parent, 8 ) //, m_bands( BAND_COUNT ) //, barVector( BAND_COUNT, 0 ) //, roofVector( BAND_COUNT, 50 ) //, roofVelocityVector( BAND_COUNT, ROOF_VELOCITY_REDUCTION_FACTOR ) { //roof pixmaps don't depend on size() so we do in the ctor m_bg = parent->palette().color(QPalette::Background); QColor fg( 0xff, 0x50, 0x70 ); double dr = double(m_bg.red() - fg.red()) / (NUM_ROOFS-1); //-1 because we start loop below at 0 double dg = double(m_bg.green() - fg.green()) / (NUM_ROOFS-1); double db = double(m_bg.blue() - fg.blue()) / (NUM_ROOFS-1); for ( uint i = 0; i < NUM_ROOFS; ++i ) { m_pixRoof[i] = QPixmap( COLUMN_WIDTH, 1 ); m_pixRoof[i].fill( QColor( fg.red()+int(dr*i), fg.green()+int(dg*i), fg.blue()+int(db*i) ) ); } } void BarAnalyzer::resizeEvent( QResizeEvent * e ) { init(); } // METHODS ===================================================== void BarAnalyzer::init() { const double MAX_AMPLITUDE = 1.0; const double F = double(height() - 2) / (log10( 255 ) * MAX_AMPLITUDE ); BAND_COUNT = width() / 5; MAX_DOWN = int(0 -(qMax(1, height() / 50))); MAX_UP = int(qMax(1, height() / 25)); barVector.resize( BAND_COUNT, 0 ); roofVector.resize( BAND_COUNT, height() -5 ); roofVelocityVector.resize( BAND_COUNT, ROOF_VELOCITY_REDUCTION_FACTOR ); m_roofMem.resize(BAND_COUNT); m_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 ) { m_lvlMapper[x] = uint( F * log10( x+1 ) ); } m_pixBarGradient = QPixmap( height()*COLUMN_WIDTH, height() ); m_pixCompose = QPixmap( size() ); QPainter p( &m_pixBarGradient ); for ( int x=0, r=0x40, g=0x30, b=0xff, r2=255-r; x < height(); ++x ) { for ( int y = x; y > 0; --y ) { const double fraction = (double)y / height(); // p.setPen( QColor( r + (int)(r2 * fraction), g, b - (int)(255 * fraction) ) ); p.setPen( QColor( r + (int)(r2 * fraction), g, b ) ); p.drawLine( x*COLUMN_WIDTH, height() - y, (x+1)*COLUMN_WIDTH, height() - y ); } } setMinimumSize( QSize( BAND_COUNT * COLUMN_WIDTH, 10 ) ); } void BarAnalyzer::analyze( QPainter& p, const Scope &s, bool new_frame) { //Analyzer::interpolate( s, m_bands ); Scope &v = m_scope; Analyzer::interpolate( s, v ); for ( uint i = 0, x = 0, y2; i < v.size(); ++i, x+=COLUMN_WIDTH+1 ) { //assign pre[log10]'d value y2 = uint(v[i] * 256); //256 will be optimised to a bitshift //no, it's a float y2 = m_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 ( (int)y2 > roofVector[i] ) { roofVector[i] = (int)y2; roofVelocityVector[i] = 1; } //remember where we are barVector[i] = y2; if ( m_roofMem[i].size() > NUM_ROOFS ) m_roofMem[i].erase( m_roofMem[i].begin() ); //blt last n roofs, a.k.a motion blur for ( uint c = 0; c < m_roofMem[i].size(); ++c ) //bitBlt( m_pComposePixmap, x, m_roofMem[i]->at( c ), m_roofPixmaps[ c ] ); //bitBlt( canvas(), x, m_roofMem[i][c], &m_pixRoof[ NUM_ROOFS - 1 - c ] ); p.drawPixmap(x, m_roofMem[i][c], m_pixRoof[ NUM_ROOFS - 1 - c ]); //blt the bar p.drawPixmap(x, height() - y2, *gradient(), y2 * COLUMN_WIDTH, height() - y2, COLUMN_WIDTH, y2); /*bitBlt( canvas(), x, height() - y2, gradient(), y2 * COLUMN_WIDTH, height() - y2, COLUMN_WIDTH, y2, Qt::CopyROP );*/ m_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]; } } } clementine-1.2.0+dfsg/src/analyzers/baranalyzer.h000066400000000000000000000033341223327513400220430ustar00rootroot00000000000000// Maintainer: Max Howell // Authors: Mark Kretschmann & Max Howell (C) 2003-4 // Copyright: See COPYING file that comes with this distribution // #ifndef BARANALYZER_H #define 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 Scope&, bool new_frame); //virtual void transform( Scope& ); /** * Resizes the widget to a new geometry according to @p e * @param e The resize-event */ void resizeEvent( QResizeEvent * e); uint BAND_COUNT; int MAX_DOWN; int MAX_UP; static const uint ROOF_HOLD_TIME = 48; static const int ROOF_VELOCITY_REDUCTION_FACTOR = 32; static const uint NUM_ROOFS = 16; static const uint COLUMN_WIDTH = 4; static const char* kName; protected: QPixmap m_pixRoof[NUM_ROOFS]; //vector m_roofMem[BAND_COUNT]; //Scope m_bands; //copy of the Scope to prevent creating/destroying a Scope every iteration uint m_lvlMapper[256]; std::vector m_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 &m_pixBarGradient; } private: QPixmap m_pixBarGradient; QPixmap m_pixCompose; Scope m_scope; //so we don't create a vector every frame QColor m_bg; }; #endif clementine-1.2.0+dfsg/src/analyzers/blockanalyzer.cpp000066400000000000000000000274121223327513400227270ustar00rootroot00000000000000// Author: Max Howell , (C) 2003-5 // Mark Kretschmann , (C) 2005 // Copyright: See COPYING file that comes with this distribution // #include "blockanalyzer.h" #include #include #include #include #include const uint BlockAnalyzer::HEIGHT = 2; const uint BlockAnalyzer::WIDTH = 4; const uint BlockAnalyzer::MIN_ROWS = 3; //arbituary const uint BlockAnalyzer::MIN_COLUMNS = 32; //arbituary const uint BlockAnalyzer::MAX_COLUMNS = 256; //must be 2**n const uint BlockAnalyzer::FADE_SIZE = 90; const char* BlockAnalyzer::kName = QT_TRANSLATE_NOOP("AnalyzerContainer", "Block analyzer"); BlockAnalyzer::BlockAnalyzer( QWidget *parent ) : Analyzer::Base( parent, 9 ) , m_columns( 0 ) //uint , m_rows( 0 ) //uint , m_y( 0 ) //uint , m_barPixmap( 1, 1 ) //null qpixmaps cause crashes , m_topBarPixmap( WIDTH, HEIGHT ) , m_scope( MIN_COLUMNS ) //Scope , m_store( 1 << 8, 0 ) //vector , m_fade_bars( FADE_SIZE ) //vector , m_fade_pos( 1 << 8, 50 ) //vector , m_fade_intensity( 1 << 8, 32 ) //vector { setMinimumSize( MIN_COLUMNS*(WIDTH+1) -1, MIN_ROWS*(HEIGHT+1) -1 ); //-1 is padding, no drawing takes place there setMaximumWidth( MAX_COLUMNS*(WIDTH+1) -1 ); // mxcl says null pixmaps cause crashes, so let's play it safe for ( uint i = 0; i < FADE_SIZE; ++i ) m_fade_bars[i] = QPixmap( 1, 1 ); } BlockAnalyzer::~BlockAnalyzer() { } void BlockAnalyzer::resizeEvent( QResizeEvent *e ) { QWidget::resizeEvent( e ); m_background = QPixmap(size()); const uint oldRows = m_rows; //all is explained in analyze().. //+1 to counter -1 in maxSizes, trust me we need this! m_columns = qMax( uint(double(width()+1) / (WIDTH+1)), MAX_COLUMNS ); m_rows = uint(double(height()+1) / (HEIGHT+1)); //this is the y-offset for drawing from the top of the widget m_y = (height() - (m_rows * (HEIGHT+1)) + 2) / 2; m_scope.resize( m_columns ); if( m_rows != oldRows ) { m_barPixmap = QPixmap( WIDTH, m_rows*(HEIGHT+1) ); for ( uint i = 0; i < FADE_SIZE; ++i ) m_fade_bars[i] = QPixmap( WIDTH, m_rows*(HEIGHT+1) ); m_yscale.resize( m_rows + 1 ); const uint PRE = 1, PRO = 1; //PRE and PRO allow us to restrict the range somewhat for( uint z = 0; z < m_rows; ++z ) m_yscale[z] = 1 - (log10( PRE+z ) / log10( PRE+m_rows+PRO )); m_yscale[m_rows] = 0; determineStep(); paletteChange( palette() ); } 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 const double fallTime = 30 * m_rows; m_step = double(m_rows * timeout()) / fallTime; } void BlockAnalyzer::transform( Analyzer::Scope &s ) //pure virtual { for( uint x = 0; x < s.size(); ++x ) s[x] *= 2; float *front = static_cast( &s.front() ); m_fht->spectrum( front ); m_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 m_scope.size() if large we prevent interpolation of large analyzers, this is good! s.resize( m_scope.size() <= MAX_COLUMNS/2 ? MAX_COLUMNS/2 : m_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 // m_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 Analyzer::interpolate( s, m_scope ); // Paint the background p.drawPixmap(0, 0, m_background); for( uint y, x = 0; x < m_scope.size(); ++x ) { // determine y for( y = 0; m_scope[x] < m_yscale[y]; ++y ) ; // this is opposite to what you'd think, higher than y // means the bar is lower than y (physically) if( (float)y > m_store[x] ) y = int(m_store[x] += m_step); else m_store[x] = y; // if y is lower than m_fade_pos, then the bar has exceeded the height of the fadeout // if the fadeout is quite faded now, then display the new one if( y <= m_fade_pos[x] /*|| m_fade_intensity[x] < FADE_SIZE / 3*/ ) { m_fade_pos[x] = y; m_fade_intensity[x] = FADE_SIZE; } if( m_fade_intensity[x] > 0 ) { const uint offset = --m_fade_intensity[x]; const uint y = m_y + (m_fade_pos[x] * (HEIGHT+1)); p.drawPixmap(x*(WIDTH+1), y, m_fade_bars[offset], 0, 0, WIDTH, height() - y); } if( m_fade_intensity[x] == 0 ) m_fade_pos[x] = m_rows; //REMEMBER: y is a number from 0 to m_rows, 0 means all blocks are glowing, m_rows means none are p.drawPixmap( x*(WIDTH+1), y*(HEIGHT+1) + m_y, *bar(), 0, y*(HEIGHT+1), bar()->width(), bar()->height() ); } for( uint x = 0; x < m_store.size(); ++x ) p.drawPixmap(x*(WIDTH+1), int(m_store[x])*(HEIGHT+1) + m_y, m_topBarPixmap ); } 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; } } } /** * 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: OutputOnExit( const QColor &color ) : c( color ) {} ~OutputOnExit() { int h,s,v; c.getHsv( &h, &s, &v ); } private: const QColor &c; }; // hack so I don't have to cast everywhere #define amount static_cast(_amount) // #define STAMP debug() << (QValueList() << fh << fs << fv) << endl; // #define STAMP1( string ) debug() << string << ": " << (QValueList() << fh << fs << fv) << endl; // #define STAMP2( string, value ) debug() << string << "=" << value << ": " << (QValueList() << fh << fs << fv) << endl; 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 ); // STAMP2( "DV", dv ); // value is the best measure of contrast // if there is enough difference in value already, return fg unchanged if( dv > amount ) return fg; int ds = abs( bs - fs ); // STAMP2( "DS", ds ); // saturation is good enough too. But not as good. TODO adapt this a little if( ds > amount ) return fg; int dh = abs( bh - fh ); // STAMP2( "DH", dh ); 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 > amount / 2 && (bs > 125 && fs > 125) ) // STAMP1( "Sufficient saturation difference, and hues are compliemtary" ); return fg; else if( dv > amount / 2 && (bv > 125 && fv > 125) ) // STAMP1( "Sufficient value difference, and hues are compliemtary" ); return fg; // STAMP1( "Hues are complimentary but we must modify the value or saturation of the contrasting colour" ); //but either the colours are two desaturated, or too dark //so we need to adjust the system, although not as much ///_amount /= 2; } if( fs < 50 && ds < 40 ) { // low saturation on a low saturation is sad const int tmp = 50 - fs; fs = 50; if( amount > tmp ) _amount -= tmp; else _amount = 0; } // test that there is available value to honor our contrast requirement if( 255 - dv < amount ) { // we have to modify the value and saturation of fg //adjustToLimits( bv, fv, amount ); // STAMP // see if we need to adjust the saturation if( amount > 0 ) adjustToLimits( bs, fs, _amount ); // STAMP // see if we need to adjust the hue if( amount > 0 ) fh += amount; // cycles around; // STAMP return QColor::fromHsv(fh, fs, fv); } // STAMP if( fv > bv && bv > amount ) return QColor::fromHsv( fh, fs, bv - amount); // STAMP if( fv < bv && fv > amount ) return QColor::fromHsv( fh, fs, fv - amount); // STAMP if( fv > bv && (255 - fv > amount) ) return QColor::fromHsv( fh, fs, fv + amount); // STAMP if( fv < bv && (255 - bv > amount ) ) return QColor::fromHsv( fh, fs, bv + amount); // STAMP // debug() << "Something went wrong!\n"; return Qt::blue; #undef amount // #undef STAMP } void BlockAnalyzer::paletteChange( const QPalette& ) //virtual { const QColor bg = palette().color(QPalette::Background); const QColor fg = ensureContrast( bg, palette().color(QPalette::Highlight) ); m_topBarPixmap.fill( fg ); const double dr = 15*double(bg.red() - fg.red()) / (m_rows*16); const double dg = 15*double(bg.green() - fg.green()) / (m_rows*16); const double db = 15*double(bg.blue() - fg.blue()) / (m_rows*16); const int r = fg.red(), g = fg.green(), b = fg.blue(); bar()->fill( bg ); QPainter p( bar() ); for( int y = 0; (uint)y < m_rows; ++y ) //graduate the fg color p.fillRect( 0, y*(HEIGHT+1), WIDTH, HEIGHT, QColor( r+int(dr*y), g+int(dg*y), b+int(db*y) ) ); { const QColor bg = palette().color(QPalette::Background).dark( 112 ); //make a complimentary fadebar colour //TODO 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 < FADE_SIZE; ++y ) { m_fade_bars[y].fill( palette().color(QPalette::Background) ); QPainter f( &m_fade_bars[y] ); for( int z = 0; (uint)z < m_rows; ++z ) { const double Y = 1.0 - (log10( FADE_SIZE - y ) / log10( FADE_SIZE )); f.fillRect( 0, z*(HEIGHT+1), WIDTH, HEIGHT, QColor( r+int(dr*Y), g+int(dg*Y), b+int(db*Y) ) ); } } } drawBackground(); } void BlockAnalyzer::drawBackground() { const QColor bg = palette().color(QPalette::Background); const QColor bgdark = bg.dark( 112 ); m_background.fill( bg ); QPainter p( &m_background ); for( int x = 0; (uint)x < m_columns; ++x ) for( int y = 0; (uint)y < m_rows; ++y ) p.fillRect( x*(WIDTH+1), y*(HEIGHT+1) + m_y, WIDTH, HEIGHT, bgdark ); } clementine-1.2.0+dfsg/src/analyzers/blockanalyzer.h000066400000000000000000000031051223327513400223650ustar00rootroot00000000000000// Maintainer: Max Howell , (C) 2003-5 // Copyright: See COPYING file that comes with this distribution // #ifndef BLOCKANALYZER_H #define BLOCKANALYZER_H #include "analyzerbase.h" #include class QResizeEvent; class QMouseEvent; class QPalette; /** * @author Max Howell */ class BlockAnalyzer : public Analyzer::Base { Q_OBJECT public: Q_INVOKABLE BlockAnalyzer( QWidget* ); ~BlockAnalyzer(); static const uint HEIGHT; static const uint WIDTH; static const uint MIN_ROWS; static const uint MIN_COLUMNS; static const uint MAX_COLUMNS; static const uint FADE_SIZE; static const char* kName; protected: virtual void transform( Scope& ); virtual void analyze( QPainter& p, const Scope&, bool new_frame); virtual void resizeEvent( QResizeEvent* ); virtual void paletteChange( const QPalette& ); void drawBackground(); void determineStep(); private: QPixmap* bar() { return &m_barPixmap; } uint m_columns, m_rows; //number of rows and columns of blocks uint m_y; //y-offset from top of widget QPixmap m_barPixmap; QPixmap m_topBarPixmap; QPixmap m_background; Scope m_scope; //so we don't create a vector every frame std::vector m_store; //current bar heights std::vector m_yscale; //FIXME why can't I namespace these? c++ issue? std::vector m_fade_bars; std::vector m_fade_pos; std::vector m_fade_intensity; float m_step; //rows to fall per frame }; #endif clementine-1.2.0+dfsg/src/analyzers/boomanalyzer.cpp000066400000000000000000000065741223327513400225770ustar00rootroot00000000000000// Author: Max Howell , (C) 2004 // Copyright: See COPYING file that comes with this distribution #include "boomanalyzer.h" #include #include const char* BoomAnalyzer::kName = QT_TRANSLATE_NOOP("AnalyzerContainer", "Boom analyzer"); BoomAnalyzer::BoomAnalyzer( QWidget *parent ) : Analyzer::Base( parent, 9 ) , K_barHeight( 1.271 )//1.471 , F_peakSpeed( 1.103 )//1.122 , F( 1.0 ) , bar_height( BAND_COUNT, 0 ) , peak_height( BAND_COUNT, 0 ) , peak_speed( BAND_COUNT, 0.01 ) , barPixmap( COLUMN_WIDTH, 50 ) { } void BoomAnalyzer::changeK_barHeight( int newValue ) { K_barHeight = (double)newValue / 1000; } void BoomAnalyzer::changeF_peakSpeed( int newValue ) { F_peakSpeed = (double)newValue / 1000; } void BoomAnalyzer::resizeEvent(QResizeEvent *) { init(); } void BoomAnalyzer::init() { const uint HEIGHT = height() - 2; const double h = 1.2 / HEIGHT; F = double(HEIGHT) / (log10( 256 ) * 1.1 /*<- max. amplitude*/); barPixmap = QPixmap( COLUMN_WIDTH-2, HEIGHT ); QPainter p( &barPixmap ); for( uint y = 0; y < HEIGHT; ++y ) { const double F = (double)y * h; p.setPen(QColor( qMax(0, 255 - int(229.0 * F)), qMax(0, 255 - int(229.0 * F)), qMax(0, 255 - int(191.0 * F)))); p.drawLine( 0, y, COLUMN_WIDTH-2, y ); } } void BoomAnalyzer::transform( Scope &s ) { float *front = static_cast( &s.front() ); m_fht->spectrum( front ); m_fht->scale( front, 1.0 / 60 ); Scope scope( 32, 0 ); const uint xscale[] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,19,24,29,36,43,52,63,76,91,108,129,153,182,216,255 }; for( uint j, i = 0; i < 32; i++ ) for( j = xscale[i]; j < xscale[i + 1]; j++ ) if ( s[j] > scope[i] ) scope[i] = s[j]; s = scope; } void BoomAnalyzer::analyze( QPainter& p, const Scope& scope, bool new_frame) { float h; const uint MAX_HEIGHT = height() - 1; for( uint i = 0, x = 0, y; i < BAND_COUNT; ++i, x += COLUMN_WIDTH+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]); p.drawPixmap(x+1, y, barPixmap, 0, y, -1, -1); p.setPen( palette().color(QPalette::Highlight) ); if (bar_height[i] > 0) p.drawRect( x, y, COLUMN_WIDTH - 1, height() - y - 1 ); y = height() - uint(peak_height[i]); p.setPen( palette().color(QPalette::Base) ); p.drawLine( x, y, x+COLUMN_WIDTH-1, y ); } } clementine-1.2.0+dfsg/src/analyzers/boomanalyzer.h000066400000000000000000000016061223327513400222330ustar00rootroot00000000000000// Author: Max Howell , (C) 2004 // Copyright: See COPYING file that comes with this distribution // #ifndef BOOMANALYZER_H #define BOOMANALYZER_H #include "analyzerbase.h" /** @author Max Howell */ class BoomAnalyzer : public Analyzer::Base { Q_OBJECT public: Q_INVOKABLE BoomAnalyzer( QWidget* ); static const char* kName; virtual void init(); virtual void transform( Scope &s ); virtual void analyze( QPainter& p, const Scope&, bool new_frame); public slots: void changeK_barHeight( int ); void changeF_peakSpeed( int ); protected: void resizeEvent( QResizeEvent * e); static const uint COLUMN_WIDTH = 4; static const uint BAND_COUNT = 32; double K_barHeight, F_peakSpeed, F; std::vector bar_height; std::vector peak_height; std::vector peak_speed; QPixmap barPixmap; }; #endif clementine-1.2.0+dfsg/src/analyzers/glanalyzer.cpp000066400000000000000000000176011223327513400222360ustar00rootroot00000000000000/*************************************************************************** gloscope.cpp - description ------------------- begin : Jan 17 2004 copyright : (C) 2004 by Adam Pigg email : adam@piggz.co.uk ***************************************************************************/ /*************************************************************************** * * * 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 #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() {} // METHODS ===================================================== 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++ ) { //kdDebug() << "Scope item " << i << " value: " << s[i] << endl; // 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 = float(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) // Going Down Too Much { 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 ); #if 0 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); #else 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.0+dfsg/src/analyzers/glanalyzer.h000066400000000000000000000032001223327513400216710ustar00rootroot00000000000000/*************************************************************************** gloscope.h - description ------------------- begin : Jan 17 2004 copyright : (C) 2004 by Adam Pigg email : adam@piggz.co.uk ***************************************************************************/ /*************************************************************************** * * * 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 GLOSCOPE_H #define GLOSCOPE_H #include #ifdef HAVE_QGLWIDGET #include "analyzerbase.h" /** *@author piggz */ 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: GLAnalyzer(QWidget *); ~GLAnalyzer(); void analyze( const Scope & ); protected: void initializeGL(); void resizeGL( int w, int h ); void paintGL(); }; #endif #endif clementine-1.2.0+dfsg/src/analyzers/glanalyzer2.cpp000066400000000000000000000240231223327513400223140ustar00rootroot00000000000000/*************************************************************************** glanalyzer2.cpp - description ------------------- begin : Feb 16 2004 copyright : (C) 2004 by Enrico Ros email : eros.kde@email.it ***************************************************************************/ /*************************************************************************** * * * 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 #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 = (float)w / (float)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, NULL ); show.timeStamp = (double)tv.tv_sec + (double)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 += (float)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 / (float)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, NULL ); double currentTime = (double)tv.tv_sec + (double)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.0+dfsg/src/analyzers/glanalyzer2.h000066400000000000000000000040341223327513400217610ustar00rootroot00000000000000/*************************************************************************** glanalyzer2.h - description ------------------- begin : Feb 16 2004 copyright : (C) 2004 by Enrico Ros email : eros.kde@email.it ***************************************************************************/ /*************************************************************************** * * * 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 GLSTARVIEW_H #define GLSTARVIEW_H #include #ifdef HAVE_QGLWIDGET #include "analyzerbase.h" #include #include class GLAnalyzer2 : public Analyzer::Base3D { public: 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 clementine-1.2.0+dfsg/src/analyzers/glanalyzer3.cpp000066400000000000000000000344151223327513400223230ustar00rootroot00000000000000/*************************************************************************** glanalyzer3.cpp - Bouncing Ballzz ------------------- begin : Feb 19 2004 copyright : (C) 2004 by Enrico Ros email : eros.kde@email.it ***************************************************************************/ /*************************************************************************** * * * 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 #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 } ) { //this is because GCC < 3.3 can't compile the above line, we aren't sure why though color[0] = 0.0; color[1] = drand48()*0.5; color[2] = 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: 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 = (float)w / (float)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, NULL ); show.timeStamp = (double)tv.tv_sec + (double)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, NULL ); double currentTime = (double)tv.tv_sec + (double)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 / (float)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.0+dfsg/src/analyzers/glanalyzer3.h000066400000000000000000000042171223327513400217650ustar00rootroot00000000000000/*************************************************************************** glanalyzer3.h - description ------------------- begin : Feb 16 2004 copyright : (C) 2004 by Enrico Ros email : eros.kde@email.it ***************************************************************************/ /*************************************************************************** * * * 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 #ifdef HAVE_QGLWIDGET #ifndef GLBOUNCER_H #define GLBOUNCER_H #include "analyzerbase.h" #include #include class QWidget; class Ball; class Paddle; class GLAnalyzer3 : public Analyzer::Base3D { public: 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 clementine-1.2.0+dfsg/src/analyzers/nyancatanalyzer.cpp000066400000000000000000000137661223327513400233010ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "core/logging.h" #include #include #include 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 ; ispectrum(&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_ = float(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=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.0+dfsg/src/analyzers/nyancatanalyzer.h000066400000000000000000000056541223327513400227430ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef NYANCATANALYZER_H #define 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(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 // NYANCATANALYZER_H clementine-1.2.0+dfsg/src/analyzers/sonogram.cpp000066400000000000000000000034311223327513400217070ustar00rootroot00000000000000// // // C++ Implementation: Sonogram // // Description: // // // Author: Melchior FRANZ , (C) 2004 // // Copyright: See COPYING file that comes with this distribution // // #include "sonogram.h" #include const char* Sonogram::kName = QT_TRANSLATE_NOOP("AnalyzerContainer", "Sonogram"); Sonogram::Sonogram(QWidget *parent) : Analyzer::Base(parent, 9) { } 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)); } void Sonogram::analyze(QPainter& p, const Scope &s, bool new_frame) { 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(); 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 - int(*it * 4000.0)); else if (*it < 1.0) c.setHsv(95 - int(*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()); m_fht->power2(front); m_fht->scale(front, 1.0 / 256); scope.resize( m_fht->size() / 2 ); } void Sonogram::demo(QPainter& p) { analyze(p, Scope(m_fht->size(), 0), new_frame_); } clementine-1.2.0+dfsg/src/analyzers/sonogram.h000066400000000000000000000011621223327513400213530ustar00rootroot00000000000000// // // C++ Interface: Sonogram // // Description: // // // Author: Melchior FRANZ , (C) 2004 // // Copyright: See COPYING file that comes with this distribution // // #ifndef SONOGRAM_H #define SONOGRAM_H #include "analyzerbase.h" /** @author Melchior FRANZ */ class Sonogram : public Analyzer::Base { Q_OBJECT public: Q_INVOKABLE Sonogram(QWidget*); ~Sonogram(); static const char* kName; protected: void analyze(QPainter& p, const Scope&, bool new_frame); void transform(Scope&); void demo(QPainter& p); void resizeEvent(QResizeEvent*); QPixmap canvas_; }; #endif clementine-1.2.0+dfsg/src/analyzers/turbine.cpp000066400000000000000000000041511223327513400215320ustar00rootroot00000000000000// // Amarok BarAnalyzer 3 - Jet Turbine: Symmetric version of analyzer 1 // // Author: Stanislav Karchebny , (C) 2003 // Max Howell (I modified it to use boom analyzer code) // // Copyright: like rest of Amarok // #include #include #include "turbine.h" const char* TurbineAnalyzer::kName = QT_TRANSLATE_NOOP("AnalyzerContainer", "Turbine"); void TurbineAnalyzer::analyze( QPainter& p, const Scope &scope, bool new_frame) { float h; const uint hd2 = height() / 2; const uint MAX_HEIGHT = hd2 - 1; for( uint i = 0, x = 0, y; i < BAND_COUNT; ++i, x += COLUMN_WIDTH+1 ) { h = log10( scope[i]*256.0 ) * F * 0.5; 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 = hd2 - uint(bar_height[i]); p.drawPixmap(x+1, y, barPixmap, 0, y, -1, -1); p.drawPixmap(x+1, hd2, barPixmap, 0, int(bar_height[i]), -1, -1); p.setPen( palette().color(QPalette::Highlight) ); if (bar_height[i] > 0) p.drawRect( x, y, COLUMN_WIDTH-1, (int)bar_height[i]*2 -1 ); const uint x2 = x+COLUMN_WIDTH-1; p.setPen( palette().color(QPalette::Base) ); y = hd2 - uint(peak_height[i]); p.drawLine( x, y, x2, y ); y = hd2 + uint(peak_height[i]); p.drawLine( x, y, x2, y ); } } clementine-1.2.0+dfsg/src/analyzers/turbine.h000066400000000000000000000010201223327513400211670ustar00rootroot00000000000000// // Amarok BarAnalyzer 3 - Jet Turbine: Symmetric version of analyzer 1 // // Author: Stanislav Karchebny , (C) 2003 // // Copyright: like rest of Amarok // #ifndef ANALYZER_TURBINE_H #define ANALYZER_TURBINE_H #include "boomanalyzer.h" class TurbineAnalyzer : public BoomAnalyzer { Q_OBJECT public: Q_INVOKABLE TurbineAnalyzer( QWidget *parent ) : BoomAnalyzer( parent ) {} void analyze( QPainter& p, const Scope&, bool new_frame); static const char* kName; }; #endif clementine-1.2.0+dfsg/src/config.h.in000066400000000000000000000032301223327513400173660ustar00rootroot00000000000000/* 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_AUDIOCD #cmakedefine HAVE_BOX #cmakedefine HAVE_BREAKPAD #cmakedefine HAVE_DBUS #cmakedefine HAVE_DEVICEKIT #cmakedefine HAVE_DROPBOX #cmakedefine HAVE_GIO #cmakedefine HAVE_GOOGLE_DRIVE #cmakedefine HAVE_IMOBILEDEVICE #cmakedefine HAVE_LIBARCHIVE #cmakedefine HAVE_LIBGPOD #cmakedefine HAVE_LIBLASTFM #cmakedefine HAVE_LIBLASTFM1 #cmakedefine HAVE_LIBMTP #cmakedefine HAVE_MOODBAR #cmakedefine HAVE_QCA #cmakedefine HAVE_SKYDRIVE #cmakedefine HAVE_SPARKLE #cmakedefine HAVE_SPOTIFY_DOWNLOADER #cmakedefine HAVE_STATIC_SQLITE #cmakedefine HAVE_UBUNTU_ONE #cmakedefine HAVE_WIIMOTEDEV #cmakedefine IMOBILEDEVICE_USES_UDIDS #cmakedefine TAGLIB_HAS_OPUS #cmakedefine USE_INSTALL_PREFIX #cmakedefine USE_SYSTEM_PROJECTM #cmakedefine USE_STD_UNORDERED_MAP #cmakedefine HAVE_LAMBDAS #endif // CONFIG_H_IN clementine-1.2.0+dfsg/src/core/000077500000000000000000000000001223327513400162755ustar00rootroot00000000000000clementine-1.2.0+dfsg/src/core/appearance.cpp000066400000000000000000000050651223327513400211060ustar00rootroot00000000000000/* 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 "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.0+dfsg/src/core/appearance.h000066400000000000000000000027421223327513400205520ustar00rootroot00000000000000/* 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 APPEARANCE_H #define APPEARANCE_H #include #include class Appearance : public QObject { public: Appearance(QObject* parent = NULL); // 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 // APPEARANCE_H clementine-1.2.0+dfsg/src/core/application.cpp000066400000000000000000000126011223327513400213040ustar00rootroot00000000000000/* 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 "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/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 "podcasts/gpoddersync.h" #include "podcasts/podcastbackend.h" #include "podcasts/podcastdownloader.h" #include "podcasts/podcastupdater.h" #ifdef HAVE_MOODBAR # include "moodbar/moodbarcontroller.h" # include "moodbar/moodbarloader.h" #endif Application::Application(QObject* parent) : QObject(parent), tag_reader_client_(NULL), database_(NULL), album_cover_loader_(NULL), playlist_backend_(NULL), podcast_backend_(NULL), appearance_(NULL), cover_providers_(NULL), task_manager_(NULL), player_(NULL), playlist_manager_(NULL), current_art_loader_(NULL), global_search_(NULL), internet_model_(NULL), library_(NULL), device_manager_(NULL), podcast_updater_(NULL), podcast_downloader_(NULL), gpodder_sync_(NULL), moodbar_loader_(NULL), moodbar_controller_(NULL), network_remote_(NULL), network_remote_helper_(NULL) { 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_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); 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_ = NULL; foreach (QObject* object, objects_in_threads_) { object->deleteLater(); } foreach (QThread* thread, threads_) { thread->quit(); } foreach (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(NULL); 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.0+dfsg/src/core/application.h000066400000000000000000000107311223327513400207530ustar00rootroot00000000000000/* 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 APPLICATION_H #define 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 PodcastDownloader; class PlaylistManager; class PodcastBackend; class PodcastUpdater; class TagReaderClient; class TaskManager; class Application : public QObject { Q_OBJECT public: Application(QObject* parent = NULL); ~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_; } 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_; } 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_; PodcastDownloader* podcast_downloader_; GPodderSync* gpodder_sync_; MoodbarLoader* moodbar_loader_; MoodbarController* moodbar_controller_; NetworkRemote* network_remote_; NetworkRemoteHelper* network_remote_helper_; QList objects_in_threads_; QList threads_; }; #endif // APPLICATION_H clementine-1.2.0+dfsg/src/core/backgroundstreams.cpp000066400000000000000000000105731223327513400225250ustar00rootroot00000000000000#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; } foreach (Stream* stream, streams_.values()) { if (stream->action == action) { stream->action = NULL; } } } void BackgroundStreams::StreamActionToggled(bool checked) { QAction* action = static_cast(sender()); if (!action) { return; } foreach (Stream* stream, streams_.values()) { if (stream->action == action) { EnableStream(stream->name, checked); } } } clementine-1.2.0+dfsg/src/core/backgroundstreams.h000066400000000000000000000026561223327513400221750ustar00rootroot00000000000000#ifndef BACKGROUNDSTREAMS_H #define 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 = 0); ~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(NULL) {} 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 clementine-1.2.0+dfsg/src/core/boundfuturewatcher.h000066400000000000000000000007161223327513400223720ustar00rootroot00000000000000#ifndef BOUNDFUTUREWATCHER_H #define BOUNDFUTUREWATCHER_H #include #include template class BoundFutureWatcher : public QFutureWatcher, boost::noncopyable { public: BoundFutureWatcher(const D& data, QObject* parent = 0) : QFutureWatcher(parent), data_(data) { } ~BoundFutureWatcher() { } const D& data() const { return data_; } private: D data_; }; #endif clementine-1.2.0+dfsg/src/core/cachedlist.h000066400000000000000000000055561223327513400205640ustar00rootroot00000000000000/* 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 CACHEDLIST_H #define 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(); } 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 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 // CACHEDLIST_H clementine-1.2.0+dfsg/src/core/commandlineoptions.cpp000066400000000000000000000243661223327513400227160ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_Append), 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, NULL); // 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> *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.0+dfsg/src/core/commandlineoptions.h000066400000000000000000000063431223327513400223560ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef COMMANDLINEOPTIONS_H #define COMMANDLINEOPTIONS_H #include #include #include class CommandlineOptions { friend QDataStream& operator<<(QDataStream& s, const CommandlineOptions& a); friend QDataStream& operator>>(QDataStream& s, CommandlineOptions& a); public: CommandlineOptions(int argc = 0, char** argv = NULL); 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, }; 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 // COMMANDLINEOPTIONS_H clementine-1.2.0+dfsg/src/core/crashreporting.cpp000066400000000000000000000135331223327513400220400ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = NULL; #if defined(HAVE_BREAKPAD) and defined(Q_OS_LINUX) CrashReporting::CrashReporting() : handler_(new google_breakpad::ExceptionHandler( QDir::tempPath().toLocal8Bit().constData(), NULL, 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, NULL}; sys_execv(sPath, argv); } return true; } CrashSender::CrashSender(const QString& path) : network_(new QNetworkAccessManager(this)), path_(path), file_(new QFile(path_, this)), progress_(NULL) { } 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.0+dfsg/src/core/crashreporting.h000066400000000000000000000052661223327513400215110ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CRASHREPORTING_H #define 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; boost::scoped_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: 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 // CRASHREPORTING_H clementine-1.2.0+dfsg/src/core/database.cpp000066400000000000000000000612651223327513400205570ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 const char* Database::kDatabaseFilename = "clementine.db"; const int Database::kSchemaVersion = 46; 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 */ }; int (*Database::_sqlite3_value_type) (sqlite3_value*) = NULL; sqlite_int64 (*Database::_sqlite3_value_int64) (sqlite3_value*) = NULL; const uchar* (*Database::_sqlite3_value_text) (sqlite3_value*) = NULL; void (*Database::_sqlite3_result_int64) (sqlite3_context*, sqlite_int64) = NULL; void* (*Database::_sqlite3_user_data) (sqlite3_context*) = NULL; int (*Database::_sqlite3_open) (const char*, sqlite3**) = NULL; const char* (*Database::_sqlite3_errmsg) (sqlite3*) = NULL; int (*Database::_sqlite3_close) (sqlite3*) = NULL; sqlite3_backup* (*Database::_sqlite3_backup_init) ( sqlite3*, const char*, sqlite3*, const char*) = NULL; int (*Database::_sqlite3_backup_step) (sqlite3_backup*, int) = NULL; int (*Database::_sqlite3_backup_finish) (sqlite3_backup*) = NULL; int (*Database::_sqlite3_backup_pagecount) (sqlite3_backup*) = NULL; int (*Database::_sqlite3_backup_remaining) (sqlite3_backup*) = NULL; bool Database::sStaticInitDone = false; bool Database::sLoadedSqliteSymbols = false; sqlite3_tokenizer_module* Database::sFTSTokenizer = NULL; 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() { if (sStaticInitDone) { return; } sStaticInitDone = true; 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; #ifdef HAVE_STATIC_SQLITE // We statically link libqsqlite.dll on windows and mac so these symbols are already // available _sqlite3_value_type = sqlite3_value_type; _sqlite3_value_int64 = sqlite3_value_int64; _sqlite3_value_text = sqlite3_value_text; _sqlite3_result_int64 = sqlite3_result_int64; _sqlite3_user_data = sqlite3_user_data; _sqlite3_open = sqlite3_open; _sqlite3_errmsg = sqlite3_errmsg; _sqlite3_close = sqlite3_close; _sqlite3_backup_init = sqlite3_backup_init; _sqlite3_backup_step = sqlite3_backup_step; _sqlite3_backup_finish = sqlite3_backup_finish; _sqlite3_backup_pagecount = sqlite3_backup_pagecount; _sqlite3_backup_remaining = sqlite3_backup_remaining; sLoadedSqliteSymbols = true; return; #else // HAVE_STATIC_SQLITE QString plugin_path = QLibraryInfo::location(QLibraryInfo::PluginsPath) + "/sqldrivers/libqsqlite"; QLibrary library(plugin_path); if (!library.load()) { qLog(Error) << "QLibrary::load() failed for " << plugin_path; return; } _sqlite3_value_type = reinterpret_cast( library.resolve("sqlite3_value_type")); _sqlite3_value_int64 = reinterpret_cast( library.resolve("sqlite3_value_int64")); _sqlite3_value_text = reinterpret_cast( library.resolve("sqlite3_value_text")); _sqlite3_result_int64 = reinterpret_cast( library.resolve("sqlite3_result_int64")); _sqlite3_user_data = reinterpret_cast( library.resolve("sqlite3_user_data")); _sqlite3_open = reinterpret_cast( library.resolve("sqlite3_open")); _sqlite3_errmsg = reinterpret_cast( library.resolve("sqlite3_errmsg")); _sqlite3_close = reinterpret_cast( library.resolve("sqlite3_close")); _sqlite3_backup_init = reinterpret_cast< sqlite3_backup* (*) (sqlite3*, const char*, sqlite3*, const char*)>( library.resolve("sqlite3_backup_init")); _sqlite3_backup_step = reinterpret_cast( library.resolve("sqlite3_backup_step")); _sqlite3_backup_finish = reinterpret_cast( library.resolve("sqlite3_backup_finish")); _sqlite3_backup_pagecount = reinterpret_cast( library.resolve("sqlite3_backup_pagecount")); _sqlite3_backup_remaining = reinterpret_cast( library.resolve("sqlite3_backup_remaining")); if (!_sqlite3_value_type || !_sqlite3_value_int64 || !_sqlite3_value_text || !_sqlite3_result_int64 || !_sqlite3_user_data || !_sqlite3_open || !_sqlite3_errmsg || !_sqlite3_close || !_sqlite3_backup_init || !_sqlite3_backup_step || !_sqlite3_backup_finish || !_sqlite3_backup_pagecount || !_sqlite3_backup_remaining) { qLog(Fatal) << "Couldn't resolve sqlite symbols. Please compile " "Clementine with -DSTATIC_SQLITE=ON."; sLoadedSqliteSymbols = false; } else { sLoadedSqliteSymbols = true; } #endif } 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 foreach (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. foreach (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. foreach (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::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); foreach (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) { foreach (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)) { foreach (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 foreach (const QString& table, db.tables()) { if (table == "songs" || table.endsWith("_songs")) ret << table; } // look for the tables in attached dbs foreach (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(); app_->AddError("LibraryBackend: " + last_error.text()); 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 = NULL; sqlite3* dest_connection = NULL; BOOST_SCOPE_EXIT((source_connection)(dest_connection)(task_id)(app_)) { // Harmless to call sqlite3_close() with a NULL 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.0+dfsg/src/core/database.h000066400000000000000000000151211223327513400202120ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef DATABASE_H #define 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 = 0, 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 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*)); // Sqlite3 functions. These will be loaded from the sqlite3 plugin. static int (*_sqlite3_value_type) (sqlite3_value*); static sqlite_int64 (*_sqlite3_value_int64) (sqlite3_value*); static const uchar* (*_sqlite3_value_text) (sqlite3_value*); static void (*_sqlite3_result_int64) (sqlite3_context*, sqlite_int64); static void* (*_sqlite3_user_data) (sqlite3_context*); // These are necessary for SQLite backups. static int (*_sqlite3_open) (const char*, sqlite3**); static const char* (*_sqlite3_errmsg) (sqlite3*); static int (*_sqlite3_close) (sqlite3*); static sqlite3_backup* (*_sqlite3_backup_init) ( sqlite3*, const char*, sqlite3*, const char*); static int (*_sqlite3_backup_step) (sqlite3_backup*, int); static int (*_sqlite3_backup_finish) (sqlite3_backup*); static int (*_sqlite3_backup_pagecount) (sqlite3_backup*); static int (*_sqlite3_backup_remaining) (sqlite3_backup*); static bool sStaticInitDone; static bool sLoadedSqliteSymbols; 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: MemoryDatabase(Application* app, QObject* parent = 0) : Database(app, parent, ":memory:") {} ~MemoryDatabase() { // Make sure Qt doesn't reuse the same database QSqlDatabase::removeDatabase(Connect().connectionName()); } }; #endif // DATABASE_H clementine-1.2.0+dfsg/src/core/deletefiles.cpp000066400000000000000000000055701223327513400212750ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "musicstorage.h" #include "taskmanager.h" #include #include #include #include const int DeleteFiles::kBatchSize = 50; DeleteFiles::DeleteFiles(TaskManager* task_manager, boost::shared_ptr storage) : thread_(NULL), 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; foreach (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_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.0+dfsg/src/core/deletefiles.h000066400000000000000000000027731223327513400207440ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef DELETEFILES_H #define DELETEFILES_H #include #include #include "song.h" class MusicStorage; class TaskManager; class DeleteFiles : public QObject { Q_OBJECT public: DeleteFiles(TaskManager* task_manager, boost::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_; boost::shared_ptr storage_; SongList songs_; bool started_; int task_id_; int progress_; SongList songs_with_errors_; }; #endif // DELETEFILES_H clementine-1.2.0+dfsg/src/core/fht.cpp000066400000000000000000000117131223327513400175650ustar00rootroot00000000000000// FHT - Fast Hartley Transform Class // // Copyright (C) 2004 Melchior FRANZ - mfranz@kde.org // // 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, 51 Franklin Steet, Fifth Floor, Boston, MA 02110-1301, USA // // $Id$ #include #include #include "fht.h" FHT::FHT(int n) : m_buf(0), m_tab(0), m_log(0) { if (n < 3) { m_num = 0; m_exp2 = -1; return; } m_exp2 = n; m_num = 1 << n; if (n > 3) { m_buf = new float[m_num]; m_tab = new float[m_num * 2]; makeCasTable(); } } FHT::~FHT() { delete[] m_buf; delete[] m_tab; delete[] m_log; } void FHT::makeCasTable(void) { float d, *costab, *sintab; int ul, ndiv2 = m_num / 2; for (costab = m_tab, sintab = m_tab + m_num / 2 + 1, ul = 0; ul < m_num; ul++) { d = M_PI * ul / ndiv2; *costab = *sintab = cos(d); costab += 2, sintab += 2; if (sintab > m_tab + m_num * 2) sintab = m_tab + 1; } } float* FHT::copy(float *d, float *s) { return (float *)memcpy(d, s, m_num * sizeof(float)); } float* FHT::clear(float *d) { return (float *)memset(d, 0, m_num * sizeof(float)); } void FHT::scale(float *p, float d) { for (int i = 0; i < (m_num / 2); i++) *p++ *= d; } void FHT::ewma(float *d, float *s, float w) { for (int i = 0; i < (m_num / 2); i++, d++, s++) *d = *d * w + *s * (1 - w); } void FHT::logSpectrum(float *out, float *p) { int n = m_num / 2, i, j, k, *r; if (!m_log) { m_log = new int[n]; float f = n / log10((double)n); for (i = 0, r = m_log; i < n; i++, r++) { j = int(rint(log10(i + 1.0) * f)); *r = j >= n ? n - 1 : j; } } semiLogSpectrum(p); *out++ = *p = *p / 100; for (k = i = 1, r = m_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 < (m_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 < (m_num / 2); i++, p++) *p = (float)sqrt(*p * .5); } void FHT::power(float *p) { power2(p); for (int i = 0; i < (m_num / 2); i++) *p++ *= .5; } void FHT::power2(float *p) { int i; float *q; _transform(p, m_num, 0); *p = (*p * *p), *p += *p, p++; for (i = 1, q = p + m_num - 2; i < (m_num / 2); i++, --q) *p = (*p * *p) + (*q * *q), p++; } void FHT::transform(float *p) { if (m_num == 8) transform8(p); else _transform(p, m_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 = m_buf, t2 = m_buf + ndiv2, pp = &p[k]; i < ndiv2; i++) *t1++ = *pp++, *t2++ = *pp++; memcpy(p + k, m_buf, sizeof(float) * n); _transform(p, ndiv2, k); _transform(p, ndiv2, k + ndiv2); j = m_num / ndiv2 - 1; t1 = m_buf; t2 = t1 + ndiv2; t3 = p + k + ndiv2; ptab = m_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, m_buf, sizeof(float) * n); } clementine-1.2.0+dfsg/src/core/fht.h000066400000000000000000000063751223327513400172420ustar00rootroot00000000000000// FHT - Fast Hartley Transform Class // // Copyright (C) 2004 Melchior FRANZ - mfranz@kde.org // // 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, 51 Franklin Steet, Fifth Floor, Boston, MA 02110-1301, USA // // $Id$ #ifndef FHT_H #define 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 m_exp2; int m_num; float *m_buf; float *m_tab; int *m_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() */ FHT(int); ~FHT(); inline int sizeExp() const { return m_exp2; } inline int size() const { return m_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 clementine-1.2.0+dfsg/src/core/filesystemmusicstorage.cpp000066400000000000000000000035621223327513400236210ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 #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) { return QFile::remove(job.metadata_.url().toLocalFile()); } clementine-1.2.0+dfsg/src/core/filesystemmusicstorage.h000066400000000000000000000022311223327513400232560ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef FILESYSTEMMUSICSTORAGE_H #define FILESYSTEMMUSICSTORAGE_H #include "musicstorage.h" class FilesystemMusicStorage : public virtual MusicStorage { public: FilesystemMusicStorage(const QString& root); ~FilesystemMusicStorage() {} QString LocalPath() const { return root_; } bool CopyToStorage(const CopyJob& job); bool DeleteFromStorage(const DeleteJob& job); private: QString root_; }; #endif // FILESYSTEMMUSICSTORAGE_H clementine-1.2.0+dfsg/src/core/filesystemwatcherinterface.cpp000066400000000000000000000022631223327513400244270ustar00rootroot00000000000000/* 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 "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.0+dfsg/src/core/filesystemwatcherinterface.h000066400000000000000000000023221223327513400240700ustar00rootroot00000000000000/* 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 FILESYSTEMWATCHERINTERFACE_H #define FILESYSTEMWATCHERINTERFACE_H #include class FileSystemWatcherInterface : public QObject { Q_OBJECT public: FileSystemWatcherInterface(QObject* parent = 0); 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 = 0); signals: void PathChanged(const QString& path); }; #endif clementine-1.2.0+dfsg/src/core/globalshortcutbackend.cpp000066400000000000000000000021551223327513400233500ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/core/globalshortcutbackend.h000066400000000000000000000024241223327513400230140ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef GLOBALSHORTCUTBACKEND_H #define GLOBALSHORTCUTBACKEND_H #include class GlobalShortcuts; class GlobalShortcutBackend : public QObject { Q_OBJECT public: GlobalShortcutBackend(GlobalShortcuts* parent = 0); 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 // GLOBALSHORTCUTBACKEND_H clementine-1.2.0+dfsg/src/core/globalshortcuts.cpp000066400000000000000000000140641223327513400222250ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 #ifdef QT_DBUS_LIB # include #endif const char* GlobalShortcuts::kSettingsGroup = "Shortcuts"; GlobalShortcuts::GlobalShortcuts(QObject *parent) : QObject(parent), gnome_backend_(NULL), system_backend_(NULL), 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())); 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); shortcut.action->setShortcut(QKeySequence::fromString( settings_.value(id, default_key.toString()).toString())); shortcut.id = id; shortcut.default_key = default_key; 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.0+dfsg/src/core/globalshortcuts.h000066400000000000000000000046671223327513400217020ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef GLOBALSHORTCUTS_H #define GLOBALSHORTCUTS_H #include #include #include #include class QAction; class GlobalShortcutBackend; class QSignalMapper; class GlobalShortcuts : public QObject { Q_OBJECT public: GlobalShortcuts(QObject* parent = 0); static const char* kSettingsGroup; struct Shortcut { QString id; QKeySequence default_key; QAction* action; }; 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(); 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 clementine-1.2.0+dfsg/src/core/gnomeglobalshortcutbackend.cpp000066400000000000000000000076411223327513400244030ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_(NULL), 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() <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.0+dfsg/src/core/gnomeglobalshortcutbackend.h000066400000000000000000000030271223327513400240420ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef GNOMEGLOBALSHORTCUTBACKEND_H #define GNOMEGLOBALSHORTCUTBACKEND_H #include "globalshortcutbackend.h" class OrgGnomeSettingsDaemonMediaKeysInterface; class QDBusPendingCallWatcher; class GnomeGlobalShortcutBackend : public GlobalShortcutBackend { Q_OBJECT public: 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 // GNOMEGLOBALSHORTCUTBACKEND_H clementine-1.2.0+dfsg/src/core/mac_delegate.h000066400000000000000000000022661223327513400210460ustar00rootroot00000000000000#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.0+dfsg/src/core/mac_startup.h000066400000000000000000000013111223327513400207640ustar00rootroot00000000000000#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 clementine-1.2.0+dfsg/src/core/mac_startup.mm000066400000000000000000000324601223327513400211570ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 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, NULL); } [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_]; Class notification_center_class = NSClassFromString(@"NSUserNotificationCenter"); if (notification_center_class) { id notification_center = [notification_center_class defaultUserNotificationCenter]; [notification_center 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) { if (QSysInfo::MacintoshVersion == QSysInfo::MV_SNOWLEOPARD) { return; // Unsupported on 10.6 } NSView* view = reinterpret_cast(main_window.winId()); NSWindow* window = [view window]; [window setCollectionBehavior: kFullScreenPrimary]; } } // namespace mac clementine-1.2.0+dfsg/src/core/mac_utilities.h000066400000000000000000000017201223327513400213010ustar00rootroot00000000000000/* 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 #include #ifdef __OBJC__ @class NSEvent; #else class NSEvent; #endif namespace mac { QKeySequence KeySequenceFromNSEvent(NSEvent* event); void DumpDictionary(CFDictionaryRef dict); } clementine-1.2.0+dfsg/src/core/macfslistener.h000066400000000000000000000031471223327513400213120ustar00rootroot00000000000000/* 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 MACFSLISTENER_H #define MACFSLISTENER_H #include #include #include #include #include "filesystemwatcherinterface.h" class MacFSListener : public FileSystemWatcherInterface { Q_OBJECT public: explicit MacFSListener(QObject* parent = 0); 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 clementine-1.2.0+dfsg/src/core/macfslistener.mm000066400000000000000000000062421223327513400214730ustar00rootroot00000000000000/* 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 "macfslistener.h" #include #include #include #include "core/logging.h" #include "core/scoped_nsobject.h" MacFSListener::MacFSListener(QObject* parent) : FileSystemWatcherInterface(parent), run_loop_(NULL), stream_(NULL) { 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_ = NULL; } if (paths_.empty()) { return; } scoped_nsobject array([[NSMutableArray alloc] init]); foreach (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( NULL, &EventStreamCallback, &context, // Copied reinterpret_cast(array.get()), kFSEventStreamEventIdSinceNow, latency, kFSEventStreamCreateFlagNone); FSEventStreamScheduleWithRunLoop(stream_, run_loop_, kCFRunLoopDefaultMode); FSEventStreamStart(stream_); } clementine-1.2.0+dfsg/src/core/macglobalshortcutbackend.h000066400000000000000000000030311223327513400234700ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef MACGLOBALSHORTCUTBACKEND_H #define MACGLOBALSHORTCUTBACKEND_H #include "globalshortcutbackend.h" #include #include #include class MacGlobalShortcutBackendPrivate; class QAction; class MacGlobalShortcutBackend : public GlobalShortcutBackend { Q_OBJECT public: 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; boost::scoped_ptr p_; }; #endif // MACGLOBALSHORTCUTBACKEND_H clementine-1.2.0+dfsg/src/core/macglobalshortcutbackend.mm000066400000000000000000000075131223327513400236630ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "config.h" #include "globalshortcuts.h" #include "mac_startup.h" #import "mac_utilities.h" #include #include #include #include #include #include #include #include #include #include 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); if (AXAPIEnabled()) { foreach (const GlobalShortcuts::Shortcut& shortcut, manager_->shortcuts().values()) { shortcuts_[shortcut.action->shortcut()] = shortcut.action; } return p_->Register(); } return false; } 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) { NSURL* prefpane_url = [NSURL fileURLWithPath: [[paths objectAtIndex:0] stringByAppendingPathComponent:@"UniversalAccessPref.prefPane"]]; [[NSWorkspace sharedWorkspace] openURL:prefpane_url]; } } clementine-1.2.0+dfsg/src/core/mergedproxymodel.cpp000066400000000000000000000413521223327513400223740ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 std::size_t hash_value(const QModelIndex& index) { return qHash(index); } MergedProxyModel::MergedProxyModel(QObject* parent) : QAbstractProxyModel(parent), resetting_model_(NULL) { } MergedProxyModel::~MergedProxyModel() { DeleteAllMappings(); } void MergedProxyModel::DeleteAllMappings() { MappingContainer::index::type::iterator begin = mappings_.get().begin(); MappingContainer::index::type::iterator end = 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_ = NULL; // Delete all the mappings that reference the submodel MappingContainer::index::type::iterator it = mappings_.get().begin(); MappingContainer::index::type::iterator end = mappings_.get().end(); while (it != end) { if ((*it)->source_index.model() == submodel) { delete *it; it = 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 mappings_.clear(); merge_points_.clear(); // Reset the proxy reset(); } void MergedProxyModel::SubModelReset() { QAbstractItemModel* submodel = static_cast(sender()); // TODO: 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_ = NULL; // Delete all the mappings that reference the submodel MappingContainer::index::type::iterator it = mappings_.get().begin(); MappingContainer::index::type::iterator end = mappings_.get().end(); while (it != end) { if ((*it)->source_index.model() == submodel) { delete *it; it = 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 (mappings_.get().find(mapping) == 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 MappingContainer::index::type::iterator it = mappings_.get().find(source_index); Mapping* mapping; if (it != mappings_.get().end()) { mapping = *it; } else { mapping = new Mapping(source_index); const_cast(this)->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(); foreach (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; foreach (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(); foreach (QAbstractItemModel* submodel, merge_points_.keys()) { if (submodel == const_model) return submodel; } return NULL; } 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(); foreach (QAbstractItemModel* key, merge_points_.keys()) { old_merge_points_[key] = merge_points_.value(key); } } void MergedProxyModel::LayoutChanged() { foreach (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; foreach (const QModelIndex& index, source_indexes) { ret << mapFromSource(index); } return ret; } QModelIndexList MergedProxyModel::mapToSource(const QModelIndexList& proxy_indexes) const { QModelIndexList ret; foreach (const QModelIndex& index, proxy_indexes) { ret << mapToSource(index); } return ret; } clementine-1.2.0+dfsg/src/core/mergedproxymodel.h000066400000000000000000000117241223327513400220410ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef MERGEDPROXYMODEL_H #define MERGEDPROXYMODEL_H #include #include #include #include #include using boost::multi_index::multi_index_container; using boost::multi_index::indexed_by; using boost::multi_index::hashed_unique; using boost::multi_index::ordered_unique; using boost::multi_index::tag; using boost::multi_index::member; using boost::multi_index::identity; std::size_t hash_value(const QModelIndex& index); class MergedProxyModel : public QAbstractProxyModel { Q_OBJECT public: MergedProxyModel(QObject* parent = 0); ~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; struct Mapping { Mapping(const QModelIndex& _source_index) : source_index(_source_index) {} QModelIndex source_index; }; struct tag_by_source {}; struct tag_by_pointer {}; typedef multi_index_container< Mapping*, indexed_by< hashed_unique, member >, ordered_unique, identity > > > MappingContainer; MappingContainer mappings_; QMap merge_points_; QAbstractItemModel* resetting_model_; QMap old_merge_points_; }; #endif // MERGEDPROXYMODEL_H clementine-1.2.0+dfsg/src/core/metatypes.cpp000066400000000000000000000072531223327513400210230ustar00rootroot00000000000000#include "metatypes.h" #include #include #include "config.h" #include "covers/albumcoverfetcher.h" #include "engines/enginebase.h" #include "globalsearch/searchprovider.h" #include "internet/digitallyimportedclient.h" #include "internet/geolocator.h" #include "internet/somafmservice.h" #include "library/directory.h" #include "playlist/playlist.h" #include "podcasts/podcastepisode.h" #include "podcasts/podcast.h" #include "ui/equalizer.h" #ifdef HAVE_DBUS #include #include "core/mpris2.h" #include "dbus/metatypes.h" #endif class GstBuffer; class GstElement; class GstEnginePipeline; class QNetworkReply; void RegisterMetaTypes() { 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("GstEnginePipeline*"); qRegisterMetaType("PlaylistItemList"); qRegisterMetaType("PlaylistItemPtr"); qRegisterMetaType("PodcastEpisodeList"); qRegisterMetaType("PodcastList"); 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_DBUS qDBusRegisterMetaType(); qDBusRegisterMetaType(); qDBusRegisterMetaType(); qDBusRegisterMetaType >(); qDBusRegisterMetaType(); qDBusRegisterMetaType(); qDBusRegisterMetaType(); #endif } clementine-1.2.0+dfsg/src/core/metatypes.h000066400000000000000000000001131223327513400204540ustar00rootroot00000000000000#ifndef METATYPES_H #define METATYPES_H void RegisterMetaTypes(); #endif clementine-1.2.0+dfsg/src/core/mimedata.h000066400000000000000000000051231223327513400202300ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef MIMEDATA_H #define 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 // MIMEDATA_H clementine-1.2.0+dfsg/src/core/modelfuturewatcher.h000066400000000000000000000007461223327513400223660ustar00rootroot00000000000000#ifndef MODELFUTUREWATCHER_H #define MODELFUTUREWATCHER_H #include #include template class ModelFutureWatcher : public QFutureWatcher { public: ModelFutureWatcher(const QModelIndex& index, QObject* parent = 0) : QFutureWatcher(parent), index_(index) { } ~ModelFutureWatcher() { } const QPersistentModelIndex& index() const { return index_; } private: QPersistentModelIndex index_; }; #endif clementine-1.2.0+dfsg/src/core/mpris.cpp000066400000000000000000000020621223327513400201330ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/core/mpris.h000066400000000000000000000020701223327513400175770ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef MPRIS_H #define MPRIS_H #include class Application; namespace mpris { class Mpris1; class Mpris2; class Mpris : public QObject { Q_OBJECT public: Mpris(Application* app, QObject* parent = 0); signals: void RaiseMainWindow(); private: Mpris1* mpris1_; Mpris2* mpris2_; }; } // namespace mpris #endif // MPRIS_H clementine-1.2.0+dfsg/src/core/mpris1.cpp000066400000000000000000000262111223327513400202160ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_(NULL), player_(NULL), tracklist_(NULL) { 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) { 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); 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.0+dfsg/src/core/mpris1.h000066400000000000000000000112121223327513400176560ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef MPRIS1_H #define 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 = 0, 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: Mpris1Root(Application* app, QObject* parent = 0); QString Identity(); void Quit(); Version MprisVersion(); private: Application* app_; }; class Mpris1Player : public QObject { Q_OBJECT public: Mpris1Player(Application* app, QObject* parent = 0); 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: Mpris1TrackList(Application* app, QObject* parent = 0); 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 // MPRIS1_H clementine-1.2.0+dfsg/src/core/mpris2.cpp000066400000000000000000000365751223327513400202350ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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*))); } // 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) { QDBusMessage msg = QDBusMessage::createSignal( kMprisObjectPath, kFreedesktopPath, "PropertiesChanged"); QVariantMap map; map.insert(name, val); QVariantList args = QVariantList() << "org.mpris.MediaPlayer2.Player" << 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/"); foreach (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 double(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 return TrackIds(); } bool Mpris2::CanEditTracks() const { return false; } TrackMetadata Mpris2::GetTracksMetadata(const TrackIds &tracks) const { //TODO return TrackMetadata(); } void Mpris2::AddTrack(const QString &uri, const QDBusObjectPath &afterTrack, bool setAsCurrent) { //TODO } void Mpris2::RemoveTrack(const QDBusObjectPath &trackId) { //TODO } void Mpris2::GoTo(const QDBusObjectPath &trackId) { //TODO } 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; } app_->playlist_manager()->SetActivePlaylist(p); app_->player()->Next(); } // TODO: Support sort orders. MprisPlaylistList Mpris2::GetPlaylists( quint32 index, quint32 max_count, const QString& order, bool reverse_order) { MprisPlaylistList ret; foreach (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); } } // namespace mpris clementine-1.2.0+dfsg/src/core/mpris2.h000066400000000000000000000155221223327513400176670ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef MPRIS2_H #define MPRIS2_H #include "playlist/playlistitem.h" #include #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 = 0); // 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); private: void EmitNotification(const QString& name); void EmitNotification(const QString& name, const QVariant& val); 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 clementine-1.2.0+dfsg/src/core/mpris_common.h000066400000000000000000000036121223327513400211520ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef MPRIS_COMMON_H #define 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 // MPRIS_COMMON_H clementine-1.2.0+dfsg/src/core/multisortfilterproxy.cpp000066400000000000000000000044211223327513400233540ustar00rootroot00000000000000#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 { foreach (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.0+dfsg/src/core/multisortfilterproxy.h000066400000000000000000000010601223327513400230150ustar00rootroot00000000000000#ifndef MULTISORTFILTERPROXY_H #define MULTISORTFILTERPROXY_H #include class MultiSortFilterProxy : public QSortFilterProxyModel { public: MultiSortFilterProxy(QObject* parent = NULL); 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 // MULTISORTFILTERPROXY_H clementine-1.2.0+dfsg/src/core/musicstorage.cpp000066400000000000000000000014301223327513400215040ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/core/musicstorage.h000066400000000000000000000043761223327513400211650ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef MUSICSTORAGE_H #define 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 boost::function ProgressFunction; struct CopyJob { QString source_; QString destination_; Song metadata_; bool overwrite_; 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(boost::shared_ptr); #endif // MUSICSTORAGE_H clementine-1.2.0+dfsg/src/core/network.cpp000066400000000000000000000146741223327513400205060ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = NULL; 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(NULL), 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.0+dfsg/src/core/network.h000066400000000000000000000072211223327513400201410ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef NETWORK_H #define NETWORK_H #include #include #include #include class QNetworkDiskCache; class ThreadSafeNetworkDiskCache : public QAbstractNetworkCache { public: 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: NetworkAccessManager(QObject* parent = 0); protected: QNetworkReply* createRequest(Operation op, const QNetworkRequest& request, QIODevice* outgoingData); }; class RedirectFollower : public QObject { Q_OBJECT public: 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: NetworkTimeouts(int timeout_msec, QObject* parent = 0); // TODO: 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 // NETWORK_H clementine-1.2.0+dfsg/src/core/networkproxyfactory.cpp000066400000000000000000000053651223327513400231750ustar00rootroot00000000000000#include "networkproxyfactory.h" #include "core/logging.h" #include #include #include #include #include NetworkProxyFactory* NetworkProxyFactory::sInstance = NULL; 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; foreach (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.0+dfsg/src/core/networkproxyfactory.h000066400000000000000000000015141223327513400226320ustar00rootroot00000000000000#ifndef NETWORKPROXYFACTORY_H #define 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 // NETWORKPROXYFACTORY_H clementine-1.2.0+dfsg/src/core/organise.cpp000066400000000000000000000236331223327513400206170ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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" #include "organise.h" #include "taskmanager.h" #include "core/logging.h" #include "core/tagreaderclient.h" #include #include #include #include #include #include const int Organise::kBatchSize = 10; const int Organise::kTranscodeProgressInterval = 500; Organise::Organise(TaskManager* task_manager, boost::shared_ptr destination, const OrganiseFormat &format, bool copy, bool overwrite, const QStringList& files, bool eject_after) : thread_(NULL), task_manager_(task_manager), transcoder_(new Transcoder(this)), destination_(destination), format_(format), copy_(copy), overwrite_(overwrite), eject_after_(eject_after), task_count_(files.count()), transcode_suffix_(1), tasks_complete_(0), started_(false), task_id_(0), current_copy_progress_(0) { original_thread_ = thread(); foreach (const QString& filename, files) { tasks_pending_ << Task(filename); } } 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,bool)), SLOT(FileTranscoded(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 :( foreach (const Task& task, tasks_pending_) files_with_errors_ << task.filename_; 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 ; iReadFileBlocking(task.filename_, &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(FiddleFileExtension(song.url().toLocalFile(), task.new_extension_))); song.set_basefilename(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.filename_] = 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.filename_, preset, task.transcoded_filename_); transcoder_->Start(); continue; } } MusicStorage::CopyJob job; job.source_ = task.transcoded_filename_.isEmpty() ? task.filename_ : task.transcoded_filename_; job.destination_ = format_.GetFilenameForSong(song); job.metadata_ = song; job.overwrite_ = overwrite_; job.remove_original_ = !copy_; job.progress_ = boost::bind(&Organise::SetSongProgress, this, _1, !task.transcoded_filename_.isEmpty()); if (!destination_->CopyToStorage(job)) { files_with_errors_ << task.filename_; } // 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, int(progress * max), max-1); UpdateProgress(); } void Organise::UpdateProgress() { const int total = task_count_ * 100; // Update transcoding progress QMap transcode_progress = transcoder_->GetProgress(); foreach (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; foreach (const Task& task, tasks_pending_) { progress += qBound(0, int(task.transcode_progress_ * 50), 50); } foreach (const Task& task, tasks_transcoding_.values()) { progress += qBound(0, int(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& filename, bool success) { qLog(Info) << "File finished" << filename << success; transcode_progress_timer_.stop(); Task task = tasks_transcoding_.take(filename); if (!success) { files_with_errors_ << filename; } else { tasks_pending_ << task; } QTimer::singleShot(0, this, SLOT(ProcessSomeFiles())); } QString Organise::FiddleFileExtension(const QString& filename, const QString& new_extension) { if (filename.section('/', -1, -1).contains('.')) return filename.section('.', 0, -2) + "." + new_extension; return filename + "." + new_extension; } void Organise::timerEvent(QTimerEvent* e) { QObject::timerEvent(e); if (e->timerId() == transcode_progress_timer_.timerId()) { UpdateProgress(); } } clementine-1.2.0+dfsg/src/core/organise.h000066400000000000000000000053241223327513400202610ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef ORGANISE_H #define ORGANISE_H #include #include #include #include #include "organiseformat.h" #include "transcoder/transcoder.h" class MusicStorage; class TaskManager; class Organise : public QObject { Q_OBJECT public: Organise(TaskManager* task_manager, boost::shared_ptr destination, const OrganiseFormat& format, bool copy, bool overwrite, const QStringList& files, bool eject_after); static const int kBatchSize; static const int kTranscodeProgressInterval; void Start(); signals: void Finished(const QStringList& files_with_errors); protected: void timerEvent(QTimerEvent* e); private slots: void ProcessSomeFiles(); void FileTranscoded(const QString& filename, bool success); private: void SetSongProgress(float progress, bool transcoded = false); void UpdateProgress(); Song::FileType CheckTranscode(Song::FileType original_type) const; static QString FiddleFileExtension(const QString& filename, const QString& new_extension); private: struct Task { explicit Task(const QString& filename = QString()) : filename_(filename), transcode_progress_(0.0) {} QString filename_; float transcode_progress_; QString transcoded_filename_; QString new_extension_; Song::FileType new_filetype_; }; QThread* thread_; QThread* original_thread_; TaskManager* task_manager_; Transcoder* transcoder_; boost::shared_ptr destination_; QList supported_filetypes_; const OrganiseFormat format_; const bool copy_; const bool overwrite_; 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 // ORGANISE_H clementine-1.2.0+dfsg/src/core/organiseformat.cpp000066400000000000000000000206051223327513400220240ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "core/timeconstants.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"; // From http://en.wikipedia.org/wiki/8.3_filename#Directory_table const char* OrganiseFormat::kInvalidFatCharacters = "\"*/\\:<>?|"; const int OrganiseFormat::kInvalidFatCharactersCount = strlen(OrganiseFormat::kInvalidFatCharacters); 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 (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; } return filename; } 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; 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 == "genre") value = song.genre(); else if (tag == "comment") value = song.comment(); else if (tag == "year") value = QString::number(song.year()); 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 = song.url().toLocalFile().section('.', -1, -1); 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.0+dfsg/src/core/organiseformat.h000066400000000000000000000051731223327513400214740ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_CORE_ORGANISEFORMAT_H_ #define SRC_CORE_ORGANISEFORMAT_H_ #include #include #include "core/song.h" class OrganiseFormat { public: 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; 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 = 0); 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 = 0); explicit SyntaxHighlighter(QTextEdit* parent); explicit SyntaxHighlighter(QTextDocument* parent); void highlightBlock(const QString& format); }; private: QString ParseBlock( QString block, const Song& song, bool* any_empty = NULL) const; QString TagValue(const QString& tag, const Song& song) const; QString format_; bool replace_non_ascii_; bool replace_spaces_; bool replace_the_; }; #endif // SRC_CORE_ORGANISEFORMAT_H_ clementine-1.2.0+dfsg/src/core/player.cpp000066400000000000000000000436311223327513400203040ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "player.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/lastfmservice.h" #endif #include #include #include using boost::shared_ptr; Player::Player(Application* app, QObject* parent) : PlayerInterface(parent), app_(app), lastfm_(NULL), engine_(new GstEngine(app_->task_manager())), stream_change_type_(Engine::First), last_state_(Engine::Empty), volume_before_mute_(50) { 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()); #ifdef HAVE_LIBLASTFM lastfm_ = InternetModel::Service(); #endif } void Player::ReloadSettings() { engine_->ReloadSettings(); } void Player::HandleLoadResult(const UrlHandler::LoadResult& result) { 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: { // Might've been an async load, so check we're still on the same item int current_index = app_->playlist_manager()->active()->current_row(); if (current_index == -1) return; shared_ptr item = app_->playlist_manager()->active()->item_at(current_index); if (!item || item->Url() != result.original_url_) return; 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) { // Manual track changes override "Repeat track" const bool ignore_repeat_track = change & Engine::Manual; int i = app_->playlist_manager()->active()->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()) { app_->playlist_manager()->active()->StopAfter(-1); // 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); } Stop(); 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::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() { engine_->Stop(); 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()); } void Player::Previous() { PreviousItem(Engine::Manual); } void Player::PreviousItem(Engine::TrackChangeFlags change) { const bool ignore_repeat_track = change & Engine::Manual; 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) { switch (state) { case Engine::Paused: emit Paused(); break; case Engine::Playing: emit Playing(); break; 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 don't want to submit it to last.fm qLog(Info) << "Track seeked to" << nanosec << "ns - not scrobbling"; if (app_->playlist_manager()->active()->get_lastfm_status() == Playlist::LastFM_New) { app_->playlist_manager()->active()->set_lastfm_status(Playlist::LastFM_Seeked); } emit Seeked(nanosec / 1000); } void Player::SeekForward() { SeekTo(engine()->position_nanosec() / kNsecPerSec + 10); } void Player::SeekBackward() { SeekTo(engine()->position_nanosec() / kNsecPerSec - 10); } 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::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 NULL; } 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.0+dfsg/src/core/player.h000066400000000000000000000126611223327513400177500ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef PLAYER_H #define PLAYER_H #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 LastFMService; class PlayerInterface : public QObject { Q_OBJECT public: PlayerInterface(QObject* parent = 0) : 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() = 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: Player(Application* app, QObject* parent = 0); ~Player(); 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; 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(); void StopAfterCurrent(); 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_; LastFMService* lastfm_; QSettings settings_; PlaylistItemPtr current_item_; boost::scoped_ptr engine_; Engine::TrackChangeFlags stream_change_type_; Engine::State last_state_; QMap url_handlers_; QUrl loading_async_; int volume_before_mute_; }; #endif // PLAYER_H clementine-1.2.0+dfsg/src/core/potranslator.h000066400000000000000000000025071223327513400212020ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef POTRANSLATOR_H #define 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(NULL, source_text, disambiguation); } }; #endif // POTRANSLATOR_H clementine-1.2.0+dfsg/src/core/qhash_qurl.h000066400000000000000000000016311223327513400206160ustar00rootroot00000000000000/* 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 QHASH_QURL_H #define QHASH_QURL_H #include #if QT_VERSION < 0x040700 inline uint qHash(const QUrl& url) { return qHash(url.toEncoded()); } #endif #endif // QHASH_QURL_H clementine-1.2.0+dfsg/src/core/qtfslistener.cpp000066400000000000000000000024071223327513400215270ustar00rootroot00000000000000/* 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 "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.0+dfsg/src/core/qtfslistener.h000066400000000000000000000021541223327513400211730ustar00rootroot00000000000000/* 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 QTFSLISTENER_H #define QTFSLISTENER_H #include "filesystemwatcherinterface.h" #include class QtFSListener : public FileSystemWatcherInterface { Q_OBJECT public: QtFSListener(QObject* parent); virtual void AddPath(const QString& path); virtual void RemovePath(const QString& path); virtual void Clear(); private: QFileSystemWatcher watcher_; }; #endif clementine-1.2.0+dfsg/src/core/qxtglobalshortcutbackend.cpp000066400000000000000000000031661223327513400241100ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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"; foreach (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.0+dfsg/src/core/qxtglobalshortcutbackend.h000066400000000000000000000022321223327513400235460ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef QXTGLOBALSHORTCUTBACKEND_H #define QXTGLOBALSHORTCUTBACKEND_H #include "globalshortcutbackend.h" class QxtGlobalShortcut; class QxtGlobalShortcutBackend : public GlobalShortcutBackend { public: QxtGlobalShortcutBackend(GlobalShortcuts* parent = 0); protected: bool DoRegister(); void DoUnregister(); private: void AddShortcut(QAction* action); QList shortcuts_; }; #endif // QXTGLOBALSHORTCUTBACKEND_H clementine-1.2.0+dfsg/src/core/scoped_cftyperef.h000066400000000000000000000037371223327513400220040ustar00rootroot00000000000000// 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 = NULL) : object_(object) { } ~ScopedCFTypeRef() { if (object_) CFRelease(object_); } void reset(CFT object = NULL) { 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_ = NULL; return temp; } private: CFT object_; Q_DISABLE_COPY(ScopedCFTypeRef); }; #endif // BASE_MAC_SCOPED_CFTYPEREF_H_ clementine-1.2.0+dfsg/src/core/scoped_nsautorelease_pool.h000066400000000000000000000022321223327513400237050ustar00rootroot00000000000000// 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.0+dfsg/src/core/scoped_nsautorelease_pool.mm000066400000000000000000000013271223327513400240730ustar00rootroot00000000000000// 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.0+dfsg/src/core/scoped_nsobject.h000066400000000000000000000106641223327513400216210ustar00rootroot00000000000000// 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.0+dfsg/src/core/scopedgobject.h000066400000000000000000000033101223327513400212560ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_(NULL) {} explicit ScopedGObject(const ScopedGObject& other) : object_(NULL) { reset(other.object_); } ~ScopedGObject() { reset(); } ScopedGObject& operator =(const ScopedGObject& other) { reset(other.object_); return *this; } void reset(T* new_object = NULL) { if (new_object) g_object_ref(new_object); reset_without_add(new_object); } void reset_without_add(T* new_object = NULL) { 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.0+dfsg/src/core/scopedtransaction.cpp000066400000000000000000000023541223327513400225300ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/core/scopedtransaction.h000066400000000000000000000022521223327513400221720ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/core/settingsprovider.cpp000066400000000000000000000032311223327513400224130ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/core/settingsprovider.h000066400000000000000000000035461223327513400220710ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SETTINGSPROVIDER_H #define 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 // SETTINGSPROVIDER_H clementine-1.2.0+dfsg/src/core/signalchecker.cpp000066400000000000000000000031001223327513400215750ustar00rootroot00000000000000/* 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 "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.0+dfsg/src/core/signalchecker.h000066400000000000000000000025471223327513400212600ustar00rootroot00000000000000/* 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 SIGNALCHECKER_H #define 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 // SIGNALCHECKER_H clementine-1.2.0+dfsg/src/core/simpletreeitem.h000066400000000000000000000076771223327513400215170ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SIMPLETREEITEM_H #define 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 = NULL); SimpleTreeItem(int _type, T* _parent = NULL); 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(NULL), child_model(NULL), model(_model) { } template SimpleTreeItem::SimpleTreeItem(int _type, const QString& _key, T* _parent) : type(_type), key(_key), lazy_loaded(false), parent(_parent), child_model(NULL), model(_parent ? _parent->model : NULL) { 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(NULL), model(_parent ? _parent->model : NULL) { 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 ; irow --; 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 ; irow --; } template T* SimpleTreeItem::ChildByKey(const QString& key) const { foreach (T* child, children) { if (child->key == key) return child; } return NULL; } #endif // SIMPLETREEITEM_H clementine-1.2.0+dfsg/src/core/simpletreemodel.h000066400000000000000000000102761223327513400216460ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SIMPLETREEMODEL_H #define SIMPLETREEMODEL_H #include class QModelIndex; template class SimpleTreeModel : public QAbstractItemModel { public: SimpleTreeModel(T* root = 0, QObject* parent = 0); 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 // SIMPLETREEMODEL_H clementine-1.2.0+dfsg/src/core/song.cpp000066400000000000000000001064661223327513400177640ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 #ifdef HAVE_LIBLASTFM #include "internet/fixlastfm.h" #ifdef HAVE_LIBLASTFM1 #include #else #include #endif #endif #include #ifdef HAVE_LIBGPOD # include #endif #ifdef HAVE_LIBMTP # include #endif #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"; 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_; int track_; int disc_; float bpm_; int year_; 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), 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_; } 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_; } 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; } 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_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_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) { 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"); } } 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->track_ = pb.track(); d->disc_ = pb.disc(); d->bpm_ = pb.bpm(); d->year_ = pb.year(); 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(); d->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(); } } 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_track(d->track_); pb->set_disc(d->disc_); pb->set_bpm(d->bpm_); pb->set_year(d->year_); 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 tobytearray(n)(q.value(n).isNull() ? QByteArray() : q.value(n).toByteArray()) #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->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); d->url_ = QUrl::fromEncoded(tobytearray(col + 16)); 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); #undef tostr #undef toint #undef tolonglong #undef tofloat } void Song::InitFromFilePartial(const QString& filename) { d->url_ = QUrl::fromLocalFile(filename); // We currently rely on filename suffix to know if it's a music file or not. // TODO: 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") { d->valid_ = true; } else { d->valid_ = false; } } #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_ = float(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("://")) { d->url_ = QUrl(prefix + filename); } else { d->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_ = float(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 = NULL; 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_)); 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_)); #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_); } 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->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->cue_path_ == other.d->cue_path_; } 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: 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_rating(other.rating()); set_score(other.score()); set_art_manual(other.art_manual()); } clementine-1.2.0+dfsg/src/core/song.h000066400000000000000000000204551223327513400174220ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SONG_H #define 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. 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()); } // 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 #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 = NULL); // 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; int track() const; int disc() const; float bpm() const; int year() 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; 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_track(int v); void set_disc(int v); void set_bpm(float v); void set_year(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 // SONG_H clementine-1.2.0+dfsg/src/core/songloader.cpp000066400000000000000000000505121223327513400211410ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 #ifdef HAVE_AUDIOCD # include #endif #include "config.h" #include "core/concurrentrun.h" #include "core/logging.h" #include "core/song.h" #include "core/signalchecker.h" #include "core/tagreaderclient.h" #include "core/timeconstants.h" #include "internet/fixlastfm.h" #include "internet/internetmodel.h" #include "library/librarybackend.h" #include "library/sqlrow.h" #include "playlistparsers/parserbase.h" #include "playlistparsers/cueparser.h" #include "playlistparsers/playlistparser.h" #include "podcasts/podcastparser.h" #include "podcasts/podcastservice.h" #include "podcasts/podcasturlloader.h" QSet SongLoader::sRawUriSchemes; const int SongLoader::kDefaultTimeout = 5000; SongLoader::SongLoader(LibraryBackendInterface* library, 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_(NULL), is_podcast_(false), library_(library) { 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())) { // The URI scheme indicates that it can't possibly be a playlist, so add // it as a raw stream. AddAsRawStream(); return Success; } url_ = PodcastUrlLoader::FixPodcastUrl(url_); timeout_timer_->start(timeout_); return LoadRemote(); } 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 // Create gstreamer cdda element GstElement* cdda = gst_element_make_from_uri (GST_URI_SRC, "cdda://", NULL); if (cdda == NULL) { qLog(Error) << "Error while creating CDDA GstElement"; return Error; } // 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) { qLog(Error) << "Error while changing CDDA GstElement's state"; gst_element_set_state(cdda, GST_STATE_NULL); gst_object_unref(GST_OBJECT(cdda)); return Error; } // 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 Error; } for (int track_number = 1; track_number <= num_tracks; track_number++) { // Init song Song song; guint64 duration = 0; // quint64 == ulonglong and guint64 == ulong, therefore we must cast if (gst_tag_list_get_uint64 (GST_CDDA_BASE_SRC(cdda)->tracks[track_number-1].tags, GST_TAG_DURATION, &duration)) { song.set_length_nanosec((quint64)duration); } song.set_valid(true); song.set_filetype(Song::Type_Cdda); song.set_url(QUrl(QString("cdda://%1").arg(track_number))); song.set_title(QString("Track %1").arg(track_number)); song.set_track(track_number); songs_ << song; } // Generate MusicBrainz DiscId gst_tag_register_musicbrainz_tags(); GstElement *pipe = gst_pipeline_new ("pipeline"); gst_bin_add (GST_BIN (pipe), cdda); gst_element_set_state (pipe, GST_STATE_READY); gst_element_set_state (pipe, GST_STATE_PAUSED); GstMessage *msg = gst_bus_timed_pop_filtered (GST_ELEMENT_BUS (pipe), GST_CLOCK_TIME_NONE, GST_MESSAGE_TAG); GstTagList *tags = NULL; gst_message_parse_tag (msg, &tags); char *string_mb = NULL; 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(this); 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); } // Clean all the Gstreamer objects we have used: we don't need them anymore gst_object_unref(GST_OBJECT(cdda)); gst_element_set_state (pipe, GST_STATE_NULL); gst_object_unref(GST_OBJECT(pipe)); gst_object_unref(GST_OBJECT(msg)); gst_object_unref(GST_OBJECT(tags)); return Success; #else // HAVE_AUDIOCD return Error; #endif } void SongLoader::AudioCDTagsLoaded(const QString& artist, const QString& album, const MusicBrainzClient::ResultList& results) { // Remove previously added songs metadata, because there are not needed // and that we are going to fill it with new (more complete) ones songs_.clear(); int track_number = 1; foreach (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_); // We need to set url: that's how playlist will find the correct item to update song.set_url(QUrl(QString("cdda://%1").arg(track_number++))); songs_ << song; } emit LoadFinished(true); } SongLoader::Result SongLoader::LoadLocal(const QString& filename) { qLog(Debug) << "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()) { ConcurrentRun::Run(&thread_pool_, boost::bind(&SongLoader::LoadLocalDirectoryAndEmit, this, filename)); return WillLoadAsync; } // 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 Error; 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()); } if (parser) { qLog(Debug) << "Parsing using" << parser->name(); // It's a playlist! ConcurrentRun::Run(&thread_pool_, boost::bind(&SongLoader::LoadPlaylistAndEmit, this, parser, filename)); return WillLoadAsync; } // Not a playlist, so just assume it's a song QUrl url = QUrl::fromLocalFile(filename); LibraryQuery query; query.SetColumnSpec("%songs_table.ROWID, " + Song::kColumnSpec); query.AddWhere("filename", url.toEncoded()); SongList song_list; if (library_->ExecQuery(&query) && query.Next()) { // we may have many results when the file has many sections do { Song song; song.InitFromQuery(query, true); song_list << song; } while(query.Next()); } else { 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); song_list = cue_parser_->Load(&cue, matching_cue, QDir(filename.section('/', 0, -2))); } else { // it's a normal media file, load it asynchronously. TagReaderReply* reply = TagReaderClient::Instance()->ReadFile(filename); NewClosure(reply, SIGNAL(Finished(bool)), this, SLOT(LocalFileLoaded(TagReaderReply*)), reply); return WillLoadAsync; } } foreach (const Song& song, song_list) { if (song.is_valid()) { songs_ << song; } } return Success; } void SongLoader::LocalFileLoaded(TagReaderReply* reply) { reply->deleteLater(); Song song; song.InitFromProtobuf(reply->message().read_file_response().metadata()); if (song.is_valid()) { songs_ << song; } emit LoadFinished(true); } void SongLoader::EffectiveSongsLoad() { 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::LoadPlaylistAndEmit(ParserBase* parser, const QString& filename) { LoadPlaylist(parser, filename); emit LoadFinished(true); } 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::LoadLocalDirectoryAndEmit(const QString& filename) { LoadLocalDirectory(filename); emit LoadFinished(true); } 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 LoadFinished(success_); } SongLoader::Result 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. // Create the pipeline - it gets unreffed if it goes out of scope boost::shared_ptr pipeline( gst_pipeline_new(NULL), boost::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(), NULL); if (!source) { qLog(Warning) << "Couldn't create gstreamer source element for" << url_.toString(); return Error; } // Create the other elements and link them up GstElement* typefind = gst_element_factory_make("typefind", NULL); GstElement* fakesink = gst_element_factory_make("fakesink", NULL); gst_bin_add_many(GST_BIN(pipeline.get()), source, typefind, fakesink, NULL); gst_element_link_many(source, typefind, fakesink, NULL); // 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); 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_buffer_probe(pad, G_CALLBACK(DataReady), this); gst_object_unref(pad); // Start "playing" gst_element_set_state(pipeline.get(), GST_STATE_PLAYING); pipeline_ = pipeline; return WillLoadAsync; } 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); } gboolean SongLoader::DataReady(GstPad*, GstBuffer* buf, void* self) { SongLoader* instance = static_cast(self); if (instance->state_ == Finished) return true; // Append the data to the buffer instance->buffer_.append(reinterpret_cast(GST_BUFFER_DATA(buf)), GST_BUFFER_SIZE(buf)); qLog(Debug) << "Received total" << instance->buffer_.size() << "bytes"; if (instance->state_ == WaitingForMagic && (instance->buffer_.size() >= PlaylistParser::kMagicSize || !instance->IsPipelinePlaying())) { // Got enough that we can test the magic instance->MagicReady(); } return true; } 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_ = NULL; 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.0+dfsg/src/core/songloader.h000066400000000000000000000075541223327513400206160ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SONGLOADER_H #define SONGLOADER_H #include #include #include #include "song.h" #include "core/tagreaderclient.h" #include "musicbrainz/musicbrainzclient.h" #include #include class CueParser; class LibraryBackendInterface; class ParserBase; class PlaylistParser; class PodcastParser; class SongLoader : public QObject { Q_OBJECT public: SongLoader(LibraryBackendInterface* library, QObject* parent = 0); ~SongLoader(); enum Result { Success, Error, WillLoadAsync, }; 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; } Result Load(const QUrl& url); // To effectively load the songs: // when we call Load() on a directory, it will return WillLoadAsync, load the // files with only filenames and emit LoadFinished(). When LoadFinished() is // received by songloaderinserter, it will insert songs (incompletely loaded) // in playlist, and call EffectiveSongsLoad() in a background thread to // perform the real load of the songs. Next, UpdateItems() will be called on // playlist and replace the partially-loaded items by the new ones, fully // loaded. void EffectiveSongsLoad(); void EffectiveSongLoad(Song* song); Result LoadAudioCD(); signals: void LoadFinished(bool success); private slots: void Timeout(); void StopTypefind(); void AudioCDTagsLoaded(const QString& artist, const QString& album, const MusicBrainzClient::ResultList& results); void LocalFileLoaded(TagReaderReply* reply); private: enum State { WaitingForType, WaitingForMagic, WaitingForData, Finished, }; Result LoadLocal(const QString& filename); Result LoadLocalPartial(const QString& filename); void LoadLocalDirectory(const QString& filename); void LoadPlaylist(ParserBase* parser, const QString& filename); void LoadLocalDirectoryAndEmit(const QString& filename); void LoadPlaylistAndEmit(ParserBase* parser, const QString& filename); void AddAsRawStream(); Result LoadRemote(); // GStreamer callbacks static void TypeFound(GstElement* typefind, uint probability, GstCaps* caps, void* self); static gboolean DataReady(GstPad*, GstBuffer* buf, void* 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 int timeout_; State state_; bool success_; ParserBase* parser_; QString mime_type_; bool is_podcast_; QByteArray buffer_; LibraryBackendInterface* library_; boost::shared_ptr pipeline_; QThreadPool thread_pool_; }; #endif // SONGLOADER_H clementine-1.2.0+dfsg/src/core/stylesheetloader.cpp000066400000000000000000000075201223327513400223650ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/core/stylesheetloader.h000066400000000000000000000030571223327513400220330ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef STYLESHEETLOADER_H #define STYLESHEETLOADER_H #include #include #include #include class StyleSheetLoader : public QObject { public: StyleSheetLoader(QObject* parent = 0); // 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 // STYLESHEETLOADER_H clementine-1.2.0+dfsg/src/core/tagreaderclient.cpp000066400000000000000000000162301223327513400221400ustar00rootroot00000000000000/* 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 "tagreaderclient.h" #include #include #include #include #include #include const char* TagReaderClient::kWorkerExecutableName = "clementine-tagreader"; TagReaderClient* TagReaderClient::sInstance = NULL; 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) { foreach (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) { foreach (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.0+dfsg/src/core/tagreaderclient.h000066400000000000000000000054711223327513400216120ustar00rootroot00000000000000/* 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 TAGREADERCLIENT_H #define 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: TagReaderClient(QObject* parent = 0); 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: 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 // TAGREADERCLIENT_H clementine-1.2.0+dfsg/src/core/taskmanager.cpp000066400000000000000000000053761223327513400213110ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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; foreach (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.0+dfsg/src/core/taskmanager.h000066400000000000000000000036471223327513400207550ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef TASKMANAGER_H #define TASKMANAGER_H #include #include #include class TaskManager : public QObject { Q_OBJECT public: TaskManager(QObject* parent = 0); 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 // TASKMANAGER_H clementine-1.2.0+dfsg/src/core/timeconstants.h000066400000000000000000000023211223327513400213370ustar00rootroot00000000000000/* 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 TIMECONSTANTS_H #define 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 // TIMECONSTANTS_H clementine-1.2.0+dfsg/src/core/ubuntuunityhack.cpp000066400000000000000000000057271223327513400222560ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/core/ubuntuunityhack.h000066400000000000000000000022051223327513400217070ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef UBUNTUUNITYHACK_H #define UBUNTUUNITYHACK_H #include class QProcess; class UbuntuUnityHack : public QObject { Q_OBJECT public: UbuntuUnityHack(QObject* parent = NULL); private slots: void GetFinished(int exit_code); void GetError(); private: static const char* kGSettingsFileName; static const char* kUnityPanel; static const char* kUnitySystrayWhitelist; }; #endif // UBUNTUUNITYHACK_H clementine-1.2.0+dfsg/src/core/urlhandler.cpp000066400000000000000000000021241223327513400211400ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/core/urlhandler.h000066400000000000000000000054141223327513400206120ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef URLHANDLER_H #define URLHANDLER_H #include #include #include class UrlHandler : public QObject { Q_OBJECT public: UrlHandler(QObject* parent = 0); // 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 = QUrl(), 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 // URLHANDLER_H clementine-1.2.0+dfsg/src/core/utilities.cpp000066400000000000000000000416441223327513400210250ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "core/logging.h" #include "timeconstants.h" #include "sha2.h" #if defined(Q_OS_UNIX) # include #elif defined(Q_OS_WIN32) # include # include #endif #ifdef Q_OS_LINUX # 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" # include #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); else ret.sprintf("%d:%02d", minutes, seconds); return ret; } QString PrettyTimeNanosec(qint64 nanoseconds) { return PrettyTime(nanoseconds / kNsecPerSec); } QString WordyTime(quint64 seconds) { quint64 days = seconds / (60*60*24); // TODO: 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", float(bytes) / 1000); else if (bytes <= 1000*1000*1000) ret.sprintf("%.1f MB", float(bytes) / (1000*1000)); else ret.sprintf("%.1f GB", float(bytes) / (1000*1000*1000)); } 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(), NULL, &ret, NULL) != 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, NULL, NULL) != 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; tempfile.open(); file = tempfile.fileName(); } return file; } void RemoveRecursive(const QString& path) { QDir dir(path); foreach (const QString& child, dir.entryList(QDir::NoDotAndDotDot | QDir::Dirs | QDir::Hidden)) RemoveRecursive(path + "/" + child); foreach (const QString& child, dir.entryList(QDir::NoDotAndDotDot | QDir::Files | QDir::Hidden)) QFile::remove(path + "/" + child); dir.rmdir(path); } 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); foreach (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; } } foreach (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(); boost::scoped_array 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: { #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 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 qint32 GetMacVersion() { SInt32 minor_version; Gestalt(gestaltSystemVersionMinor, &minor_version); return minor_version; } // 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; foreach (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 QDesktopServices::openUrl(QUrl::fromLocalFile(directory)); #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, char(0x36)); QByteArray outer_padding(kBlockSize, char(0x5c)); for (int i=0 ; i(data.constData()), data.length()); QByteArray ret(SHA256_DIGEST_LENGTH, '\0'); SHA256_Final(reinterpret_cast(ret.data()), &context); return ret; } 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) { // This sucks but we need it because some podcasts don't quite follow the // spec properly - they might have 1-digit hour numbers for example. QRegExp re("([a-zA-Z]{3}),? (\\d{1,2}) ([a-zA-Z]{3}) (\\d{4}) (\\d{1,2}):(\\d{1,2}):(\\d{1,2})"); if (re.indexIn(text) == -1) return QDateTime(); return QDateTime( QDate::fromString(QString("%1 %2 %3 %4").arg(re.cap(1), re.cap(3), re.cap(2), re.cap(4)), Qt::TextDate), QTime(re.cap(5).toInt(), re.cap(6).toInt(), re.cap(7).toInt())); } 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"); 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; } } // 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.0+dfsg/src/core/utilities.h000066400000000000000000000121461223327513400204650ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef UTILITIES_H #define UTILITIES_H #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(); void 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); // 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); enum ConfigPath { Path_Root, Path_AlbumCovers, Path_NetworkCache, Path_GstreamerRegistry, Path_DefaultMusicLibrary, Path_LocalSpotifyBlob, Path_MoodbarCache, Path_CacheRoot, }; QString GetConfigPath(ConfigPath config); // Returns the minor version of OS X (ie. 6 for Snow Leopard, 7 for Lion). qint32 GetMacVersion(); // 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(); } class ScopedWCharArray { public: 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_; boost::scoped_array data_; }; #endif // UTILITIES_H clementine-1.2.0+dfsg/src/covers/000077500000000000000000000000001223327513400166465ustar00rootroot00000000000000clementine-1.2.0+dfsg/src/covers/albumcoverexporter.cpp000066400000000000000000000043411223327513400233040ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "coverexportrunnable.h" #include "core/song.h" #include #include 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.0+dfsg/src/covers/albumcoverexporter.h000066400000000000000000000033051223327513400227500ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef ALBUMCOVEREXPORTER_H #define 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: AlbumCoverExporter(QObject* parent = 0); 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 // ALBUMCOVEREXPORTER_H clementine-1.2.0+dfsg/src/covers/albumcoverfetcher.cpp000066400000000000000000000075271223327513400230650ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "albumcoverfetchersearch.h" #include "core/network.h" #include 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(); foreach (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.0+dfsg/src/covers/albumcoverfetcher.h000066400000000000000000000070331223327513400225220ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef ALBUMCOVERFETCHER_H #define ALBUMCOVERFETCHER_H #include "coversearchstatistics.h" #include #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 = 0, 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 // ALBUMCOVERFETCHER_H clementine-1.2.0+dfsg/src/covers/albumcoverfetchersearch.cpp000066400000000000000000000173571223327513400242550ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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() { foreach (int id, pending_requests_.keys()) { pending_requests_.take(id)->CancelSearch(id); } AllProvidersFinished(); } void AlbumCoverFetcherSearch::Start(CoverProviders* cover_providers) { foreach(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 ; iname(); } // 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 ; iget(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(float(image.width() * image.height())) / kTargetSize; // A 1:1 image scores 1.0, anything else scores less const float aspect_score = 1.0 - float(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()) { foreach (RedirectFollower* reply, pending_image_loads_.keys()) { reply->abort(); } pending_image_loads_.clear(); } } clementine-1.2.0+dfsg/src/covers/albumcoverfetchersearch.h000066400000000000000000000061151223327513400237100ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef ALBUMCOVERFETCHERSEARCH_H #define 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 // ALBUMCOVERFETCHERSEARCH_H clementine-1.2.0+dfsg/src/covers/albumcoverloader.cpp000066400000000000000000000216151223327513400227050ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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/internetmodel.h" #include "internet/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://")) { 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.0+dfsg/src/covers/albumcoverloader.h000066400000000000000000000060261223327513400223510ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef ALBUMCOVERLOADER_H #define 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: AlbumCoverLoader(QObject* parent = 0); 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 // ALBUMCOVERLOADER_H clementine-1.2.0+dfsg/src/covers/albumcoverloaderoptions.cpp000066400000000000000000000014131223327513400243130ustar00rootroot00000000000000/* 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 "albumcoverloaderoptions.h" clementine-1.2.0+dfsg/src/covers/albumcoverloaderoptions.h000066400000000000000000000021601223327513400237600ustar00rootroot00000000000000/* 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 ALBUMCOVERLOADEROPTIONS_H #define 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 // ALBUMCOVERLOADEROPTIONS_H clementine-1.2.0+dfsg/src/covers/amazoncoverprovider.cpp000066400000000000000000000112701223327513400234520ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "core/closure.h" #include "core/logging.h" #include "core/network.h" #include "core/utilities.h" #include #include #include #include // 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 foreach (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.0+dfsg/src/covers/amazoncoverprovider.h000066400000000000000000000027641223327513400231270ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef AMAZONCOVERPROVIDER_H #define AMAZONCOVERPROVIDER_H #include "coverprovider.h" #include class QNetworkAccessManager; class AmazonCoverProvider : public CoverProvider { Q_OBJECT public: AmazonCoverProvider(QObject* parent = NULL); 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 // AMAZONCOVERPROVIDER_H clementine-1.2.0+dfsg/src/covers/coverexportrunnable.cpp000066400000000000000000000136301223327513400234640ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "core/song.h" #include "core/tagreaderclient.h" #include #include 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.0+dfsg/src/covers/coverexportrunnable.h000066400000000000000000000027571223327513400231410ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef COVEREXPORTRUNNABLE_H #define 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 // COVEREXPORTRUNNABLE_H clementine-1.2.0+dfsg/src/covers/coverprovider.cpp000066400000000000000000000015441223327513400222470ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/covers/coverprovider.h000066400000000000000000000034161223327513400217140ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef COVERPROVIDER_H #define 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: 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 // COVERPROVIDER_H clementine-1.2.0+dfsg/src/covers/coverproviders.cpp000066400000000000000000000035611223327513400224330ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "coverprovider.h" #include "coverproviders.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.0+dfsg/src/covers/coverproviders.h000066400000000000000000000034061223327513400220760ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef COVERPROVIDERS_H #define 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: CoverProviders(QObject* parent = NULL); // 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 // COVERPROVIDERS_H clementine-1.2.0+dfsg/src/covers/coversearchstatistics.cpp000066400000000000000000000035661223327513400240030ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_; foreach (const QString& key, other.chosen_images_by_provider_.keys()) { chosen_images_by_provider_[key] += other.chosen_images_by_provider_[key]; } foreach (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.0+dfsg/src/covers/coversearchstatistics.h000066400000000000000000000024461223327513400234440ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef COVERSEARCHSTATISTICS_H #define 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 // COVERSEARCHSTATISTICS_H clementine-1.2.0+dfsg/src/covers/coversearchstatisticsdialog.cpp000066400000000000000000000060031223327513400251500ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_)); foreach (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.0+dfsg/src/covers/coversearchstatisticsdialog.h000066400000000000000000000025111223327513400246150ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef COVERSEARCHSTATISTICSDIALOG_H #define COVERSEARCHSTATISTICSDIALOG_H #include #include "coversearchstatistics.h" class Ui_CoverSearchStatisticsDialog; class QVBoxLayout; class CoverSearchStatisticsDialog : public QDialog { Q_OBJECT public: CoverSearchStatisticsDialog(QWidget* parent = 0); ~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 // COVERSEARCHSTATISTICSDIALOG_H clementine-1.2.0+dfsg/src/covers/coversearchstatisticsdialog.ui000066400000000000000000000040771223327513400250140ustar00rootroot00000000000000 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.0+dfsg/src/covers/currentartloader.cpp000066400000000000000000000050601223327513400227330ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "core/application.h" #include "covers/albumcoverloader.h" #include "playlist/playlistmanager.h" #include #include #include 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_->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(); 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.0+dfsg/src/covers/currentartloader.h000066400000000000000000000034041223327513400224000ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef CURRENTARTLOADER_H #define CURRENTARTLOADER_H #include "core/song.h" #include "covers/albumcoverloaderoptions.h" #include #include class Application; class QImage; class QTemporaryFile; class CurrentArtLoader : public QObject { Q_OBJECT public: CurrentArtLoader(Application* app, QObject* parent = 0); ~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_; boost::scoped_ptr temp_art_; boost::scoped_ptr temp_art_thumbnail_; quint64 id_; Song last_song_; }; #endif // CURRENTARTLOADER_H clementine-1.2.0+dfsg/src/covers/discogscoverprovider.cpp000066400000000000000000000120231223327513400236150ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, Martin Björklund Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "discogscoverprovider.h" #include "core/closure.h" #include "core/logging.h" #include "core/network.h" #include "core/utilities.h" #include #include const char* DiscogsCoverProvider::kSearchUrl = "http://api.discogs.com/database/search"; DiscogsCoverProvider::DiscogsCoverProvider(QObject* parent) : CoverProvider("Discogs", parent), network_(new NetworkAccessManager(this)) { } bool DiscogsCoverProvider::StartSearch(const QString& artist, const QString& album, int id) { DiscogsCoverSearchContext* ctx = new DiscogsCoverSearchContext; ctx->id = id; ctx->artist = artist; ctx->album = album; ctx->state = DiscogsCoverSearchContext::State_Init; pending_requests_.insert(id, ctx); SendSearchRequest(ctx); return true; } void DiscogsCoverProvider::CancelSearch(int id) { qLog(Debug) << "Discogs: cancel search id:" << id; delete pending_requests_.take(id); } // Send the search request using Discog's HTTP-based API. void DiscogsCoverProvider::SendSearchRequest(DiscogsCoverSearchContext* ctx) { typedef QPair Arg; typedef QList ArgList; typedef QPair EncodedArg; typedef QList EncodedArgList; QUrl url(kSearchUrl); QString type; switch (ctx->state) { case DiscogsCoverSearchContext::State_Init: type = "master"; ctx->state = DiscogsCoverSearchContext::State_MastersRequested; break; case DiscogsCoverSearchContext::State_MastersRequested: type = "release"; ctx->state = DiscogsCoverSearchContext::State_ReleasesRequested; break; default: EndSearch(ctx); return; } ArgList args = ArgList(); if (!ctx->artist.isEmpty()) { args.append(Arg("artist", ctx->artist.toLower())); } if (!ctx->album.isEmpty()) { args.append(Arg("release_title", ctx->album.toLower())); } args.append(Arg("type", type)); EncodedArgList encoded_args; foreach (const Arg& arg, args) { EncodedArg encoded_arg(QUrl::toPercentEncoding(arg.first), QUrl::toPercentEncoding(arg.second)); encoded_args << encoded_arg; } url.setEncodedQueryItems(encoded_args); qLog(Debug) << "Discogs: send search request for id:" << ctx->id << "url: " << url; QNetworkReply* reply = network_->get(QNetworkRequest(url)); NewClosure(reply, SIGNAL(finished()), this, SLOT(HandleSearchReply(QNetworkReply*, int)), reply, ctx->id); } // Parse the reply from a search void DiscogsCoverProvider::HandleSearchReply(QNetworkReply* reply, int id) { reply->deleteLater(); DiscogsCoverSearchContext* ctx; if (!pending_requests_.contains(id)) { // the request was cancelled while we were waiting for the reply qLog(Debug) << "Discogs: got reply for cancelled request" << id; return; } ctx = pending_requests_.value(id); QJson::Parser parser; bool ok; bool found = false; QVariantMap reply_map = parser.parse(reply, &ok).toMap(); if (!ok || !reply_map.contains("results")) { // this is an error; either parse error or bad response from the server EndSearch(ctx); return; } QVariantList results = reply_map["results"].toList(); foreach (const QVariant& result, results) { QVariantMap result_map = result.toMap(); // In order to use less round-trips, we cheat here. Instead of // following the "resource_url", and then scan all images in the // resource, we go directly to the largest primary image by // constructing the primary image's url from the thmub's url. if (result_map.contains("thumb")) { CoverSearchResult cover_result; cover_result.image_url = QUrl(result_map["thumb"].toString().replace("R-90-", "R-")); if (result_map.contains("title")) { cover_result.description = result_map["title"].toString(); } ctx->results.append(cover_result); found = true; } } if (found) { EndSearch(ctx); return; } // otherwise, no results switch (ctx->state) { case DiscogsCoverSearchContext::State_MastersRequested: // search again, this time for releases SendSearchRequest(ctx); break; default: EndSearch(ctx); break; } } void DiscogsCoverProvider::EndSearch(DiscogsCoverSearchContext* ctx) { (void) pending_requests_.remove(ctx->id); emit SearchFinished(ctx->id, ctx->results); delete ctx; } clementine-1.2.0+dfsg/src/covers/discogscoverprovider.h000066400000000000000000000035431223327513400232710ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2012, Martin Björklund Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef DISCOGSCOVERPROVIDER_H #define DISCOGSCOVERPROVIDER_H #include "coverprovider.h" #include class QNetworkAccessManager; // This struct represents a single search-for-cover request. It identifies // and describes the request. struct DiscogsCoverSearchContext { enum State { State_Init, State_MastersRequested, State_ReleasesRequested }; // the unique request identifier int id; // the search query QString artist; QString album; State state; CoverSearchResults results; }; Q_DECLARE_METATYPE(DiscogsCoverSearchContext) class DiscogsCoverProvider : public CoverProvider { Q_OBJECT public: DiscogsCoverProvider(QObject* parent = NULL); static const char* kSearchUrl; bool StartSearch(const QString& artist, const QString& album, int id); void CancelSearch(int id); private slots: void HandleSearchReply(QNetworkReply* reply, int id); private: QNetworkAccessManager* network_; QHash pending_requests_; void SendSearchRequest(DiscogsCoverSearchContext* ctx); void EndSearch(DiscogsCoverSearchContext* ctx); }; #endif // DISCOGSCOVERPROVIDER_H clementine-1.2.0+dfsg/src/covers/kittenloader.cpp000066400000000000000000000050761223327513400220470ustar00rootroot00000000000000#include "kittenloader.h" #include #include #include #include "core/closure.h" #include "core/network.h" const char* KittenLoader::kFlickrKittenUrl = "http://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 = "http://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.0+dfsg/src/covers/kittenloader.h000066400000000000000000000010631223327513400215040ustar00rootroot00000000000000#ifndef KITTENLOADER_H #define KITTENLOADER_H #include "albumcoverloader.h" #include #include class QNetworkReply; class KittenLoader : public AlbumCoverLoader { Q_OBJECT public: KittenLoader(QObject* parent = 0); 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 clementine-1.2.0+dfsg/src/covers/lastfmcoverprovider.cpp000066400000000000000000000041721223327513400234560ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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/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"); foreach (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.0+dfsg/src/covers/lastfmcoverprovider.h000066400000000000000000000024471223327513400231260ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef LASTFMCOVERPROVIDER_H #define 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: 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 // LASTFMCOVERPROVIDER_H clementine-1.2.0+dfsg/src/covers/musicbrainzcoverprovider.cpp000066400000000000000000000074161223327513400245220ustar00rootroot00000000000000/* 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 "musicbrainzcoverprovider.h" #include #include #include #include "core/closure.h" #include "core/network.h" using std::mem_fun; namespace { static const char* kReleaseSearchUrl = "http://musicbrainz.org/ws/2/release/"; static const char* kAlbumCoverUrl = "http://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()); } } } foreach (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; foreach (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); foreach (QNetworkReply* reply, replies) { reply->abort(); reply->deleteLater(); } image_checks_.remove(id); } clementine-1.2.0+dfsg/src/covers/musicbrainzcoverprovider.h000066400000000000000000000026521223327513400241640ustar00rootroot00000000000000/* 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 MUSICBRAINZCOVERPROVIDER_H #define MUSICBRAINZCOVERPROVIDER_H #include "coverprovider.h" #include class QNetworkAccessManager; class QNetworkReply; class MusicbrainzCoverProvider : public CoverProvider { Q_OBJECT public: MusicbrainzCoverProvider(QObject* parent = 0); // 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 // MUSICBRAINZCOVERPROVIDER_H clementine-1.2.0+dfsg/src/dbus/000077500000000000000000000000001223327513400163025ustar00rootroot00000000000000clementine-1.2.0+dfsg/src/dbus/metatypes.h000066400000000000000000000002121223327513400204610ustar00rootroot00000000000000#ifndef DBUSMETATYPES_H #define DBUSMETATYPES_H #include Q_DECLARE_METATYPE(QList); #endif // DBUSMETATYPES_H clementine-1.2.0+dfsg/src/dbus/org.freedesktop.Avahi.EntryGroup.xml000066400000000000000000000070701223327513400252750ustar00rootroot00000000000000 clementine-1.2.0+dfsg/src/dbus/org.freedesktop.Avahi.Server.xml000066400000000000000000000170451223327513400244300ustar00rootroot00000000000000 clementine-1.2.0+dfsg/src/dbus/org.freedesktop.MediaPlayer.player.xml000066400000000000000000000036751223327513400256260ustar00rootroot00000000000000 clementine-1.2.0+dfsg/src/dbus/org.freedesktop.MediaPlayer.root.xml000066400000000000000000000010731223327513400253030ustar00rootroot00000000000000 clementine-1.2.0+dfsg/src/dbus/org.freedesktop.MediaPlayer.tracklist.xml000066400000000000000000000022561223327513400263240ustar00rootroot00000000000000 clementine-1.2.0+dfsg/src/dbus/org.freedesktop.Notifications.xml000066400000000000000000000024431223327513400247400ustar00rootroot00000000000000 clementine-1.2.0+dfsg/src/dbus/org.freedesktop.UDisks.Device.xml000066400000000000000000004056571223327513400245450ustar00rootroot00000000000000 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.0+dfsg/src/dbus/org.freedesktop.UDisks.xml000066400000000000000000001314301223327513400233300ustar00rootroot00000000000000 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.0+dfsg/src/dbus/org.gnome.SettingsDaemon.MediaKeys.xml000066400000000000000000000011331223327513400255120ustar00rootroot00000000000000 " clementine-1.2.0+dfsg/src/dbus/org.mpris.MediaPlayer2.Player.xml000066400000000000000000000032151223327513400244550ustar00rootroot00000000000000 clementine-1.2.0+dfsg/src/dbus/org.mpris.MediaPlayer2.Playlists.xml000066400000000000000000000023231223327513400252040ustar00rootroot00000000000000 clementine-1.2.0+dfsg/src/dbus/org.mpris.MediaPlayer2.TrackList.xml000066400000000000000000000030451223327513400251220ustar00rootroot00000000000000 clementine-1.2.0+dfsg/src/dbus/org.mpris.MediaPlayer2.xml000066400000000000000000000014231223327513400232210ustar00rootroot00000000000000 clementine-1.2.0+dfsg/src/dbus/org.wiimotedev.deviceEvents.xml000066400000000000000000000013271223327513400244140ustar00rootroot00000000000000 clementine-1.2.0+dfsg/src/devices/000077500000000000000000000000001223327513400167675ustar00rootroot00000000000000clementine-1.2.0+dfsg/src/devices/cddadevice.cpp000066400000000000000000000140671223327513400215560ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "core/timeconstants.h" #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_(NULL), cdio_(NULL) { } CddaDevice::~CddaDevice(){ if (cdio_) cdio_destroy(cdio_); } void CddaDevice::Init() { QMutexLocker locker(&mutex_init_); song_count_ = 0; // Reset song count, in case it was already set cdio_ = cdio_open (url_.path().toLocal8Bit().constData(), DRIVER_DEVICE); if (cdio_ == NULL) { return; } // Create gstreamer cdda element cdda_ = gst_element_make_from_uri (GST_URI_SRC, "cdda://", NULL); if (cdda_ == NULL) { model_->Reset(); return; } GST_CDDA_BASE_SRC(cdda_)->device = g_strdup (url_.path().toLocal8Bit().constData()); // 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) { model_->Reset(); 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"; model_->Reset(); gst_object_unref(GST_OBJECT(cdda_)); return; } SongList songs; for (int track_number = 1; track_number <= num_tracks; track_number++) { // Init song Song song; guint64 duration = 0; // quint64 == ulonglong and guint64 == ulong, therefore we must cast if (gst_tag_list_get_uint64 (GST_CDDA_BASE_SRC(cdda_)->tracks[track_number-1].tags, GST_TAG_DURATION, &duration)) { song.set_length_nanosec((quint64)duration); } song.set_id(track_number); song.set_valid(true); song.set_filetype(Song::Type_Cdda); song.set_url(QUrl(QString("cdda://%1/%2").arg(url_.path()).arg(track_number))); song.set_title(QString("Track %1").arg(track_number)); song.set_track(track_number); songs << song; } song_count_ = num_tracks; connect(this, SIGNAL(SongsDiscovered(const SongList&)), model_, SLOT(SongsDiscovered(const SongList&))); emit SongsDiscovered(songs); // Generate MusicBrainz DiscId gst_tag_register_musicbrainz_tags(); GstElement *pipe = gst_pipeline_new ("pipeline"); gst_bin_add (GST_BIN (pipe), cdda_); gst_element_set_state (pipe, GST_STATE_READY); gst_element_set_state (pipe, GST_STATE_PAUSED); GstMessage *msg = gst_bus_timed_pop_filtered (GST_ELEMENT_BUS (pipe), GST_CLOCK_TIME_NONE, GST_MESSAGE_TAG); GstTagList *tags = NULL; gst_message_parse_tag (msg, &tags); char *string_mb = NULL; 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(this); 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); } // Clean all the Gstreamer objects we have used: we don't need them anymore gst_element_set_state (pipe, GST_STATE_NULL); // This will also cause cdda_ to be unref'd. gst_object_unref(GST_OBJECT(pipe)); gst_object_unref(GST_OBJECT(msg)); gst_tag_list_free(tags); } void CddaDevice::AudioCDTagsLoaded(const QString& artist, const QString& album, const MusicBrainzClient::ResultList& results) { MusicBrainzClient *musicbrainz_client = qobject_cast(sender()); musicbrainz_client->deleteLater(); SongList songs; int track_number = 1; if (results.size() == 0) return; model_->Reset(); foreach (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); // We need to set url: that's how playlist will find the correct item to update song.set_url(QUrl(QString("cdda://%1/%2").arg(unique_id()).arg(track_number++))); songs << song; } connect(this, SIGNAL(SongsDiscovered(const SongList&)), model_, SLOT(SongsDiscovered(const SongList&))); emit SongsDiscovered(songs); song_count_ = songs.size(); } void CddaDevice::Refresh() { if ((cdio_ && cdda_) && /* already init... */ cdio_get_media_changed(cdio_) != 1 /* ...and hasn't change since last time */) { return; } // Check if mutex is already token (i.e. init is already taking place) if (!mutex_init_.tryLock()) { return; } mutex_init_.unlock(); Init(); } clementine-1.2.0+dfsg/src/devices/cddadevice.h000066400000000000000000000034711223327513400212200ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "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 AudioCDTagsLoaded(const QString& artist, const QString& album, const MusicBrainzClient::ResultList& results); private: GstElement *cdda_; CdIo_t *cdio_; QMutex mutex_init_; }; #endif clementine-1.2.0+dfsg/src/devices/cddalister.cpp000066400000000000000000000065531223327513400216220ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 != NULL; ++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.0+dfsg/src/devices/cddalister.h000066400000000000000000000030451223327513400212600ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 #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.0+dfsg/src/devices/connecteddevice.cpp000066400000000000000000000100311223327513400226100ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_(NULL), model_(NULL), 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_->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.0+dfsg/src/devices/connecteddevice.h000066400000000000000000000051331223327513400222640ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "core/musicstorage.h" #include "core/song.h" #include #include #include #include class Application; class Database; class DeviceLister; class DeviceManager; class LibraryBackend; class LibraryModel; class ConnectedDevice : public QObject, public virtual MusicStorage, public boost::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.0+dfsg/src/devices/devicedatabasebackend.cpp000066400000000000000000000107521223327513400237340ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/devices/devicedatabasebackend.h000066400000000000000000000033021223327513400233720ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); 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.0+dfsg/src/devices/devicekitlister.cpp000066400000000000000000000211031223327513400226620ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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; foreach (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 foreach (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 { foreach (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.0+dfsg/src/devices/devicekitlister.h000066400000000000000000000055211223327513400223350ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "devicelister.h" #include #include #include 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: boost::scoped_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.0+dfsg/src/devices/devicelister.cpp000066400000000000000000000125221223327513400221570ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_(NULL) { } 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.0+dfsg/src/devices/devicelister.h000066400000000000000000000061221223327513400216230ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 #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.0+dfsg/src/devices/devicemanager.cpp000066400000000000000000000542341223327513400222750ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 boost::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; foreach (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; foreach (const QString& icon_name, icon_names) { icons << icon_name; } LoadIcon(icons, friendly_name_); QStringList unique_ids = dev.unique_id_.split(','); foreach (const QString& id, unique_ids) { backends_ << Backend(NULL, 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 foreach (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 = NULL; for (int i=0 ; ipriority() > 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() { foreach (DeviceLister* lister, listers_) { lister->ShutDown(); delete lister; } backend_->deleteLater(); } void DeviceManager::LoadAllDevices() { Q_ASSERT(QThread::currentThread() != qApp->thread()); DeviceDatabaseBackend::DeviceList devices = backend_->GetAllDevices(); foreach (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_)) { boost::scoped_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& urls) const { if (urls.isEmpty()) return -1; for (int i=0 ; i device_urls = backend.lister_->MakeDeviceUrls(backend.unique_id_); foreach (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_ = NULL; 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); foreach (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 } boost::shared_ptr DeviceManager::Connect(int row) { DeviceInfo& info = devices_[row]; if (info.device_) // Already connected return info.device_; boost::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; foreach (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(NULL, 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(NULL, 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; foreach (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; } boost::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); foreach (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 tasks = app_->task_manager()->GetTasks(); QList finished_tasks = active_tasks_.values(); foreach (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); } foreach (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.0+dfsg/src/devices/devicemanager.h000066400000000000000000000126751223327513400217450ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "library/librarymodel.h" #include #include #include #include class Application; class ConnectedDevice; class Database; class DeviceLister; class DeviceStateFilterModel; class TaskManager; class DeviceManager : public QAbstractListModel { Q_OBJECT public: DeviceManager(Application* app, QObject* parent = 0); ~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; boost::shared_ptr GetConnectedDevice(int row) const; int FindDeviceById(const QString& id) const; int FindDeviceByUrl(const QList& url) const; // Actions on devices boost::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 = NULL, const QString& id = QString()) : lister_(lister), unique_id_(id) {} DeviceLister* lister_; // NULL 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 boost::shared_ptr device_; // NULL 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; foreach (const QString& scheme, schemes) { device_classes_.insert(scheme, obj); } } #endif // DEVICEMANAGER_H clementine-1.2.0+dfsg/src/devices/deviceproperties.cpp000066400000000000000000000234201223327513400230500ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "deviceproperties.h" #include "ui_deviceproperties.h" #include "core/utilities.h" #include "transcoder/transcoder.h" #include "ui/iconloader.h" #include #include #include #include DeviceProperties::DeviceProperties(QWidget *parent) : QDialog(parent), ui_(new Ui_DeviceProperties), manager_(NULL), 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"; foreach (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 foreach (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 ; iicon->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 foreach (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)); foreach (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()); boost::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(boost::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()); manager_->SetDeviceOptions(index_.row(), ui_->name->text(), ui_->icon->currentItem()->data(Qt::UserRole).toString(), 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(); foreach (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.0+dfsg/src/devices/deviceproperties.h000066400000000000000000000030551223327513400225170ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); ~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.0+dfsg/src/devices/deviceproperties.ui000066400000000000000000000343501223327513400227070ustar00rootroot00000000000000 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.0+dfsg/src/devices/devicestatefiltermodel.cpp000066400000000000000000000032631223327513400242260ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/devices/devicestatefiltermodel.h000066400000000000000000000025251223327513400236730ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/devices/deviceview.cpp000066400000000000000000000345631223327513400216400ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "deviceproperties.h" #include "deviceview.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" #include #include #include #include #include #include #include #include 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_(NULL), merged_model_(NULL), sort_model_(NULL), properties_dialog_(new DeviceProperties), device_menu_(NULL), library_menu_(NULL) { 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_ == NULL); 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()) { boost::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) { boost::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)) { boost::scoped_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; foreach (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; boost::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; foreach (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.0+dfsg/src/devices/deviceview.h000066400000000000000000000054361223327513400213020ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "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 = 0); ~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_; boost::scoped_ptr properties_dialog_; boost::scoped_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.0+dfsg/src/devices/filesystemdevice.cpp000066400000000000000000000056631223327513400230510ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/devices/filesystemdevice.h000066400000000000000000000026131223327513400225060ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/devices/giolister.cpp000066400000000000000000000365251223327513400215070ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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" 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 = NULL; 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(boost::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. foreach (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 = NULL; GMount* actual_mount = g_file_find_enclosing_mount(root, NULL, &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 = NULL; GFileInfo* info = g_file_query_filesystem_info(root, G_FILE_ATTRIBUTE_FILESYSTEM_SIZE "," G_FILE_ATTRIBUTE_FILESYSTEM_FREE "," G_FILE_ATTRIBUTE_FILESYSTEM_TYPE, NULL, &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 = NULL; info = g_file_query_info(root, G_FILE_ATTRIBUTE_ID_FILESYSTEM, G_FILE_QUERY_INFO_NONE, NULL, &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 { foreach (const DeviceInfo& info, devices_) { if (info.mount == mount) return info.unique_id(); } return QString(); } QString GioLister::FindUniqueIdByVolume(GVolume* volume) const { foreach (const DeviceInfo& info, devices_) { if (info.volume == volume) return info.unique_id(); } return QString(); } void GioLister::VolumeEjectFinished(GObject *object, GAsyncResult *result, gpointer) { OperationFinished(boost::bind( g_volume_eject_with_operation_finish, _1, _2, _3), object, result); } void GioLister::MountEjectFinished(GObject *object, GAsyncResult *result, gpointer) { OperationFinished(boost::bind( g_mount_eject_with_operation_finish, _1, _2, _3), object, result); } void GioLister::MountUnmountFinished(GObject *object, GAsyncResult *result, gpointer) { OperationFinished(boost::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, NULL, NULL, (GAsyncReadyCallback) VolumeEjectFinished, NULL); g_object_unref(info.volume); return; } } if (g_mount_can_eject(info.mount)) { g_mount_eject_with_operation( info.mount, G_MOUNT_UNMOUNT_NONE, NULL, NULL, (GAsyncReadyCallback) MountEjectFinished, NULL); } else if (g_mount_can_unmount(info.mount)) { g_mount_unmount_with_operation( info.mount, G_MOUNT_UNMOUNT_NONE, NULL, NULL, (GAsyncReadyCallback) MountUnmountFinished, NULL); } } 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 = NULL; GFileInfo* info = g_file_query_filesystem_info( root, G_FILE_ATTRIBUTE_FILESYSTEM_FREE, NULL, &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, NULL, NULL, VolumeMountFinished, NULL); emit DeviceMounted(id, request_id, true); } clementine-1.2.0+dfsg/src/devices/giolister.h000066400000000000000000000103511223327513400211410ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/devices/gpoddevice.cpp000066400000000000000000000146751223327513400216210ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_(NULL), db_(NULL) { } 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_ = NULL; } 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 = NULL; 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 = NULL; 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(NULL); } 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 = NULL; for (GList* tracks = db_->tracks ; tracks != NULL ; tracks = tracks->next) { Itdb_Track* t = static_cast(tracks->data); if (t->ipod_path == ipod_filename) { track = t; break; } } if (track == NULL) { qLog(Warning) << "Couldn't find song" << path << "in iTunesDB"; return false; } // Remove the track from all playlists for (GList* playlists = db_->playlists ; playlists != NULL ; 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.0+dfsg/src/devices/gpoddevice.h000066400000000000000000000043131223327513400212520ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/devices/gpodloader.cpp000066400000000000000000000054101223327513400216130ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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, boost::shared_ptr device) : QObject(NULL), 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 = NULL; 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 != NULL ; 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.0+dfsg/src/devices/gpodloader.h000066400000000000000000000032511223327513400212610ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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, boost::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: boost::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.0+dfsg/src/devices/macdevicelister.h000066400000000000000000000046111223327513400223050ustar00rootroot00000000000000#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.0+dfsg/src/devices/macdevicelister.mm000066400000000000000000000675221223327513400225010ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = NULL; 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_, NULL, &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 NULL; } 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 = NULL; SInt32 score; kern_return_t err = IOCreatePlugInInterfaceForService( object, kIOUSBDeviceUserClientTypeID, kIOCFPlugInInterfaceID, &plugin_interface, &score); if (err != KERN_SUCCESS) { continue; } IOUSBDeviceInterface** dev = NULL; 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.0+dfsg/src/devices/mtpconnection.cpp000066400000000000000000000053151223327513400223570ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_(NULL) { 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 = NULL; 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 = NULL; for (int i=0 ; i Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/devices/mtpdevice.cpp000066400000000000000000000140041223327513400214520ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_(NULL) { 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_ = NULL; 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(NULL); } 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 = NULL; uint16_t length = 0; if (LIBMTP_Get_Supported_Filetypes(device, &list, &length) || !list || !length) return false; for (int i=0 ; i Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "connecteddevice.h" #include #include #include 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_; boost::scoped_ptr connection_; }; #endif // MTPDEVICE_H clementine-1.2.0+dfsg/src/devices/mtploader.cpp000066400000000000000000000043161223327513400214660ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "mtpconnection.h" #include "mtploader.h" #include "core/song.h" #include "core/taskmanager.h" #include "library/librarybackend.h" #include MtpLoader::MtpLoader(const QUrl& url, TaskManager* task_manager, LibraryBackend* backend, boost::shared_ptr device) : QObject(NULL), 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(), NULL, NULL); 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.0+dfsg/src/devices/mtploader.h000066400000000000000000000026741223327513400211400ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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, boost::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: boost::shared_ptr device_; QThread* original_thread_; QUrl url_; TaskManager* task_manager_; LibraryBackend* backend_; }; #endif // MTPLOADER_H clementine-1.2.0+dfsg/src/engines/000077500000000000000000000000001223327513400167755ustar00rootroot00000000000000clementine-1.2.0+dfsg/src/engines/bufferconsumer.h000066400000000000000000000022151223327513400221730ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/engines/engine_fwd.h000066400000000000000000000015421223327513400212550ustar00rootroot00000000000000#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(), or 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 }; enum TrackChangeType { // One of: First = 0x01, Manual = 0x02, Auto = 0x04, // Any of: SameAlbum = 0x10, }; Q_DECLARE_FLAGS(TrackChangeFlags, TrackChangeType); } typedef Engine::Base EngineBase; #endif clementine-1.2.0+dfsg/src/engines/enginebase.cpp000066400000000000000000000062431223327513400216060ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 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.0+dfsg/src/engines/enginebase.h000066400000000000000000000120731223327513400212510ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 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 #include "engine_fwd.h" namespace Engine { typedef std::vector Scope; class Base : public QObject, boost::noncopyable { 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() = 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() { 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_; }; 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.0+dfsg/src/engines/gstelementdeleter.cpp000066400000000000000000000022321223327513400232140ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/engines/gstelementdeleter.h000066400000000000000000000026331223327513400226660ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); // 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.0+dfsg/src/engines/gstengine.cpp000066400000000000000000000602461223327513400214740ustar00rootroot00000000000000/*************************************************************************** * 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 "config.h" #include "gstengine.h" #include "gstenginepipeline.h" #include "core/logging.h" #include "core/taskmanager.h" #include "core/utilities.h" #ifdef HAVE_MOODBAR # include "gst/moodbar/spectrum.h" #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using std::vector; using boost::shared_ptr; 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_(NULL), 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 mono_playback_(false), seek_timer_(new QTimer(this)), timer_id_(-1), next_element_id_(0), is_fading_out_to_pause_(false), has_faded_out_(false) { seek_timer_->setSingleShot(true); seek_timer_->setInterval(kSeekDelayNanosec / kNsecPerMsec); connect(seek_timer_, SIGNAL(timeout()), SLOT(SeekNow())); ReloadSettings(); } GstEngine::~GstEngine() { EnsureInitialised(); current_pipeline_.reset(); // Save configuration gst_deinit(); } bool GstEngine::Init() { initialising_ = QtConcurrent::run(&GstEngine::InitialiseGstreamer); return true; } void GstEngine::InitialiseGstreamer() { gst_init(NULL, NULL); #ifdef HAVE_MOODBAR gstmoodbar_register_static(); #endif } void GstEngine::ReloadSettings() { Engine::Base::ReloadSettings(); QSettings s; s.beginGroup(kSettingsGroup); sink_ = s.value("sink", kAutoSink).toString(); device_ = s.value("device").toString(); 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; mono_playback_ = s.value("monoplayback", false).toBool(); } qint64 GstEngine::position_nanosec() const { if (!current_pipeline_) return 0; qint64 result = current_pipeline_->position() - beginning_nanosec_; return qint64(qMax(0ll, result)); } qint64 GstEngine::length_nanosec() const { if (!current_pipeline_) return 0; qint64 result = end_nanosec_ - beginning_nanosec_; return qint64(qMax(0ll, result)); } 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_ != NULL) { gst_buffer_unref(latest_buffer_); } latest_buffer_ = buf; } const Engine::Scope& GstEngine::scope() { if (latest_buffer_ != NULL) { UpdateScope(); } return scope_; } void GstEngine::UpdateScope() { typedef Engine::Scope::value_type sample_type; // determine the number of channels GstStructure* structure = gst_caps_get_structure( GST_BUFFER_CAPS(latest_buffer_), 0); int channels = 2; gst_structure_get_int(structure, "channels", &channels); // scope does not support >2 channels if (channels > 2) return; const sample_type* source = reinterpret_cast( GST_BUFFER_DATA(latest_buffer_)); sample_type* dest = scope_.data(); const int bytes = qMin( static_cast(GST_BUFFER_SIZE(latest_buffer_)), scope_.size() * sizeof(sample_type)); memcpy(dest, source, bytes); gst_buffer_unref(latest_buffer_); latest_buffer_ = NULL; } 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)); 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() { StopTimers(); url_ = QUrl(); // To ensure we return Empty from state() beginning_nanosec_ = end_nanosec_ = 0; if (fadeout_enabled_ && current_pipeline_) 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::Empty); // 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 NULL; } if (bin) gst_bin_add(GST_BIN(bin), element); return element; } GstEngine::PluginDetailsList GstEngine::GetPluginList(const QString& classname) const { const_cast(this)->EnsureInitialised(); PluginDetailsList ret; GstRegistry* registry = gst_registry_get_default(); 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(factory->details.klass).contains(classname)) { PluginDetails details; details.name = QString::fromUtf8(GST_PLUGIN_FEATURE_NAME(p->data)); details.long_name = QString::fromUtf8(factory->details.longname); details.description = QString::fromUtf8(factory->details.description); details.author = QString::fromUtf8(factory->details.author); 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_mono_playback(mono_playback_); ret->AddBufferConsumer(this); foreach (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; } bool GstEngine::DoesThisSinkSupportChangingTheOutputDeviceToAUserEditableString(const QString &name) { return (name == "alsasink" || name == "osssink" || name == "pulsesink"); } 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; } } clementine-1.2.0+dfsg/src/engines/gstengine.h000066400000000000000000000151231223327513400211330ustar00rootroot00000000000000/*************************************************************************** * 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 "bufferconsumer.h" #include "enginebase.h" #include "core/boundfuturewatcher.h" #include "core/timeconstants.h" #include #include #include #include #include #include #include #include class QTimer; class QTimerEvent; class GstEnginePipeline; class TaskManager; /** * @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 PluginDetails { QString name; QString long_name; QString author; QString description; }; typedef QList PluginDetailsList; static const char* kSettingsGroup; static const char* kAutoSink; bool Init(); void EnsureInitialised() { initialising_.waitForFinished(); } static 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(); PluginDetailsList GetOutputsList() const { return GetPluginList( "Sink/Audio" ); } static bool DoesThisSinkSupportChangingTheOutputDeviceToAUserEditableString(const QString& name); 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(); 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); 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; static void SetEnv(const char* key, const QString& value); PluginDetailsList GetPluginList(const QString& classname) const; void StartFadeout(); void StartFadeoutPause(); void StartTimers(); void StopTimers(); boost::shared_ptr CreatePipeline(); boost::shared_ptr CreatePipeline(const QUrl& url, qint64 end_nanosec); void UpdateScope(); int AddBackgroundStream(boost::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_; QString device_; boost::shared_ptr current_pipeline_; boost::shared_ptr fadeout_pipeline_; boost::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_; bool mono_playback_; 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_; }; #endif /*AMAROK_GSTENGINE_H*/ clementine-1.2.0+dfsg/src/engines/gstenginepipeline.cpp000066400000000000000000001032341223327513400232150ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "bufferconsumer.h" #include "config.h" #include "gstelementdeleter.h" #include "gstengine.h" #include "gstenginepipeline.h" #include "core/concurrentrun.h" #include "core/logging.h" #include "core/signalchecker.h" #include "core/utilities.h" #include "internet/internetmodel.h" #include "internet/spotifyserver.h" #include "internet/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 = NULL; GstEnginePipeline::GstEnginePipeline(GstEngine* engine) : QObject(NULL), engine_(engine), id_(sId++), valid_(false), sink_(GstEngine::kAutoSink), segment_start_(0), segment_start_received_(false), emit_track_ended_on_segment_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), buffering_(false), mono_playback_(false), 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), volume_percent_(100), volume_modifier_(1.0), fader_(NULL), pipeline_(NULL), uridecodebin_(NULL), audiobin_(NULL), queue_(NULL), audioconvert_(NULL), rgvolume_(NULL), rglimiter_(NULL), audioconvert2_(NULL), equalizer_(NULL), stereo_panorama_(NULL), volume_(NULL), audioscale_(NULL), audiosink_(NULL) { if (!sElementDeleter) { sElementDeleter = new GstElementDeleter; } for (int i=0 ; iCreateElement("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", NULL); g_object_set(G_OBJECT(src), "port", port, NULL); // 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(), NULL); 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 = NULL; 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 NULL; } 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 // 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 (GstEngine::DoesThisSinkSupportChangingTheOutputDeviceToAUserEditableString(sink_) && !device_.isEmpty()) g_object_set(G_OBJECT(audiosink_), "device", device_.toUtf8().constData(), NULL); // 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_, NULL); g_object_set(G_OBJECT(rgvolume_), "pre-amp", double(rg_preamp_), NULL); g_object_set(G_OBJECT(rglimiter_), "enabled", int(rg_compression_), NULL); } // 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_event_probe(pad, G_CALLBACK(EventHandoffCallback), this); gst_object_unref(pad); // Configure the fakesink properly g_object_set(G_OBJECT(probe_sink), "sync", TRUE, NULL); // Set the equalizer bands g_object_set(G_OBJECT(equalizer_), "num-bands", 10, NULL); int last_band_frequency = 0; for (int i=0 ; i 0) { g_object_set(G_OBJECT(queue_), "use-buffering", true, NULL); } gst_element_link(queue_, audioconvert_); // Create the caps to put in each path in the tee. The scope path gets 16-bit // ints and the audiosink path gets float32. GstCaps* caps16 = gst_caps_new_simple ("audio/x-raw-int", "width", G_TYPE_INT, 16, "signed", G_TYPE_BOOLEAN, true, NULL); GstCaps* caps32 = gst_caps_new_simple ("audio/x-raw-float", "width", G_TYPE_INT, 32, NULL); if (mono_playback_) { gst_caps_set_simple(caps32, "channels", G_TYPE_INT, 1, NULL); } // Link the elements with special caps gst_element_link_filtered(probe_converter, probe_sink, caps16); gst_element_link_filtered(audioconvert_, convert_sink, caps32); gst_caps_unref(caps16); gst_caps_unref(caps32); // Link the outputs of tee to the queues on each path. gst_pad_link(gst_element_get_request_pad(tee, "src%d"), gst_element_get_static_pad(probe_queue, "sink")); gst_pad_link(gst_element_get_request_pad(tee, "src%d"), gst_element_get_static_pad(audio_queue, "sink")); // Link replaygain elements if enabled. if (rg_enabled_) { gst_element_link_many(rgvolume_, rglimiter_, audioconvert2_, tee, NULL); } // Link everything else. gst_element_link(probe_queue, probe_converter); gst_element_link_many(audio_queue, equalizer_preamp_, equalizer_, stereo_panorama_, volume_, audioscale_, convert, audiosink_, NULL); // Add probes and handlers. gst_pad_add_buffer_probe(gst_element_get_static_pad(probe_converter, "src"), G_CALLBACK(HandoffCallback), this); gst_bus_set_sync_handler(gst_pipeline_get_bus(GST_PIPELINE(pipeline_)), BusCallbackSync, this); 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_)), NULL, NULL); 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; 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)); GstTaskThreadCallbacks callbacks; memset(&callbacks, 0, sizeof(callbacks)); callbacks.enter_thread = TaskEnterCallback; gst_task_set_thread_callbacks(task, &callbacks, 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); } void GstEnginePipeline::TagMessageReceived(GstMessage* msg) { GstTagList* taglist = NULL; gst_message_parse_tag(msg, &taglist); Engine::SimpleMetaBundle bundle; bundle.title = ParseTag(taglist, GST_TAG_TITLE); 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 = NULL; 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; } 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"); 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); 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_)); } } bool GstEnginePipeline::HandoffCallback(GstPad*, GstBuffer* buf, gpointer self) { GstEnginePipeline* instance = reinterpret_cast(self); QList consumers; { QMutexLocker l(&instance->buffer_consumers_mutex_); consumers = instance->buffer_consumers_; } foreach (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 true; } bool GstEnginePipeline::EventHandoffCallback(GstPad*, GstEvent* e, gpointer self) { GstEnginePipeline* instance = reinterpret_cast(self); qLog(Debug) << instance->id() << "event" << GST_EVENT_TYPE_NAME(e); if (GST_EVENT_TYPE(e) == GST_EVENT_NEWSEGMENT && !instance->segment_start_received_) { // The segment start time is used to calculate the proper offset of data // buffers from the start of the stream gint64 start = 0; gst_event_parse_new_segment(e, NULL, NULL, NULL, &start, NULL, NULL); instance->segment_start_ = start; instance->segment_start_received_ = true; if (instance->emit_track_ended_on_segment_start_) { qLog(Debug) << "New segment started, EOS will signal on next buffer " "discontinuity"; instance->emit_track_ended_on_segment_start_ = false; instance->emit_track_ended_on_time_discontinuity_ = true; } } return true; } 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, NULL); 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(), NULL); } if (g_object_class_find_property(G_OBJECT_GET_CLASS(element), "extra-headers") && instance->url().host().contains("grooveshark")) { // Grooveshark streaming servers will answer with a 400 error 'Bad request' // if we don't specify 'Range' field in HTTP header. // Maybe it could be usefull in some other cases, but for now, I prefer to // keep this grooveshark specific. GstStructure* headers; headers = gst_structure_new("extra-headers", "Range", G_TYPE_STRING, "bytes=0-", NULL); g_object_set(element, "extra-headers", headers, NULL); gst_structure_free(headers); } if (g_object_class_find_property(G_OBJECT_GET_CLASS(element), "extra-headers") && instance->url().host().contains("files.one.ubuntu.com")) { GstStructure* headers; headers = gst_structure_new( "extra-headers", "Authorization", G_TYPE_STRING, instance->url().fragment().toAscii().data(), NULL); g_object_set(element, "extra-headers", headers, NULL); 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(), NULL); } } 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 segment when it really // does finish, so emit TrackEnded then. emit_track_ended_on_segment_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 { GstFormat fmt = GST_FORMAT_TIME; gint64 value = 0; gst_element_query_position(pipeline_, &fmt, &value); return value; } qint64 GstEnginePipeline::length() const { GstFormat fmt = GST_FORMAT_TIME; gint64 value = 0; gst_element_query_duration(pipeline_, &fmt, &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) { 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; 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 ; istate() == 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.0+dfsg/src/engines/gstenginepipeline.h000066400000000000000000000220251223327513400226600ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 QString& device); void set_replaygain(bool enabled, int mode, float preamp, bool compression); void set_buffer_duration_nanosec(qint64 duration_nanosec); void set_mono_playback(bool enabled); // 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 bool HandoffCallback(GstPad*, GstBuffer*, gpointer); static bool EventHandoffCallback(GstPad*, GstEvent*, 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_; QString 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_segment_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_; bool buffering_; bool mono_playback_; // 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_; int volume_percent_; qreal volume_modifier_; boost::scoped_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_; }; #endif // GSTENGINEPIPELINE_H clementine-1.2.0+dfsg/src/globalsearch/000077500000000000000000000000001223327513400177735ustar00rootroot00000000000000clementine-1.2.0+dfsg/src/globalsearch/digitallyimportedsearchprovider.cpp000066400000000000000000000037671223327513400272030ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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" #include "internet/digitallyimportedservicebase.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() << "sky.fm" << "skyfm" << "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(); foreach (const DigitallyImportedClient::Channel& channel, channels) { Song song; service_->SongFromChannel(channel, &song); items << Item(song); } SetItems(items); } void DigitallyImportedSearchProvider::ShowConfig() { service_->ShowSettingsDialog(); } clementine-1.2.0+dfsg/src/globalsearch/digitallyimportedsearchprovider.h000066400000000000000000000023641223327513400266400ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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" class DigitallyImportedServiceBase; class DigitallyImportedSearchProvider : public SimpleSearchProvider { public: DigitallyImportedSearchProvider(DigitallyImportedServiceBase* service, Application* app, QObject* parent); void ShowConfig(); protected: void RecreateItems(); private: DigitallyImportedServiceBase* service_; }; #endif // DIGITALLYIMPORTEDSEARCHPROVIDER_H clementine-1.2.0+dfsg/src/globalsearch/globalsearch.cpp000066400000000000000000000264241223327513400231350ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 { foreach (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()) { foreach (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. foreach (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, NULL); } 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 NULL; } SearchProvider* first_provider = results[0].provider_; SearchProvider::ResultList results_copy; foreach (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); foreach (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); foreach (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 foreach (SearchProvider* provider, providers_.keys()) { if (is_provider_enabled(provider) && provider->can_give_suggestions()) { foreach (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.0+dfsg/src/globalsearch/globalsearch.h000066400000000000000000000076511223327513400226030ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); 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.0+dfsg/src/globalsearch/globalsearchitemdelegate.cpp000066400000000000000000000023531223327513400255020ustar00rootroot00000000000000/* 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.0+dfsg/src/globalsearch/globalsearchitemdelegate.h000066400000000000000000000022421223327513400251440ustar00rootroot00000000000000/* 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.0+dfsg/src/globalsearch/globalsearchmodel.cpp000066400000000000000000000213301223327513400241450ustar00rootroot00000000000000/* 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_(NULL), 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]; } foreach (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::SortTextForYear(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::SortTextForYear(year) + " "; break; case LibraryModel::GroupBy_Composer: display_text = s.composer(); case LibraryModel::GroupBy_Performer: display_text = s.performer(); 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_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; foreach (const QModelIndex& index, indexes) { items << itemFromIndex(index); } return GetChildResults(items); } SearchProvider::ResultList GlobalSearchModel::GetChildResults( const QList& items) const { SearchProvider::ResultList results; QSet visited; foreach (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 ; irowCount() ; ++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 - it's a song, add its result results->append(item->data(Role_Result).value()); } } 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 ; irowCount() ; ++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(); foreach (const SearchProvider::ResultList& result_list, results) { AddResults(result_list); } } } clementine-1.2.0+dfsg/src/globalsearch/globalsearchmodel.h000066400000000000000000000062731223327513400236230ustar00rootroot00000000000000/* 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 = 0); 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.0+dfsg/src/globalsearch/globalsearchsettingspage.cpp000066400000000000000000000153551223327513400255540ustar00rootroot00000000000000/* 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(); foreach (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 foreach (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 ; isources->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.0+dfsg/src/globalsearch/globalsearchsettingspage.h000066400000000000000000000032571223327513400252170ustar00rootroot00000000000000/* 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.0+dfsg/src/globalsearch/globalsearchsettingspage.ui000066400000000000000000000103211223327513400253730ustar00rootroot00000000000000 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.0+dfsg/src/globalsearch/globalsearchsortmodel.cpp000066400000000000000000000055471223327513400250710ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/globalsearch/globalsearchsortmodel.h000066400000000000000000000020561223327513400245260ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); protected: bool lessThan(const QModelIndex& left, const QModelIndex& right) const; }; #endif // GLOBALSEARCHSORTMODEL_H clementine-1.2.0+dfsg/src/globalsearch/globalsearchview.cpp000066400000000000000000000433471223327513400240330ustar00rootroot00000000000000/* 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 "globalsearchitemdelegate.h" #include "globalsearchmodel.h" #include "globalsearchsortmodel.h" #include "globalsearchview.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" #include #include #include #include #include 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_(NULL), 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 text colour QPalette help_palette = ui_->help_text->palette(); const QColor help_color = help_palette.color(QPalette::Disabled, QPalette::Text); help_palette.setColor(QPalette::Normal, QPalette::Text, help_color); help_palette.setColor(QPalette::Inactive, QPalette::Text, help_color); ui_->help_text->setPalette(help_palette); // Create suggestion widgets for (int i=0 ; iaddWidget(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() { 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(), boost::bind(&CompareProvider, boost::cref(provider_order), _1, _2)); bool any_disabled = false; foreach (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(); } } void GlobalSearchView::UpdateSuggestions() { const QStringList suggestions = engine_->GetSuggestions(kMaxSuggestions); for (int i=0 ; iSetText(suggestions[i]); suggestion_widgets_[i]->show(); } for (int i=suggestions.count() ; ihide(); } } 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) { 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 NULL; // 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 ; irowCount() ; ++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 NULL; } // Get items for these indexes QList items; foreach (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(); foreach (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) { // 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. foreach (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.0+dfsg/src/globalsearch/globalsearchview.h000066400000000000000000000070411223327513400234670ustar00rootroot00000000000000/* 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 = 0); ~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.0+dfsg/src/globalsearch/globalsearchview.ui000066400000000000000000000155701223327513400236630ustar00rootroot00000000000000 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.0+dfsg/src/globalsearch/groovesharksearchprovider.cpp000066400000000000000000000105671223327513400260030ustar00rootroot00000000000000/* 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 "groovesharksearchprovider.h" #include #include "core/application.h" #include "core/logging.h" #include "covers/albumcoverloader.h" #include "internet/groovesharkservice.h" GroovesharkSearchProvider::GroovesharkSearchProvider(Application* app, QObject* parent) : SearchProvider(app, parent), service_(NULL) { } void GroovesharkSearchProvider::Init(GroovesharkService* service) { service_ = service; SearchProvider::Init("Grooveshark", "grooveshark", QIcon(":providers/grooveshark.png"), WantsDelayedQueries | ArtIsProbablyRemote | CanShowConfig); connect(service_, SIGNAL(SimpleSearchResults(int, SongList)), SLOT(SearchDone(int, SongList))); connect(service_, SIGNAL(AlbumSearchResult(int, QList)), SLOT(AlbumSearchResult(int, QList))); connect(service_, SIGNAL(AlbumSongsLoaded(quint64, SongList)), SLOT(AlbumSongsLoaded(quint64, 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 GroovesharkSearchProvider::SearchAsync(int id, const QString& query) { const int service_id = service_->SimpleSearch(query); pending_searches_[service_id] = PendingState(id, TokenizeQuery(query));; const int album_id = service_->SearchAlbums(query); pending_searches_[album_id] = PendingState(id, TokenizeQuery(query)); } void GroovesharkSearchProvider::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; foreach (const Song& song, songs) { Result result(this); result.metadata_ = song; ret << result; } emit ResultsAvailable(global_search_id, ret); MaybeSearchFinished(global_search_id); } void GroovesharkSearchProvider::AlbumSearchResult(int id, const QList& albums_ids) { // Map back to the original id. const PendingState state = pending_searches_.take(id); const int global_search_id = state.orig_id_; if (albums_ids.isEmpty()) { MaybeSearchFinished(global_search_id); return; } foreach (const quint64 album_id, albums_ids) { pending_searches_[album_id] = PendingState(global_search_id, QStringList()); } } void GroovesharkSearchProvider::MaybeSearchFinished(int id) { if (pending_searches_.keys(PendingState(id, QStringList())).isEmpty()) { emit SearchFinished(id); } } void GroovesharkSearchProvider::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 GroovesharkSearchProvider::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); } bool GroovesharkSearchProvider::IsLoggedIn() { return (service_ && service_->IsLoggedIn()); } void GroovesharkSearchProvider::ShowConfig() { service_->ShowConfig(); } void GroovesharkSearchProvider::AlbumSongsLoaded(quint64 id, const SongList& songs) { const PendingState state = pending_searches_.take(id); const int global_search_id = state.orig_id_; ResultList ret; foreach (const Song& s, songs) { Result result(this); result.metadata_ = s; ret << result; } emit ResultsAvailable(global_search_id, ret); MaybeSearchFinished(global_search_id); } clementine-1.2.0+dfsg/src/globalsearch/groovesharksearchprovider.h000066400000000000000000000034641223327513400254460ustar00rootroot00000000000000/* 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 GROOVESHARKSEARCHPROVIDER_H #define GROOVESHARKSEARCHPROVIDER_H #include "searchprovider.h" #include "covers/albumcoverloaderoptions.h" #include "internet/groovesharkservice.h" class AlbumCoverLoader; class GroovesharkSearchProvider : public SearchProvider { Q_OBJECT public: explicit GroovesharkSearchProvider(Application* app, QObject* parent = 0); void Init(GroovesharkService* service); // SearchProvider void SearchAsync(int id, const QString& query); void LoadArtAsync(int id, const Result& result); bool IsLoggedIn(); void ShowConfig(); InternetService* internet_service() { return service_; } private slots: void SearchDone(int id, const SongList& songs); void AlbumSearchResult(int id, const QList& albums_ids); void AlbumArtLoaded(quint64 id, const QImage& image); void AlbumSongsLoaded(quint64 id, const SongList& songs); private: void MaybeSearchFinished(int id); GroovesharkService* service_; QMap pending_searches_; AlbumCoverLoaderOptions cover_loader_options_; QMap cover_loader_tasks_; }; #endif clementine-1.2.0+dfsg/src/globalsearch/icecastsearchprovider.cpp000066400000000000000000000027761223327513400250670ustar00rootroot00000000000000/* 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/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; foreach (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.0+dfsg/src/globalsearch/icecastsearchprovider.h000066400000000000000000000021551223327513400245230ustar00rootroot00000000000000/* 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.0+dfsg/src/globalsearch/lastfmsearchprovider.cpp000066400000000000000000000064661223327513400247420ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "lastfmsearchprovider.h" #include "core/logging.h" #include "internet/lastfmservice.h" LastFMSearchProvider::LastFMSearchProvider(LastFMService* service, Application* app, QObject* parent) : SimpleSearchProvider(app, parent), service_(service) { Init("Last.fm", "lastfm", QIcon(":last.fm/as.png"), CanShowConfig | CanGiveSuggestions); icon_ = ScaleAndPad(QImage(":last.fm/as.png")); set_safe_words(QStringList() << "lastfm" << "last.fm"); set_max_suggestion_count(3); connect(service, SIGNAL(SavedItemsChanged()), SLOT(MaybeRecreateItems())); // Load the friends list on startup only if it doesn't involve going to update // info from the server. if (!service_->IsFriendsListStale()) RecreateItems(); } void LastFMSearchProvider::LoadArtAsync(int id, const Result& result) { // TODO: Maybe we should try to get user pictures for friends? emit ArtLoaded(id, icon_); } void LastFMSearchProvider::RecreateItems() { QList items; items << Item(tr("My Last.fm Recommended Radio"), QUrl("lastfm://user/USERNAME/recommended"), "recommended"); items << Item(tr("My Last.fm Library"), QUrl("lastfm://user/USERNAME/library"), "radio"); items << Item(tr("My Last.fm Mix Radio"), QUrl("lastfm://user/USERNAME/mix"), "mix"); items << Item(tr("My Last.fm Neighborhood"), QUrl("lastfm://user/USERNAME/neighbours"), "neighborhood"); const QStringList artists = service_->SavedArtistRadioNames(); const QStringList tags = service_->SavedTagRadioNames(); const QStringList friends = service_->FriendNames(); foreach (const QString& name, artists) { items << Item(tr(LastFMService::kTitleArtist).arg(name), QUrl(QString(LastFMService::kUrlArtist).arg(name)), name); } foreach (const QString& name, tags) { items << Item(tr(LastFMService::kTitleTag).arg(name), QUrl(QString(LastFMService::kUrlTag).arg(name)), name); } foreach (const QString& name, friends) { items << Item(tr("Last.fm Radio Station - %1").arg(name), QUrl("lastfm://user/" + name + "/library"), name); items << Item(tr("Last.fm Mix Radio - %1").arg(name), QUrl("lastfm://user/" + name + "/mix"), name); items << Item(tr("Last.fm Neighbor Radio - %1").arg(name), QUrl("lastfm://user/" + name + "/neighbours"), name); } SetItems(items); } bool LastFMSearchProvider::IsLoggedIn() { return service_->IsAuthenticated(); } void LastFMSearchProvider::ShowConfig() { service_->ShowConfig(); } clementine-1.2.0+dfsg/src/globalsearch/lastfmsearchprovider.h000066400000000000000000000023071223327513400243750ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef LASTFMSEARCHPROVIDER_H #define LASTFMSEARCHPROVIDER_H #include "simplesearchprovider.h" class LastFMService; class LastFMSearchProvider : public SimpleSearchProvider { public: LastFMSearchProvider(LastFMService* service, Application* app, QObject* parent); void LoadArtAsync(int id, const Result& result); bool IsLoggedIn(); void ShowConfig(); protected: void RecreateItems(); private: LastFMService* service_; QImage icon_; }; #endif // LASTFMSEARCHPROVIDER_H clementine-1.2.0+dfsg/src/globalsearch/librarysearchprovider.cpp000066400000000000000000000067441223327513400251170ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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) { 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.0+dfsg/src/globalsearch/librarysearchprovider.h000066400000000000000000000026041223327513400245530ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); 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.0+dfsg/src/globalsearch/savedradiosearchprovider.cpp000066400000000000000000000031631223327513400255640ustar00rootroot00000000000000/* 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 "internet/savedradio.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; foreach (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.0+dfsg/src/globalsearch/savedradiosearchprovider.h000066400000000000000000000021431223327513400252260ustar00rootroot00000000000000/* 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" class SavedRadio; class SavedRadioSearchProvider : public SimpleSearchProvider { public: SavedRadioSearchProvider(SavedRadio* service, Application* app, QObject* parent); protected: void RecreateItems(); private: SavedRadio* service_; }; #endif // SAVEDRADIOSEARCHPROVIDER_H clementine-1.2.0+dfsg/src/globalsearch/searchprovider.cpp000066400000000000000000000103731223327513400235230ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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/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; } 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) { foreach (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()); watcher->deleteLater(); const int id = watcher->data(); emit ResultsAvailable(id, watcher->result()); emit SearchFinished(id); } 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 = NULL; if (mime_data_contains_urls_only()) { mime_data = new MimeData; } else { SongList songs; foreach (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; foreach (const Result& result, results) { urls << result.metadata_.url(); } mime_data->setUrls(urls); return mime_data; } clementine-1.2.0+dfsg/src/globalsearch/searchprovider.h000066400000000000000000000166701223327513400231760ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); 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_; } 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 NULL if there // is none virtual InternetService* internet_service() { return NULL; } 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); 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_; }; 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 = 0); 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.0+dfsg/src/globalsearch/searchproviderstatuswidget.cpp000066400000000000000000000056641223327513400262020ustar00rootroot00000000000000/* 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"); 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.0+dfsg/src/globalsearch/searchproviderstatuswidget.h000066400000000000000000000025621223327513400256410ustar00rootroot00000000000000/* 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 = 0); ~SearchProviderStatusWidget(); bool eventFilter(QObject* object, QEvent* event); private: Ui_SearchProviderStatusWidget* ui_; GlobalSearch* engine_; SearchProvider* provider_; }; #endif // SEARCHPROVIDERSTATUSWIDGET_H clementine-1.2.0+dfsg/src/globalsearch/searchproviderstatuswidget.ui000066400000000000000000000040301223327513400260170ustar00rootroot00000000000000 SearchProviderStatusWidget 0 0 464 110 Form 0 0 0 0 0 0 0 0 0 0 PointingHandCursor clementine-1.2.0+dfsg/src/globalsearch/simplesearchprovider.cpp000066400000000000000000000063621223327513400247400ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_); foreach (const Item& item, items_) { bool matched = true; foreach (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) { 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.0+dfsg/src/globalsearch/simplesearchprovider.h000066400000000000000000000045761223327513400244120ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/globalsearch/somafmsearchprovider.cpp000066400000000000000000000034751223327513400247330ustar00rootroot00000000000000/* 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" #include "internet/somafmservice.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; foreach (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.0+dfsg/src/globalsearch/somafmsearchprovider.h000066400000000000000000000022501223327513400243660ustar00rootroot00000000000000/* 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" class SomaFMServiceBase; class SomaFMSearchProvider : public SimpleSearchProvider { public: SomaFMSearchProvider(SomaFMServiceBase* service, Application* app, QObject* parent); void LoadArtAsync(int id, const Result& result); protected: void RecreateItems(); private: SomaFMServiceBase* service_; QImage icon_; }; #endif // SOMAFMSEARCHPROVIDER_H clementine-1.2.0+dfsg/src/globalsearch/soundcloudsearchprovider.cpp000066400000000000000000000057431223327513400256300ustar00rootroot00000000000000/* 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/soundcloudservice.h" SoundCloudSearchProvider::SoundCloudSearchProvider(Application* app, QObject* parent) : SearchProvider(app, parent), service_(NULL) { } 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; foreach (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.0+dfsg/src/globalsearch/soundcloudsearchprovider.h000066400000000000000000000032031223327513400252620ustar00rootroot00000000000000/* 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/soundcloudservice.h" class AlbumCoverLoader; class SoundCloudSearchProvider : public SearchProvider { Q_OBJECT public: explicit SoundCloudSearchProvider(Application* app, QObject* parent = 0); 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.0+dfsg/src/globalsearch/spotifysearchprovider.cpp000066400000000000000000000150441223327513400251410ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 #include "core/logging.h" #include "internet/internetmodel.h" #include "internet/spotifyserver.h" #include "internet/spotifyservice.h" #include "playlist/songmimedata.h" namespace { const int kSearchSongLimit = 5; const int kSearchAlbumLimit = 20; } SpotifySearchProvider::SpotifySearchProvider(Application* app, QObject* parent) : SearchProvider(app, parent), server_(NULL), service_(NULL) { 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 NULL; 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_ = NULL; } 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); ResultList ret; for (int i=0; i < response.result_size() ; ++i) { const pb::spotify::Track& track = response.result(i); Result result(this); SpotifyService::SongFromProtobuf(track, &result.metadata_); ret << result; } for (int i=0 ; iLoadImage(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(); boost::mt19937 gen(std::time(0)); boost::uniform_int<> 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.0+dfsg/src/globalsearch/spotifysearchprovider.h000066400000000000000000000037151223327513400246100ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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" class SpotifyServer; class SpotifyService; class SpotifySearchProvider : public SearchProvider { Q_OBJECT public: SpotifySearchProvider(Application* app, QObject* parent = 0); void SearchAsync(int id, const QString& query); void LoadArtAsync(int id, const Result& result); QStringList GetSuggestions(int count); bool IsLoggedIn(); void ShowConfig(); 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.0+dfsg/src/globalsearch/suggestionwidget.cpp000066400000000000000000000036751223327513400241050ustar00rootroot00000000000000/* 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.0+dfsg/src/globalsearch/suggestionwidget.h000066400000000000000000000023201223327513400235340ustar00rootroot00000000000000/* 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 = 0); ~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.0+dfsg/src/globalsearch/suggestionwidget.ui000066400000000000000000000025211223327513400237250ustar00rootroot00000000000000 SuggestionWidget 0 0 464 110 Form 0 0 0 Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop 0 0 PointingHandCursor true clementine-1.2.0+dfsg/src/globalsearch/urlsearchprovider.cpp000066400000000000000000000034241223327513400242450ustar00rootroot00000000000000/* 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.0+dfsg/src/globalsearch/urlsearchprovider.h000066400000000000000000000023041223327513400237060ustar00rootroot00000000000000/* 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.0+dfsg/src/internet/000077500000000000000000000000001223327513400171755ustar00rootroot00000000000000clementine-1.2.0+dfsg/src/internet/boxservice.cpp000066400000000000000000000222201223327513400220500ustar00rootroot00000000000000#include "boxservice.h" #include #include "core/application.h" #include "core/player.h" #include "core/waitforsignal.h" #include "internet/boxurlhandler.h" #include "internet/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"; } 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::LOCALHOST, 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()); } foreach (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: 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(); foreach (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.0+dfsg/src/internet/boxservice.h000066400000000000000000000027161223327513400215250ustar00rootroot00000000000000#ifndef BOXSERVICE_H #define BOXSERVICE_H #include "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 // BOXSERVICE_H clementine-1.2.0+dfsg/src/internet/boxsettingspage.cpp000066400000000000000000000050331223327513400231100ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2013, 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 "boxsettingspage.h" #include #include "ui_boxsettingspage.h" #include "core/application.h" #include "internet/boxservice.h" #include "internet/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.0+dfsg/src/internet/boxsettingspage.h000066400000000000000000000024421223327513400225560ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2013, 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 BOXSETTINGSPAGE_H #define BOXSETTINGSPAGE_H #include "ui/settingspage.h" #include #include class BoxService; class Ui_BoxSettingsPage; class BoxSettingsPage : public SettingsPage { Q_OBJECT public: BoxSettingsPage(SettingsDialog* parent = 0); ~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 // BOXSETTINGSPAGE_H clementine-1.2.0+dfsg/src/internet/boxsettingspage.ui000066400000000000000000000056521223327513400227520ustar00rootroot00000000000000 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.0+dfsg/src/internet/boxurlhandler.cpp000066400000000000000000000006231223327513400225530ustar00rootroot00000000000000#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.0+dfsg/src/internet/boxurlhandler.h000066400000000000000000000006631223327513400222240ustar00rootroot00000000000000#ifndef BOXURLHANDLER_H #define BOXURLHANDLER_H #include "core/urlhandler.h" class BoxService; class BoxUrlHandler : public UrlHandler { Q_OBJECT public: BoxUrlHandler(BoxService* service, QObject* parent = 0); QString scheme() const { return "box"; } QIcon icon() const { return QIcon(":/providers/box.png"); } LoadResult StartLoading(const QUrl& url); private: BoxService* service_; }; #endif // BOXURLHANDLER_H clementine-1.2.0+dfsg/src/internet/cloudfileservice.cpp000066400000000000000000000136101223327513400232310ustar00rootroot00000000000000#include "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 "globalsearch/librarysearchprovider.h" #include "internet/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_(NULL), 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) { 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 LibrarySearchProvider( library_backend_, service_name, service_id, icon_, true, app_, 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_->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; } const int task_id = task_manager_->StartTask( tr("Indexing %1").arg(metadata.title())); TagReaderClient::ReplyType* reply = app_->tag_reader_client()->ReadCloudFile( download_url, metadata.title(), metadata.filesize(), mime_type, authorisation); NewClosure(reply, SIGNAL(Finished(bool)), this, SLOT(ReadTagsFinished(TagReaderClient::ReplyType*,Song,int)), reply, metadata, task_id); } void CloudFileService::ReadTagsFinished( TagReaderClient::ReplyType* reply, const Song& metadata, const int task_id) { reply->deleteLater(); TaskManager::ScopedTask(task_id, task_manager_); 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")) { return "audio/mpeg"; } else if (filename.endsWith(".ogg")) { 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; } clementine-1.2.0+dfsg/src/internet/cloudfileservice.h000066400000000000000000000035711223327513400227030ustar00rootroot00000000000000#ifndef CLOUDFILESERVICE_H #define CLOUDFILESERVICE_H #include "internetservice.h" #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); protected: virtual bool has_credentials() const = 0; 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; protected slots: void ShowCoverManager(); void AddToPlaylist(QMimeData* mime); void ShowSettingsDialog(); void ReadTagsFinished( TagReaderClient::ReplyType* reply, const Song& metadata, const int task_id); protected: QStandardItem* root_; NetworkAccessManager* network_; LibraryBackend* library_backend_; LibraryModel* library_model_; QSortFilterProxyModel* library_sort_model_; boost::scoped_ptr context_menu_; boost::scoped_ptr cover_manager_; PlaylistManager* playlist_manager_; TaskManager* task_manager_; private: QIcon icon_; SettingsDialog::Page settings_page_; }; #endif // CLOUDFILESERVICE_H clementine-1.2.0+dfsg/src/internet/digitallyimportedclient.cpp000066400000000000000000000127531223327513400246360ustar00rootroot00000000000000/* 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 "digitallyimportedclient.h" #include "core/logging.h" #include "core/network.h" #include #include #include // The API used here is undocumented - it was reverse engineered by watching // calls made by the sky.fm 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(); foreach (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(); foreach (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.0+dfsg/src/internet/digitallyimportedclient.h000066400000000000000000000044731223327513400243030ustar00rootroot00000000000000/* 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 DIGITALLYIMPORTEDCLIENT_H #define DIGITALLYIMPORTEDCLIENT_H #include #include #include #include class QNetworkAccessManager; class QNetworkReply; class QNetworkRequest; class DigitallyImportedClient : public QObject { Q_OBJECT public: DigitallyImportedClient(const QString& service_name, QObject* parent = 0); 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 // DIGITALLYIMPORTEDCLIENT_H clementine-1.2.0+dfsg/src/internet/digitallyimportedservicebase.cpp000066400000000000000000000232151223327513400256460ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "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, 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), root_(NULL), 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 foreach (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 !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, parent) { } SkyFmService::SkyFmService( Application* app, InternetModel* model, QObject* parent) : DigitallyImportedServiceBase("SKY.fm", "SKY.fm", QUrl("http://www.sky.fm"), QIcon(":/providers/skyfm.png"), "sky", app, model, 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, 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, parent) { } clementine-1.2.0+dfsg/src/internet/digitallyimportedservicebase.h000066400000000000000000000077461223327513400253260ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef DIGITALLYIMPORTEDSERVICEBASE_H #define DIGITALLYIMPORTEDSERVICEBASE_H #include #include "digitallyimportedclient.h" #include "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, QObject* parent = NULL); ~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_; QStandardItem* root_; boost::scoped_ptr context_menu_; QStandardItem* context_item_; CachedList saved_channels_; DigitallyImportedClient* api_client_; }; class DigitallyImportedService : public DigitallyImportedServiceBase { public: DigitallyImportedService(Application* app, InternetModel* model, QObject* parent = NULL); }; class SkyFmService : public DigitallyImportedServiceBase { public: SkyFmService(Application* app, InternetModel* model, QObject* parent = NULL); }; class JazzRadioService : public DigitallyImportedServiceBase { public: JazzRadioService(Application* app, InternetModel* model, QObject* parent = NULL); }; class RockRadioService : public DigitallyImportedServiceBase { public: RockRadioService(Application* app, InternetModel* model, QObject* parent = NULL); }; #endif // DIGITALLYIMPORTEDSERVICEBASE_H clementine-1.2.0+dfsg/src/internet/digitallyimportedsettingspage.cpp000066400000000000000000000114311223327513400260450ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "digitallyimportedservicebase.h" #include "digitallyimportedsettingspage.h" #include "ui_digitallyimportedsettingspage.h" #include "core/closure.h" #include #include #include 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.0+dfsg/src/internet/digitallyimportedsettingspage.h000066400000000000000000000027371223327513400255230ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef DIGITALLYIMPORTEDSETTINGSPAGE_H #define DIGITALLYIMPORTEDSETTINGSPAGE_H #include "ui/settingspage.h" class DigitallyImportedClient; class Ui_DigitallyImportedSettingsPage; class QNetworkReply; class DigitallyImportedSettingsPage : public SettingsPage { Q_OBJECT public: 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 // DIGITALLYIMPORTEDSETTINGSPAGE_H clementine-1.2.0+dfsg/src/internet/digitallyimportedsettingspage.ui000066400000000000000000000123401223327513400257000ustar00rootroot00000000000000 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.0+dfsg/src/internet/digitallyimportedurlhandler.cpp000066400000000000000000000056261223327513400255210ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "digitallyimportedurlhandler.h" #include "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() == "sky") { return QIcon(":providers/skyfm.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(NULL); 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")); 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.0+dfsg/src/internet/digitallyimportedurlhandler.h000066400000000000000000000025341223327513400251610ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef DIGITALLYIMPORTEDURLHANDLER_H #define 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 // DIGITALLYIMPORTEDURLHANDLER_H clementine-1.2.0+dfsg/src/internet/dropboxauthenticator.cpp000066400000000000000000000124551223327513400241600ustar00rootroot00000000000000#include "dropboxauthenticator.h" #include #include #include #include #include #include "core/closure.h" #include "core/logging.h" #include "core/network.h" #include "internet/localredirectserver.h" namespace { static const char* kAppKey = "qh6ca27eclt9p2k"; static const char* kAppSecret = "pg7y68h5efap8r6"; // OAuth 1.0 endpoints static const char* kRequestTokenEndpoint = "https://api.dropbox.com/1/oauth/request_token"; static const char* kAuthoriseEndpoint = "https://www.dropbox.com/1/oauth/authorize"; static const char* kAccessTokenEndpoint = "https://api.dropbox.com/1/oauth/access_token"; // Dropbox API endpoints static const char* kAccountInfoEndpoint = "https://api.dropbox.com/1/account/info"; } // namespace DropboxAuthenticator::DropboxAuthenticator(QObject* parent) : QObject(parent), network_(new NetworkAccessManager(this)) { } void DropboxAuthenticator::StartAuthorisation() { QUrl url(kRequestTokenEndpoint); QByteArray authorisation_header = GenerateAuthorisationHeader( QString::null, QString::null); QNetworkRequest request(url); request.setRawHeader("Authorization", authorisation_header); QNetworkReply* reply = network_->post(request, QByteArray()); NewClosure(reply, SIGNAL(finished()), this, SLOT(RequestTokenFinished(QNetworkReply*)), reply); } namespace { // Parse a string like a=b&c=d into a map. QMap ParseParamList(const QString& params) { QMap ret; QStringList components = params.split("&"); foreach (const QString& component, components) { QStringList pairs = component.split("="); if (pairs.size() != 2) { continue; } ret[pairs[0]] = pairs[1]; } return ret; } } void DropboxAuthenticator::RequestTokenFinished(QNetworkReply* reply) { reply->deleteLater(); QString result = reply->readAll(); QMap params = ParseParamList(result); token_ = params["oauth_token"]; secret_ = params["oauth_token_secret"]; Authorise(); } void DropboxAuthenticator::Authorise() { LocalRedirectServer* server = new LocalRedirectServer(this); server->Listen(); NewClosure(server, SIGNAL(Finished()), this, SLOT(RedirectArrived(LocalRedirectServer*)), server); QUrl url(kAuthoriseEndpoint); url.addQueryItem("oauth_token", token_); url.addQueryItem("oauth_callback", server->url().toString()); QDesktopServices::openUrl(url); } void DropboxAuthenticator::RedirectArrived(LocalRedirectServer* server) { server->deleteLater(); QUrl request_url = server->request_url(); qLog(Debug) << Q_FUNC_INFO << request_url; uid_ = request_url.queryItemValue("uid"); RequestAccessToken(); } void DropboxAuthenticator::RequestAccessToken() { QUrl url(kAccessTokenEndpoint); QNetworkRequest request(url); QByteArray authorisation_header = GenerateAuthorisationHeader( token_, secret_); request.setRawHeader("Authorization", authorisation_header); QNetworkReply* reply = network_->post(request, QByteArray()); NewClosure(reply, SIGNAL(finished()), this, SLOT(RequestAccessTokenFinished(QNetworkReply*)), reply); } void DropboxAuthenticator::RequestAccessTokenFinished(QNetworkReply* reply) { reply->deleteLater(); QString result = QString::fromAscii(reply->readAll()); qLog(Debug) << result; QMap params = ParseParamList(result); access_token_ = params["oauth_token"]; access_token_secret_ = params["oauth_token_secret"]; qLog(Debug) << Q_FUNC_INFO << access_token_ << access_token_secret_; RequestAccountInformation(); } QByteArray DropboxAuthenticator::GenerateAuthorisationHeader() { return GenerateAuthorisationHeader(access_token_, access_token_secret_); } QByteArray DropboxAuthenticator::GenerateAuthorisationHeader( const QString& token, const QString& token_secret) { typedef QPair Param; QByteArray signature = QUrl::toPercentEncoding( QString("%1&%2").arg(kAppSecret, token_secret)); QList params; params << Param("oauth_consumer_key", kAppKey) << Param("oauth_signature_method", "PLAINTEXT") << Param("oauth_timestamp", QString::number(time(NULL))) << Param("oauth_nonce", QString::number(qrand())) << Param("oauth_signature", signature); if (!token.isNull()) { params << Param("oauth_token", token); } QStringList encoded_params; foreach (const Param& p, params) { encoded_params << QString("%1=\"%2\"").arg(p.first, p.second); } QString authorisation_header = QString("OAuth ") + encoded_params.join(", "); return authorisation_header.toUtf8(); } void DropboxAuthenticator::RequestAccountInformation() { QUrl url(kAccountInfoEndpoint); QNetworkRequest request(url); request.setRawHeader("Authorization", GenerateAuthorisationHeader()); qLog(Debug) << Q_FUNC_INFO << url << request.rawHeader("Authorization"); QNetworkReply* reply = network_->get(request); NewClosure(reply, SIGNAL(finished()), this, SLOT(RequestAccountInformationFinished(QNetworkReply*)), reply); } void DropboxAuthenticator::RequestAccountInformationFinished(QNetworkReply* reply) { reply->deleteLater(); QJson::Parser parser; QVariantMap response = parser.parse(reply).toMap(); name_ = response["display_name"].toString(); emit Finished(); } clementine-1.2.0+dfsg/src/internet/dropboxauthenticator.h000066400000000000000000000026521223327513400236230ustar00rootroot00000000000000#ifndef DROPBOXAUTHENTICATOR_H #define DROPBOXAUTHENTICATOR_H #include #include class LocalRedirectServer; class NetworkAccessManager; class QNetworkReply; class DropboxAuthenticator : public QObject { Q_OBJECT public: explicit DropboxAuthenticator(QObject* parent = 0); void StartAuthorisation(); const QString& access_token() const { return access_token_; } const QString& access_token_secret() const { return access_token_secret_; } const QString& uid() const { return uid_; } const QString& name() const { return name_; } static QByteArray GenerateAuthorisationHeader( const QString& token, const QString& secret); signals: void Finished(); private slots: void RequestTokenFinished(QNetworkReply* reply); void RedirectArrived(LocalRedirectServer* server); void RequestAccessTokenFinished(QNetworkReply* reply); void RequestAccountInformationFinished(QNetworkReply* reply); private: void Authorise(); void RequestAccessToken(); QByteArray GenerateAuthorisationHeader(); void RequestAccountInformation(); private: NetworkAccessManager* network_; QTcpServer server_; // Temporary access token used for first authentication flow. QString token_; QString secret_; // Permanent OAuth access tokens. QString access_token_; QString access_token_secret_; // User's Dropbox uid & name. QString uid_; QString name_; }; #endif // DROPBOXAUTHENTICATOR_H clementine-1.2.0+dfsg/src/internet/dropboxservice.cpp000066400000000000000000000127641223327513400227510ustar00rootroot00000000000000#include "dropboxservice.h" #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/dropboxauthenticator.h" #include "internet/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"; } // 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); access_token_ = settings.value("access_token").toString(); access_token_secret_ = settings.value("access_token_secret").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(DropboxAuthenticator* authenticator) { authenticator->deleteLater(); access_token_ = authenticator->access_token(); access_token_secret_ = authenticator->access_token_secret(); QSettings settings; settings.beginGroup(kSettingsGroup); settings.setValue("access_token", access_token_); settings.setValue("access_token_secret", access_token_secret_); settings.setValue("name", authenticator->name()); emit Connected(); RequestFileList(); } QByteArray DropboxService::GenerateAuthorisationHeader() { return DropboxAuthenticator::GenerateAuthorisationHeader( access_token_, access_token_secret_); } 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(); foreach (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; } 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(); } } 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.0+dfsg/src/internet/dropboxservice.h000066400000000000000000000020301223327513400223770ustar00rootroot00000000000000#ifndef DROPBOXSERVICE_H #define DROPBOXSERVICE_H #include "internet/cloudfileservice.h" #include "core/tagreaderclient.h" class DropboxAuthenticator; class NetworkAccessManager; 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(DropboxAuthenticator* authenticator); private slots: void RequestFileListFinished(QNetworkReply* reply); void FetchContentUrlFinished(QNetworkReply* reply, const QVariantMap& file); private: void RequestFileList(); QByteArray GenerateAuthorisationHeader(); QNetworkReply* FetchContentUrl(const QUrl& url); private: QString access_token_; QString access_token_secret_; NetworkAccessManager* network_; }; #endif // DROPBOXSERVICE_H clementine-1.2.0+dfsg/src/internet/dropboxsettingspage.cpp000066400000000000000000000055071223327513400240030ustar00rootroot00000000000000/* 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 "dropboxsettingspage.h" #include "ui_dropboxsettingspage.h" #include "core/application.h" #include "internet/dropboxauthenticator.h" #include "internet/dropboxservice.h" #include "internet/internetmodel.h" #include "ui/settingsdialog.h" 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 name = s.value("name").toString(); if (!name.isEmpty()) { ui_->login_state->SetLoggedIn(LoginStateWidget::LoggedIn, name); } } void DropboxSettingsPage::Save() { QSettings s; s.beginGroup(DropboxService::kSettingsGroup); } void DropboxSettingsPage::LoginClicked() { DropboxAuthenticator* authenticator = new DropboxAuthenticator; NewClosure(authenticator, SIGNAL(Finished()), this, SLOT(Connected(DropboxAuthenticator*)), authenticator); NewClosure(authenticator, SIGNAL(Finished()), service_, SLOT(AuthenticationFinished(DropboxAuthenticator*)), authenticator); authenticator->StartAuthorisation(); 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); } void DropboxSettingsPage::Connected(DropboxAuthenticator* authenticator) { ui_->login_state->SetLoggedIn( LoginStateWidget::LoggedIn, authenticator->name()); } clementine-1.2.0+dfsg/src/internet/dropboxsettingspage.h000066400000000000000000000026071223327513400234460ustar00rootroot00000000000000/* 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 DROPBOXSETTINGSPAGE_H #define DROPBOXSETTINGSPAGE_H #include "ui/settingspage.h" #include #include class DropboxAuthenticator; class DropboxService; class Ui_DropboxSettingsPage; class DropboxSettingsPage : public SettingsPage { Q_OBJECT public: DropboxSettingsPage(SettingsDialog* parent = 0); ~DropboxSettingsPage(); void Load(); void Save(); // QObject bool eventFilter(QObject* object, QEvent* event); private slots: void LoginClicked(); void LogoutClicked(); void Connected(DropboxAuthenticator* authenticator); private: Ui_DropboxSettingsPage* ui_; DropboxService* service_; }; #endif // DROPBOXSETTINGSPAGE_H clementine-1.2.0+dfsg/src/internet/dropboxsettingspage.ui000066400000000000000000000057021223327513400236330ustar00rootroot00000000000000 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.0+dfsg/src/internet/dropboxurlhandler.cpp000066400000000000000000000006211223327513400234360ustar00rootroot00000000000000#include "dropboxurlhandler.h" #include "internet/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.0+dfsg/src/internet/dropboxurlhandler.h000066400000000000000000000007021223327513400231030ustar00rootroot00000000000000#ifndef DROPBOXURLHANDLER_H #define DROPBOXURLHANDLER_H #include "core/urlhandler.h" class DropboxService; class DropboxUrlHandler : public UrlHandler { Q_OBJECT public: DropboxUrlHandler(DropboxService* service, QObject* parent = 0); QString scheme() const { return "dropbox"; } QIcon icon() const { return QIcon(":providers/dropbox.png"); } LoadResult StartLoading(const QUrl& url); private: DropboxService* service_; }; #endif clementine-1.2.0+dfsg/src/internet/fixlastfm.cpp000066400000000000000000000015271223327513400217030ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/internet/fixlastfm.h000066400000000000000000000017771223327513400213570ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef FIXLASTFM_H #define 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 clementine-1.2.0+dfsg/src/internet/geolocator.cpp000066400000000000000000000066751223327513400220550ustar00rootroot00000000000000/* 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 "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.0+dfsg/src/internet/geolocator.h000066400000000000000000000031611223327513400215050ustar00rootroot00000000000000/* 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 GEOLOCATOR_H #define GEOLOCATOR_H #include #include "core/network.h" class Geolocator : public QObject { Q_OBJECT public: explicit Geolocator(QObject* parent = 0); 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 // GEOLOCATOR_H clementine-1.2.0+dfsg/src/internet/googledriveclient.cpp000066400000000000000000000173431223327513400234160ustar00rootroot00000000000000/* 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 "googledriveclient.h" #include #include "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"; } QStringList File::parent_ids() const { QStringList ret; foreach (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: 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; foreach (const QVariant& v, result["items"].toList()) { QVariantMap change = v.toMap(); if (!change["deleted"].toBool()) { files << File(change["file"].toMap()); } else { QUrl url; url.setScheme("googledrive"); url.setPath(change["fileId"].toString()); files_deleted << url; } } 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.0+dfsg/src/internet/googledriveclient.h000066400000000000000000000112521223327513400230540ustar00rootroot00000000000000/* 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 GOOGLEDRIVECLIENT_H #define 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: 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(); } long 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: 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: Client(QObject* parent = 0); 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 #endif // GOOGLEDRIVECLIENT_H clementine-1.2.0+dfsg/src/internet/googledriveservice.cpp000066400000000000000000000154611223327513400235770ustar00rootroot00000000000000#include "googledriveservice.h" #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 "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)) { 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(); QSettings s; s.beginGroup(kSettingsGroup); s.setValue("cursor", changes_response->next_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. ListChanges(s.value("cursor").toString()); } 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) { foreach (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) { foreach (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(); 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; foreach (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); context_menu_->popup(global_pos); } void GoogleDriveService::OpenWithDrive() { // Map indexes to the actual library model. QModelIndexList library_indexes; foreach (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. foreach (const Song& song, library_model_->GetChildSongs(library_indexes)) { QDesktopServices::openUrl( QUrl(QString(kDriveEditFileUrl).arg(song.url().path()))); } } clementine-1.2.0+dfsg/src/internet/googledriveservice.h000066400000000000000000000024071223327513400232400ustar00rootroot00000000000000#ifndef GOOGLEDRIVESERVICE_H #define GOOGLEDRIVESERVICE_H #include "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 OpenWithDrive(); private: void EnsureConnected(); void RefreshAuthorisation(const QString& refresh_token); void ListChanges(const QString& cursor); google_drive::Client* client_; QAction* open_in_drive_action_; }; #endif clementine-1.2.0+dfsg/src/internet/googledrivesettingspage.cpp000066400000000000000000000055221223327513400246310ustar00rootroot00000000000000/* 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 "googledriveclient.h" #include "googledriveservice.h" #include "googledrivesettingspage.h" #include "ui_googledrivesettingspage.h" #include "core/application.h" #include "internet/internetmodel.h" #include "ui/settingsdialog.h" #include 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.0+dfsg/src/internet/googledrivesettingspage.h000066400000000000000000000025601223327513400242750ustar00rootroot00000000000000/* 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 GOOGLEDRIVESETTINGSPAGE_H #define GOOGLEDRIVESETTINGSPAGE_H #include "ui/settingspage.h" #include #include class GoogleDriveService; class Ui_GoogleDriveSettingsPage; class GoogleDriveSettingsPage : public SettingsPage { Q_OBJECT public: GoogleDriveSettingsPage(SettingsDialog* parent = 0); ~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 // GOOGLEDRIVESETTINGSPAGE_H clementine-1.2.0+dfsg/src/internet/googledrivesettingspage.ui000066400000000000000000000057341223327513400244710ustar00rootroot00000000000000 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.0+dfsg/src/internet/googledriveurlhandler.cpp000066400000000000000000000007141223327513400242720ustar00rootroot00000000000000#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.0+dfsg/src/internet/googledriveurlhandler.h000066400000000000000000000007461223327513400237440ustar00rootroot00000000000000#ifndef GOOGLEDRIVEURLHANDLER_H #define GOOGLEDRIVEURLHANDLER_H #include "core/urlhandler.h" class GoogleDriveService; class GoogleDriveUrlHandler : public UrlHandler { Q_OBJECT public: GoogleDriveUrlHandler(GoogleDriveService* service, QObject* parent = 0); QString scheme() const { return "googledrive"; } QIcon icon() const { return QIcon(":providers/googledrive.png"); } LoadResult StartLoading(const QUrl& url); private: GoogleDriveService* service_; }; #endif clementine-1.2.0+dfsg/src/internet/groovesharkradio.cpp000066400000000000000000000040341223327513400232530ustar00rootroot00000000000000/* 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 "groovesharkradio.h" #include "groovesharkservice.h" #include "core/logging.h" #include "internet/internetplaylistitem.h" GroovesharkRadio::GroovesharkRadio(GroovesharkService* service) : service_(service), tag_id_(0), use_tag_(false), first_time_(true) { } GroovesharkRadio::GroovesharkRadio(GroovesharkService* service, int tag_id) : service_(service), tag_id_(tag_id), use_tag_(true), first_time_(true) { } void GroovesharkRadio::Load(const QByteArray& data) { } QByteArray GroovesharkRadio::Save() const { return QByteArray(); } PlaylistItemList GroovesharkRadio::Generate() { PlaylistItemList items; if (first_time_) { Song song; if (use_tag_) { song = service_->StartAutoplayTag(tag_id_, autoplay_state_); } else { song = service_->StartAutoplay(autoplay_state_); } // If the song url isn't valid, stop here if (!song.is_valid()) { return items; } PlaylistItemPtr playlist_item = PlaylistItemPtr(new InternetPlaylistItem(service_, song)); items << playlist_item; first_time_ = false; } Song song = service_->GetAutoplaySong(autoplay_state_); if (!song.is_valid()) { return items; } PlaylistItemPtr playlist_item = PlaylistItemPtr(new InternetPlaylistItem(service_, song)); items << playlist_item; return items; } clementine-1.2.0+dfsg/src/internet/groovesharkradio.h000066400000000000000000000033201223327513400227150ustar00rootroot00000000000000/* 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 GROOVESHARKRADIO_H #define GROOVESHARKRADIO_H #include "smartplaylists/generator.h" class GroovesharkService; class GroovesharkRadio : public smart_playlists::Generator { public: // Start Grooveshark radio for a particular type of music GroovesharkRadio(GroovesharkService* service, int tag_id); // Start Grooveshark radio based on last artists and songs you listen to GroovesharkRadio(GroovesharkService* service); QString type() const { return "Grooveshark"; } void Load(const QByteArray& data); QByteArray Save() const; PlaylistItemList Generate(); PlaylistItemList GenerateMore(int count) { return Generate(); } bool is_dynamic() const { return true; } private: GroovesharkService* service_; int tag_id_; // Boolean to specify if we should use tag. If not, we will used autoplay // without tag bool use_tag_; // For Generate: indicates if it's the first time we generate songs bool first_time_; QVariantMap autoplay_state_; }; #endif // GROOVESHARKRADIO_H clementine-1.2.0+dfsg/src/internet/groovesharkservice.cpp000066400000000000000000001706441223327513400236300ustar00rootroot00000000000000/* 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 "groovesharkservice.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "qtiocompressor.h" #include "internetmodel.h" #include "groovesharkradio.h" #include "groovesharkurlhandler.h" #include "searchboxwidget.h" #include "core/application.h" #include "core/closure.h" #include "core/database.h" #include "core/logging.h" #include "core/mergedproxymodel.h" #include "core/network.h" #include "core/player.h" #include "core/scopedtransaction.h" #include "core/song.h" #include "core/taskmanager.h" #include "core/timeconstants.h" #include "core/utilities.h" #include "globalsearch/globalsearch.h" #include "globalsearch/groovesharksearchprovider.h" #include "playlist/playlist.h" #include "playlist/playlistcontainer.h" #include "playlist/playlistmanager.h" #include "ui/iconloader.h" using smart_playlists::Generator; using smart_playlists::GeneratorPtr; // The Grooveshark terms of service require that application keys are not // accessible to third parties. Therefore this application key is obfuscated to // prevent third parties from viewing it. const char* GroovesharkService::kApiKey = "clementineplayer"; const char* GroovesharkService::kApiSecret = "OzLDTB5XqmhkkhxMUK0/Mp5PQgD5O27DTEJa/jtkwEw="; const char* GroovesharkService::kServiceName = "Grooveshark"; const char* GroovesharkService::kSettingsGroup = "Grooveshark"; const char* GroovesharkService::kUrl = "http://api.grooveshark.com/ws/3.0/"; const char* GroovesharkService::kUrlCover = "http://beta.grooveshark.com/static/amazonart/l"; const char* GroovesharkService::kHomepage = "http://grooveshark.com/"; const int GroovesharkService::kSongSearchLimit = 100; const int GroovesharkService::kSongSimpleSearchLimit = 10; const int GroovesharkService::kAlbumSearchLimit = 10; const int GroovesharkService::kSearchDelayMsec = 400; typedef QPair Param; GroovesharkService::GroovesharkService(Application* app, InternetModel *parent) : InternetService(kServiceName, app, parent, parent), url_handler_(new GroovesharkUrlHandler(this, this)), next_pending_search_id_(0), root_(NULL), search_(NULL), popular_month_(NULL), popular_today_(NULL), stations_(NULL), grooveshark_radio_(NULL), favorites_(NULL), library_(NULL), playlists_parent_(NULL), subscribed_playlists_parent_(NULL), network_(new NetworkAccessManager(this)), context_menu_(NULL), create_playlist_(NULL), delete_playlist_(NULL), rename_playlist_(NULL), remove_from_playlist_(NULL), remove_from_favorites_(NULL), remove_from_library_(NULL), get_url_to_share_song_(NULL), get_url_to_share_playlist_(NULL), search_box_(new SearchBoxWidget(this)), search_delay_(new QTimer(this)), last_search_reply_(NULL), api_key_(QByteArray::fromBase64(kApiSecret)), login_state_(LoginState_OtherError), task_popular_id_(0), task_playlists_id_(0), task_search_id_(0) { app_->player()->RegisterUrlHandler(url_handler_); search_delay_->setInterval(kSearchDelayMsec); search_delay_->setSingleShot(true); connect(search_delay_, SIGNAL(timeout()), SLOT(DoSearch())); // Get already existing (authenticated) session id, if any QSettings s; s.beginGroup(GroovesharkService::kSettingsGroup); session_id_ = s.value("sessionid").toString(); username_ = s.value("username").toString(); GroovesharkSearchProvider* search_provider = new GroovesharkSearchProvider(app_, this); search_provider->Init(this); app_->global_search()->AddProvider(search_provider); // Init secret: this code is ugly, but that's good as nobody is supposed to wonder what it does QByteArray ba = QByteArray::fromBase64(QCoreApplication::applicationName().toLatin1()); int n = api_key_.length(), n2 = ba.length(); for (int i=0; isetData(true, InternetModel::Role_CanLazyLoad); root_->setData(InternetModel::PlayBehaviour_DoubleClickAction, InternetModel::Role_PlayBehaviour); return root_; } void GroovesharkService::LazyPopulate(QStandardItem* item) { switch (item->data(InternetModel::Role_Type).toInt()) { case InternetModel::Type_Service: { EnsureConnected(); break; } default: break; } } void GroovesharkService::ShowConfig() { app_->OpenSettingsDialogAtPage(SettingsDialog::Page_Grooveshark); } QWidget* GroovesharkService::HeaderWidget() const { if (IsLoggedIn()) return search_box_; return NULL; } void GroovesharkService::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(); } } int GroovesharkService::SimpleSearch(const QString& query) { QList parameters; parameters << Param("query", query) << Param("country", "") << Param("limit", QString::number(kSongSimpleSearchLimit)) << Param("offset", ""); int id = next_pending_search_id_++; QNetworkReply* reply = CreateRequest("getSongSearchResults", parameters); NewClosure(reply, SIGNAL(finished()), this, SLOT(SimpleSearchFinished(QNetworkReply*, int)), reply, id); return id; } void GroovesharkService::SimpleSearchFinished(QNetworkReply* reply, int id) { reply->deleteLater(); QVariantMap result = ExtractResult(reply); SongList songs = ExtractSongs(result); emit SimpleSearchResults(id, songs); } int GroovesharkService::SearchAlbums(const QString& query) { QList parameters; parameters << Param("query", query) << Param("country", "") << Param("limit", QString::number(kAlbumSearchLimit)); QNetworkReply* reply = CreateRequest("getAlbumSearchResults", parameters); const int id = next_pending_search_id_++; NewClosure(reply, SIGNAL(finished()), this, SLOT(SearchAlbumsFinished(QNetworkReply*,int)), reply, id); return id; } void GroovesharkService::SearchAlbumsFinished(QNetworkReply* reply, int id) { reply->deleteLater(); QVariantMap result = ExtractResult(reply); QVariantList albums = result["albums"].toList(); QList ret; foreach (const QVariant& v, albums) { quint64 album_id = v.toMap()["AlbumID"].toULongLong(); GetAlbumSongs(album_id); ret << album_id; } emit AlbumSearchResult(id, ret); } void GroovesharkService::GetAlbumSongs(quint64 album_id) { QList parameters; parameters << Param("albumID", album_id) << Param("country", ""); QNetworkReply* reply = CreateRequest("getAlbumSongs", parameters); NewClosure(reply, SIGNAL(finished()), this, SLOT(GetAlbumSongsFinished(QNetworkReply*,quint64)), reply, album_id); } void GroovesharkService::GetAlbumSongsFinished(QNetworkReply* reply, quint64 album_id) { reply->deleteLater(); QVariantMap result = ExtractResult(reply); SongList songs = ExtractSongs(result); emit AlbumSongsLoaded(album_id, songs); } void GroovesharkService::DoSearch() { if (!task_search_id_) { task_search_id_ = app_->task_manager()->StartTask(tr("Searching on Grooveshark")); } ClearSearchResults(); QList parameters; parameters << Param("query", pending_search_) << Param("country", "") << Param("limit", QString::number(kSongSearchLimit)) << Param("offset", ""); last_search_reply_ = CreateRequest("getSongSearchResults", parameters); NewClosure(last_search_reply_, SIGNAL(finished()), this, SLOT(SearchSongsFinished(QNetworkReply*)), last_search_reply_); } void GroovesharkService::SearchSongsFinished(QNetworkReply* reply) { reply->deleteLater(); if (reply != last_search_reply_) return; QVariantMap result = ExtractResult(reply); SongList songs = ExtractSongs(result); app_->task_manager()->SetTaskFinished(task_search_id_); task_search_id_ = 0; // Fill results list foreach (const Song& song, songs) { QStandardItem* child = CreateSongItem(song); search_->appendRow(child); } QModelIndex index = model()->merged_model()->mapFromSource(search_->index()); ScrollToIndex(index); } void GroovesharkService::InitCountry() { if (!country_.isEmpty()) return; // Get country info QNetworkReply *reply_country = CreateRequest("getCountry", QList()); if (WaitForReply(reply_country)) { country_ = ExtractResult(reply_country); } reply_country->deleteLater(); } QUrl GroovesharkService::GetStreamingUrlFromSongId(const QString& song_id, const QString& artist_id, QString* server_id, QString* stream_key, qint64* length_nanosec) { QList parameters; InitCountry(); parameters << Param("songID", song_id) << Param("country", country_); QNetworkReply* reply = CreateRequest("getSubscriberStreamKey", parameters); // Wait for the reply bool reply_has_timeouted = !WaitForReply(reply); reply->deleteLater(); if (reply_has_timeouted) return QUrl(); QVariantMap result = ExtractResult(reply); server_id->clear(); server_id->append(result["StreamServerID"].toString()); stream_key->clear(); stream_key->append(result["StreamKey"].toString()); *length_nanosec = result["uSecs"].toLongLong() * 1000; // Keep in mind that user has request to listen to this song last_songs_ids_.append(song_id.toInt()); last_artists_ids_.append(artist_id.toInt()); // If we have enough ids, remove the old ones if (last_songs_ids_.size() > 100) last_songs_ids_.removeFirst(); if (last_artists_ids_.size() > 100) last_artists_ids_.removeFirst(); return QUrl(result["url"].toString()); } void GroovesharkService::Login(const QString& username, const QString& password) { // To login, we first need to create a session. Next, we will authenticate // this session using the user's username and password (for now, we just keep // them in mind) username_ = username; password_ = QCryptographicHash::hash(password.toLocal8Bit(), QCryptographicHash::Md5).toHex(); QList parameters; QNetworkReply *reply = CreateRequest("startSession", parameters, true); NewClosure(reply, SIGNAL(finished()), this, SLOT(SessionCreated(QNetworkReply*)), reply); } void GroovesharkService::SessionCreated(QNetworkReply* reply) { reply->deleteLater(); if (reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() != 200) { emit StreamError("Failed to create Grooveshark session: " + reply->errorString()); emit LoginFinished(false); return; } QVariantMap result = ExtractResult(reply); if (!result["success"].toBool()) { qLog(Error) << "Grooveshark returned an error during session creation"; } session_id_ = result["sessionID"].toString(); qLog(Debug) << "Session ID returned: " << session_id_; AuthenticateSession(); } void GroovesharkService::AuthenticateSession() { QList parameters; parameters << Param("login", username_) << Param("password", password_); QNetworkReply *reply = CreateRequest("authenticate", parameters, true); NewClosure(reply, SIGNAL(finished()), this, SLOT(Authenticated(QNetworkReply*)), reply); } void GroovesharkService::Authenticated(QNetworkReply* reply) { reply->deleteLater(); QVariantMap result = ExtractResult(reply); // Check if the user has been authenticated correctly QString error; if (!result["success"].toBool() || result["UserID"].toInt() == 0) { error = tr("Invalid username and/or password"); login_state_ = LoginState_AuthFailed; } else if(!result["IsAnywhere"].toBool() || !result["IsPremium"].toBool()) { error = tr("User %1 doesn't have a Grooveshark Anywhere account").arg(username_); login_state_ = LoginState_NoPremium; } if (!error.isEmpty()) { QMessageBox::warning(NULL, tr("Grooveshark login error"), error, QMessageBox::Close); ResetSessionId(); emit LoginFinished(false); return; } login_state_ = LoginState_LoggedIn; user_id_ = result["UserID"].toString(); emit LoginFinished(true); EnsureItemsCreated(); } void GroovesharkService::ClearSearchResults() { if (search_) search_->removeRows(0, search_->rowCount()); } void GroovesharkService::Logout() { ResetSessionId(); RemoveItems(); } void GroovesharkService::RemoveItems() { root_->removeRows(0, root_->rowCount()); // 'search', 'favorites', 'popular', ... items were root's children, and have // been deleted: we should update these now invalid pointers search_ = NULL; popular_month_ = NULL; popular_today_ = NULL; library_ = NULL; favorites_ = NULL; subscribed_playlists_parent_ = NULL; stations_ = NULL; grooveshark_radio_ = NULL; playlists_parent_ = NULL; playlists_.clear(); subscribed_playlists_parent_ = NULL; subscribed_playlists_.clear(); pending_retrieve_playlists_.clear(); } void GroovesharkService::ResetSessionId() { QSettings s; s.beginGroup(GroovesharkService::kSettingsGroup); session_id_.clear(); s.setValue("sessionid", session_id_); } void GroovesharkService::ShowContextMenu(const QPoint& global_pos) { EnsureMenuCreated(); // Check if we should display actions bool display_delete_playlist_action = false, display_remove_from_playlist_action = false, display_remove_from_favorites_action = false, display_remove_from_library_action = false, display_share_song_url = false, display_share_playlist_url = false; QModelIndex index(model()->current_index()); if (index.data(InternetModel::Role_Type).toInt() == InternetModel::Type_UserPlaylist && index.data(Role_PlaylistType).toInt() == UserPlaylist) { display_delete_playlist_action = true; } // We check parent's type (instead of index type) because we want to enable // 'remove' actions for items which are inside a playlist int parent_type = index.parent().data(InternetModel::Role_Type).toInt(); if (parent_type == InternetModel::Type_UserPlaylist) { int parent_playlist_type = index.parent().data(Role_PlaylistType).toInt(); if (parent_playlist_type == UserFavorites) display_remove_from_favorites_action = true; else if (parent_playlist_type == UserLibrary) display_remove_from_library_action = true; else if (parent_playlist_type == UserPlaylist) display_remove_from_playlist_action = true; } delete_playlist_->setVisible(display_delete_playlist_action); // If we can delete this playlist, we can also rename it rename_playlist_->setVisible(display_delete_playlist_action); remove_from_playlist_->setVisible(display_remove_from_playlist_action); remove_from_favorites_->setVisible(display_remove_from_favorites_action); remove_from_library_->setVisible(display_remove_from_library_action); // Check if we can display actions to get URL for sharing songs/playlists: // - share song if (index.data(InternetModel::Role_Type).toInt() == InternetModel::Type_Track) { display_share_song_url = true; current_song_id_ = ExtractSongId(index.data(InternetModel::Role_Url).toUrl()); } get_url_to_share_song_->setVisible(display_share_song_url); // - share playlist if (index.data(InternetModel::Role_Type).toInt() == InternetModel::Type_UserPlaylist && index.data(Role_UserPlaylistId).isValid()) { display_share_playlist_url = true; current_playlist_id_ = index.data(Role_UserPlaylistId).toInt(); } else if (parent_type == InternetModel::Type_UserPlaylist && index.parent().data(Role_UserPlaylistId).isValid()) { display_share_playlist_url = true; current_playlist_id_ = index.parent().data(Role_UserPlaylistId).toInt(); } get_url_to_share_playlist_->setVisible(display_share_playlist_url); context_menu_->popup(global_pos); } void GroovesharkService::EnsureMenuCreated() { if(!context_menu_) { context_menu_ = new QMenu; context_menu_->addActions(GetPlaylistActions()); create_playlist_ = context_menu_->addAction( IconLoader::Load("list-add"), tr("Create a new Grooveshark playlist"), this, SLOT(CreateNewPlaylist())); delete_playlist_ = context_menu_->addAction( IconLoader::Load("edit-delete"), tr("Delete Grooveshark playlist"), this, SLOT(DeleteCurrentPlaylist())); rename_playlist_ = context_menu_->addAction( IconLoader::Load("edit-rename"), tr("Rename Grooveshark playlist"), this, SLOT(RenameCurrentPlaylist())); context_menu_->addSeparator(); remove_from_playlist_ = context_menu_->addAction( IconLoader::Load("list-remove"), tr("Remove from playlist"), this, SLOT(RemoveCurrentFromPlaylist())); remove_from_favorites_ = context_menu_->addAction( IconLoader::Load("list-remove"), tr("Remove from favorites"), this, SLOT(RemoveCurrentFromFavorites())); remove_from_library_ = context_menu_->addAction( IconLoader::Load("list-remove"), tr("Remove from My Music"), this, SLOT(RemoveCurrentFromLibrary())); get_url_to_share_song_ = context_menu_->addAction( tr("Get a URL to share this Grooveshark song"), this, SLOT(GetCurrentSongUrlToShare())); get_url_to_share_playlist_ = context_menu_->addAction( tr("Get a URL to share this Grooveshark playlist"), this, SLOT(GetCurrentPlaylistUrlToShare())); context_menu_->addSeparator(); context_menu_->addAction(IconLoader::Load("download"), tr("Open %1 in browser").arg("grooveshark.com"), this, SLOT(Homepage())); context_menu_->addAction(IconLoader::Load("view-refresh"), tr("Refresh"), this, SLOT(RefreshItems())); context_menu_->addSeparator(); context_menu_->addAction(IconLoader::Load("configure"), tr("Configure Grooveshark..."), this, SLOT(ShowConfig())); } } void GroovesharkService::Homepage() { QDesktopServices::openUrl(QUrl(kHomepage)); } void GroovesharkService::RefreshItems() { RemoveItems(); EnsureItemsCreated(); } void GroovesharkService::EnsureItemsCreated() { if (IsLoggedIn() && !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_); QStandardItem* popular = new QStandardItem(QIcon(":/star-on.png"), tr("Popular songs")); root_->appendRow(popular); popular_month_ = new QStandardItem(QIcon(":/star-on.png"), tr("Popular songs of the Month")); popular_month_->setData(InternetModel::Type_UserPlaylist, InternetModel::Role_Type); popular_month_->setData(true, InternetModel::Role_CanLazyLoad); popular_month_->setData(InternetModel::PlayBehaviour_MultipleItems, InternetModel::Role_PlayBehaviour); popular->appendRow(popular_month_); popular_today_ = new QStandardItem(QIcon(":/star-on.png"), tr("Popular songs today")); popular_today_->setData(InternetModel::Type_UserPlaylist, InternetModel::Role_Type); popular_today_->setData(true, InternetModel::Role_CanLazyLoad); popular_today_->setData(InternetModel::PlayBehaviour_MultipleItems, InternetModel::Role_PlayBehaviour); popular->appendRow(popular_today_); QStandardItem* radios_divider = new QStandardItem(QIcon(":last.fm/icon_radio.png"), tr("Radios")); root_->appendRow(radios_divider); stations_ = new QStandardItem(QIcon(":last.fm/icon_radio.png"), tr("Stations")); stations_->setData(InternetModel::Type_UserPlaylist, InternetModel::Role_Type); stations_->setData(true, InternetModel::Role_CanLazyLoad); radios_divider->appendRow(stations_); grooveshark_radio_ = new QStandardItem(QIcon(":last.fm/icon_radio.png"), tr("Grooveshark radio")); grooveshark_radio_->setToolTip(tr("Listen to Grooveshark songs based on what you've listened to previously")); grooveshark_radio_->setData(InternetModel::Type_SmartPlaylist, InternetModel::Role_Type); radios_divider->appendRow(grooveshark_radio_); library_ = new QStandardItem(IconLoader::Load("folder-sound"), tr("My Music")); library_->setData(InternetModel::Type_UserPlaylist, InternetModel::Role_Type); library_->setData(UserLibrary, Role_PlaylistType); library_->setData(true, InternetModel::Role_CanLazyLoad); library_->setData(true, InternetModel::Role_CanBeModified); library_->setData(InternetModel::PlayBehaviour_MultipleItems, InternetModel::Role_PlayBehaviour); root_->appendRow(library_); favorites_ = new QStandardItem(QIcon(":/last.fm/love.png"), tr("Favorites")); favorites_->setData(InternetModel::Type_UserPlaylist, InternetModel::Role_Type); favorites_->setData(UserFavorites, Role_PlaylistType); favorites_->setData(true, InternetModel::Role_CanLazyLoad); favorites_->setData(true, InternetModel::Role_CanBeModified); favorites_->setData(InternetModel::PlayBehaviour_MultipleItems, InternetModel::Role_PlayBehaviour); root_->appendRow(favorites_); playlists_parent_ = new QStandardItem(tr("Playlists")); root_->appendRow(playlists_parent_); subscribed_playlists_parent_ = new QStandardItem(tr("Subscribed playlists")); root_->appendRow(subscribed_playlists_parent_); RetrieveUserFavorites(); RetrieveUserLibrarySongs(); RetrieveUserPlaylists(); RetrieveSubscribedPlaylists(); RetrieveAutoplayTags(); RetrievePopularSongs(); } } void GroovesharkService::EnsureConnected() { if (session_id_.isEmpty()) { ShowConfig(); } else { EnsureItemsCreated(); } } QStandardItem* GroovesharkService::CreatePlaylistItem(const QString& playlist_name, int playlist_id) { QStandardItem* item = new QStandardItem(playlist_name); item->setData(InternetModel::Type_UserPlaylist, InternetModel::Role_Type); item->setData(UserPlaylist, Role_PlaylistType); item->setData(true, InternetModel::Role_CanLazyLoad); item->setData(true, InternetModel::Role_CanBeModified); item->setData(InternetModel::PlayBehaviour_MultipleItems, InternetModel::Role_PlayBehaviour); item->setData(playlist_id, Role_UserPlaylistId); return item; } void GroovesharkService::RetrieveUserPlaylists() { task_playlists_id_ = app_->task_manager()->StartTask(tr("Retrieving Grooveshark playlists")); QNetworkReply* reply = CreateRequest("getUserPlaylists", QList()); NewClosure(reply, SIGNAL(finished()), this, SLOT(UserPlaylistsRetrieved(QNetworkReply*)), reply); } void GroovesharkService::UserPlaylistsRetrieved(QNetworkReply* reply) { reply->deleteLater(); QVariantMap result = ExtractResult(reply); QList playlists = ExtractPlaylistInfo(result); foreach(const PlaylistInfo& playlist_info, playlists) { int playlist_id = playlist_info.id_; const QString& playlist_name = playlist_info.name_; QStandardItem* playlist_item = CreatePlaylistItem(playlist_name, playlist_id); playlists_parent_->appendRow(playlist_item); // Keep in mind this playlist playlists_.insert(playlist_id, PlaylistInfo(playlist_id, playlist_name, playlist_item)); // Request playlist's songs RefreshPlaylist(playlist_id); } if (playlists.isEmpty()) { app_->task_manager()->SetTaskFinished(task_playlists_id_); } } void GroovesharkService::PlaylistSongsRetrieved( QNetworkReply* reply, int playlist_id) { reply->deleteLater(); pending_retrieve_playlists_.remove(playlist_id); PlaylistInfo* playlist_info = subscribed_playlists_.contains(playlist_id) ? &subscribed_playlists_[playlist_id] : &playlists_[playlist_id]; playlist_info->item_->removeRows(0, playlist_info->item_->rowCount()); QVariantMap result = ExtractResult(reply); SongList songs = ExtractSongs(result); Song::SortSongsListAlphabetically(&songs); foreach (const Song& song, songs) { QStandardItem* child = CreateSongItem(song); child->setData(playlist_info->id_, Role_UserPlaylistId); child->setData(true, InternetModel::Role_CanBeModified); playlist_info->item_->appendRow(child); } // Keep in mind this playlist playlist_info->songs_ids_ = ExtractSongsIds(result); if (pending_retrieve_playlists_.isEmpty()) { app_->task_manager()->SetTaskFinished(task_playlists_id_); } } void GroovesharkService::RetrieveUserFavorites() { int task_id = app_->task_manager()->StartTask(tr("Retrieving Grooveshark favorites songs")); QNetworkReply* reply = CreateRequest("getUserFavoriteSongs", QList()); NewClosure(reply, SIGNAL(finished()), this, SLOT(UserFavoritesRetrieved(QNetworkReply*, int)), reply, task_id); } void GroovesharkService::UserFavoritesRetrieved(QNetworkReply* reply, int task_id) { reply->deleteLater(); app_->task_manager()->SetTaskFinished(task_id); if (!favorites_) { // The use probably logged out before the response arrived. return; } favorites_->removeRows(0, favorites_->rowCount()); QVariantMap result = ExtractResult(reply); SongList songs = ExtractSongs(result); Song::SortSongsListAlphabetically(&songs); foreach (const Song& song, songs) { QStandardItem* child = CreateSongItem(song); child->setData(true, InternetModel::Role_CanBeModified); favorites_->appendRow(child); } } void GroovesharkService::RetrieveUserLibrarySongs() { int task_id = app_->task_manager()->StartTask(tr("Retrieving Grooveshark My Music songs")); QNetworkReply* reply = CreateRequest("getUserLibrarySongs", QList()); NewClosure(reply, SIGNAL(finished()), this, SLOT(UserLibrarySongsRetrieved(QNetworkReply*, int)), reply, task_id); } void GroovesharkService::UserLibrarySongsRetrieved(QNetworkReply* reply, int task_id) { reply->deleteLater(); app_->task_manager()->SetTaskFinished(task_id); if (!library_) { // The use probably logged out before the response arrived. return; } library_->removeRows(0, library_->rowCount()); QVariantMap result = ExtractResult(reply); SongList songs = ExtractSongs(result); Song::SortSongsListAlphabetically(&songs); foreach (const Song& song, songs) { QStandardItem* child = CreateSongItem(song); child->setData(true, InternetModel::Role_CanBeModified); library_->appendRow(child); } } void GroovesharkService::RetrievePopularSongs() { task_popular_id_ = app_->task_manager()->StartTask(tr("Getting Grooveshark popular songs")); RetrievePopularSongsMonth(); RetrievePopularSongsToday(); } void GroovesharkService::RetrievePopularSongsMonth() { QList parameters; parameters << Param("limit", QString::number(kSongSearchLimit)); QNetworkReply* reply = CreateRequest("getPopularSongsMonth", parameters); NewClosure(reply, SIGNAL(finished()), this, SLOT(PopularSongsMonthRetrieved(QNetworkReply*)), reply); } void GroovesharkService::PopularSongsMonthRetrieved(QNetworkReply* reply) { reply->deleteLater(); QVariantMap result = ExtractResult(reply); SongList songs = ExtractSongs(result); app_->task_manager()->IncreaseTaskProgress(task_popular_id_, 50, 100); if (app_->task_manager()->GetTaskProgress(task_popular_id_) >= 100) { app_->task_manager()->SetTaskFinished(task_popular_id_); } if (!popular_month_) return; foreach (const Song& song, songs) { QStandardItem* child = CreateSongItem(song); popular_month_->appendRow(child); } } void GroovesharkService::RetrievePopularSongsToday() { QList parameters; parameters << Param("limit", QString::number(kSongSearchLimit)); QNetworkReply* reply = CreateRequest("getPopularSongsToday", parameters); NewClosure(reply, SIGNAL(finished()), this, SLOT(PopularSongsTodayRetrieved(QNetworkReply*)), reply); } void GroovesharkService::PopularSongsTodayRetrieved(QNetworkReply* reply) { reply->deleteLater(); QVariantMap result = ExtractResult(reply); SongList songs = ExtractSongs(result); app_->task_manager()->IncreaseTaskProgress(task_popular_id_, 50, 100); if (app_->task_manager()->GetTaskProgress(task_popular_id_) >= 100) { app_->task_manager()->SetTaskFinished(task_popular_id_); } if (!popular_today_) return; foreach (const Song& song, songs) { QStandardItem* child = CreateSongItem(song); popular_today_->appendRow(child); } } void GroovesharkService::RetrieveSubscribedPlaylists() { QNetworkReply* reply = CreateRequest("getUserPlaylistsSubscribed", QList()); NewClosure(reply, SIGNAL(finished()), this, SLOT(SubscribedPlaylistsRetrieved(QNetworkReply*)), reply); } void GroovesharkService::SubscribedPlaylistsRetrieved(QNetworkReply* reply) { reply->deleteLater(); QVariantMap result = ExtractResult(reply); QList playlists = ExtractPlaylistInfo(result); foreach(const PlaylistInfo& playlist_info, playlists) { int playlist_id = playlist_info.id_; const QString& playlist_name = playlist_info.name_; QStandardItem* playlist_item = CreatePlaylistItem(playlist_name, playlist_id); // Refine some playlist properties that should be different for subscribed // playlists playlist_item->setData(SubscribedPlaylist, Role_PlaylistType); playlist_item->setData(false, InternetModel::Role_CanBeModified); subscribed_playlists_.insert(playlist_id, PlaylistInfo(playlist_id, playlist_name, playlist_item)); subscribed_playlists_parent_->appendRow(playlist_item); // Request playlist's songs RefreshPlaylist(playlist_id); } } void GroovesharkService::RetrieveAutoplayTags() { QNetworkReply* reply = CreateRequest("getAutoplayTags", QList()); NewClosure(reply, SIGNAL(finished()), this, SLOT(AutoplayTagsRetrieved(QNetworkReply*)), reply); } void GroovesharkService::AutoplayTagsRetrieved(QNetworkReply* reply) { reply->deleteLater(); QVariantMap result = ExtractResult(reply); QVariantMap::const_iterator it; if (!stations_) return; for (it = result.constBegin(); it != result.constEnd(); ++it) { int id = it.key().toInt(); QString name = it.value().toString().toLower(); // Names received aren't very nice: make them more user friendly to display name.replace("_", " "); name[0] = name[0].toUpper(); QStandardItem* item = new QStandardItem(QIcon(":last.fm/icon_radio.png"), name); item->setData(InternetModel::Type_SmartPlaylist, InternetModel::Role_Type); item->setData(InternetModel::PlayBehaviour_SingleItem, InternetModel::Role_PlayBehaviour); item->setData(id, Role_UserPlaylistId); stations_->appendRow(item); } } Song GroovesharkService::StartAutoplayTag(int tag_id, QVariantMap& autoplay_state) { QList parameters; parameters << Param("tagID", tag_id); QNetworkReply* reply = CreateRequest("startAutoplayTag", parameters); bool reply_has_timeouted = !WaitForReply(reply); reply->deleteLater(); if (reply_has_timeouted) return Song(); QVariantMap result = ExtractResult(reply); autoplay_state = result["autoplayState"].toMap(); return ExtractSong(result["nextSong"].toMap()); } Song GroovesharkService::StartAutoplay(QVariantMap& autoplay_state) { QList parameters; QVariantList artists_ids_qvariant; foreach (int artist_id, last_artists_ids_) { artists_ids_qvariant << QVariant(artist_id); } QVariantList songs_ids_qvariant; foreach (int song_id, last_songs_ids_) { songs_ids_qvariant << QVariant(song_id); } parameters << Param("artistIDs", artists_ids_qvariant) << Param("songIDs", songs_ids_qvariant); QNetworkReply* reply = CreateRequest("startAutoplay", parameters); bool reply_has_timeouted = !WaitForReply(reply); reply->deleteLater(); if (reply_has_timeouted) return Song(); QVariantMap result = ExtractResult(reply); autoplay_state = result["autoplayState"].toMap(); return ExtractSong(result["nextSong"].toMap()); } Song GroovesharkService::GetAutoplaySong(QVariantMap& autoplay_state) { QList parameters; parameters << Param("autoplayState", autoplay_state); QNetworkReply* reply = CreateRequest("getAutoplaySong", parameters); bool reply_has_timeouted = !WaitForReply(reply); reply->deleteLater(); if (reply_has_timeouted) return Song(); QVariantMap result = ExtractResult(reply); autoplay_state = result["autoplayState"].toMap(); return ExtractSong(result["nextSong"].toMap()); } void GroovesharkService::MarkStreamKeyOver30Secs(const QString& stream_key, const QString& server_id) { QList parameters; parameters << Param("streamKey", stream_key) << Param("streamServerID", server_id); QNetworkReply* reply = CreateRequest("markStreamKeyOver30Secs", parameters); NewClosure(reply, SIGNAL(finished()), this, SLOT(StreamMarked(QNetworkReply*)), reply); } void GroovesharkService::StreamMarked(QNetworkReply* reply) { reply->deleteLater(); QVariantMap result = ExtractResult(reply); if (!result["success"].toBool()) { qLog(Warning) << "Grooveshark markStreamKeyOver30Secs failed"; } } void GroovesharkService::MarkSongComplete(const QString& song_id, const QString& stream_key, const QString& server_id) { QList parameters; parameters << Param("songID", song_id) << Param("streamKey", stream_key) << Param("streamServerID", server_id); QNetworkReply* reply = CreateRequest("markSongComplete", parameters); NewClosure(reply, SIGNAL(finished()), this, SLOT(SongMarkedAsComplete(QNetworkReply*)), reply); } void GroovesharkService::SongMarkedAsComplete(QNetworkReply* reply) { reply->deleteLater(); QVariantMap result = ExtractResult(reply); if (!result["success"].toBool()) { qLog(Warning) << "Grooveshark markSongComplete failed"; } } void GroovesharkService::ItemDoubleClicked(QStandardItem* item) { if (item == root_) { EnsureConnected(); } } GeneratorPtr GroovesharkService::CreateGenerator(QStandardItem* item) { GeneratorPtr ret; if (!item || item->data(InternetModel::Role_Type).toInt() != InternetModel::Type_SmartPlaylist) { return ret; } if (item == grooveshark_radio_) { if (last_artists_ids_.isEmpty()) { QMessageBox::warning(NULL, tr("Error"), tr("To start Grooveshark radio, you should first listen to a few other Grooveshark songs")); return ret; } ret = GeneratorPtr(new GroovesharkRadio(this)); } else { int tag_id = item->data(Role_UserPlaylistId).toInt(); ret = GeneratorPtr(new GroovesharkRadio(this ,tag_id)); } return ret; } void GroovesharkService::DropMimeData(const QMimeData* data, const QModelIndex& index) { if (!data) { return; } // Get Grooveshark songs' ids, if any. QList data_songs_ids = ExtractSongsIds(data->urls()); if (data_songs_ids.isEmpty()) { // There is none: probably means user didn't dropped Grooveshark songs return; } int type = index.data(InternetModel::Role_Type).toInt(); int parent_type = index.parent().data(InternetModel::Role_Type).toInt(); if (type == InternetModel::Type_UserPlaylist || parent_type == InternetModel::Type_UserPlaylist) { int playlist_type = index.data(Role_PlaylistType).toInt(); int parent_playlist_type = index.parent().data(Role_PlaylistType).toInt(); // If dropped on Favorites list if (playlist_type == UserFavorites || parent_playlist_type == UserFavorites) { foreach (int song_id, data_songs_ids) { AddUserFavoriteSong(song_id); } } else if (playlist_type == UserLibrary || parent_playlist_type == UserLibrary) { // FIXME: Adding songs to user libray doesn't work atm, but the problem // seems to be on Grooveshark server side, as it returns success=true // when calling addUserLibrarySongs with a valid song id. // So this code is deactivated for now to not mislead user //AddUserLibrarySongs(data_songs_ids); } else { // Dropped on a normal playlist // Get the playlist int playlist_id = index.data(Role_UserPlaylistId).toInt(); if (!playlists_.contains(playlist_id)) { return; } // Get the current playlist's songs PlaylistInfo playlist = playlists_[playlist_id]; QList songs_ids = playlist.songs_ids_; songs_ids << data_songs_ids; SetPlaylistSongs(playlist_id, songs_ids); } } } QList GroovesharkService::playlistitem_actions(const Song& song) { // Clear previous actions while (!playlistitem_actions_.isEmpty()) { QAction* action = playlistitem_actions_.takeFirst(); QMenu* menu = action->menu(); if (menu) delete menu; delete action; } // Create a 'add to favorites' action QAction* add_to_favorites = new QAction(QIcon(":/last.fm/love.png"), tr("Add to Grooveshark favorites"), this); connect(add_to_favorites, SIGNAL(triggered()), SLOT(AddCurrentSongToUserFavorites())); playlistitem_actions_.append(add_to_favorites); // FIXME: as explained above, adding songs to library doesn't work currently //QAction* add_to_library = new QAction(IconLoader::Load("folder-sound"), // tr("Add to Grooveshark My Music"), this); //connect(add_to_library, SIGNAL(triggered()), SLOT(AddCurrentSongToUserLibrary())); //playlistitem_actions_.append(add_to_library); // Create a menu with 'add to playlist' actions for each Grooveshark playlist QAction* add_to_playlists = new QAction(IconLoader::Load("list-add"), tr("Add to Grooveshark playlists"), this); QMenu* playlists_menu = new QMenu(); foreach (PlaylistInfo playlist_info, playlists_.values()) { QAction* add_to_playlist = new QAction(playlist_info.name_, this); add_to_playlist->setData(playlist_info.id_); playlists_menu->addAction(add_to_playlist); } connect(playlists_menu, SIGNAL(triggered(QAction*)), SLOT(AddCurrentSongToPlaylist(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 Grooveshark song"), this); connect(share_song, SIGNAL(triggered()), SLOT(GetCurrentSongUrlToShare())); playlistitem_actions_.append(share_song); // Keep in mind the current song id current_song_id_ = ExtractSongId(song.url()); return playlistitem_actions_; } void GroovesharkService::GetCurrentSongUrlToShare() { GetSongUrlToShare(current_song_id_); } void GroovesharkService::GetSongUrlToShare(int song_id) { QList parameters; parameters << Param("songID", song_id); QNetworkReply* reply = CreateRequest("getSongURLFromSongID", parameters); NewClosure(reply, SIGNAL(finished()), this, SLOT(SongUrlToShareReceived(QNetworkReply*)), reply); } void GroovesharkService::SongUrlToShareReceived(QNetworkReply* reply) { reply->deleteLater(); QVariantMap result = ExtractResult(reply); if (!result["url"].isValid()) return; QString url = result["url"].toString(); ShowUrlBox(tr("Grooveshark song's URL"), url); } void GroovesharkService::GetCurrentPlaylistUrlToShare() { GetPlaylistUrlToShare(current_playlist_id_); } void GroovesharkService::GetPlaylistUrlToShare(int playlist_id) { QList parameters; parameters << Param("playlistID", playlist_id); QNetworkReply* reply = CreateRequest("getPlaylistURLFromPlaylistID", parameters); NewClosure(reply, SIGNAL(finished()), this, SLOT(PlaylistUrlToShareReceived(QNetworkReply*)), reply); } void GroovesharkService::PlaylistUrlToShareReceived(QNetworkReply* reply) { reply->deleteLater(); QVariantMap result = ExtractResult(reply); if (!result["url"].isValid()) return; QString url = result["url"].toString(); ShowUrlBox(tr("Grooveshark playlist's URL"), url); } void GroovesharkService::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); } } void GroovesharkService::AddCurrentSongToPlaylist(QAction* action) { int playlist_id = action->data().toInt(); if (!playlists_.contains(playlist_id)) { return; } // Get the current playlist's songs PlaylistInfo playlist = playlists_[playlist_id]; QList songs_ids = playlist.songs_ids_; songs_ids << current_song_id_; SetPlaylistSongs(playlist_id, songs_ids); } void GroovesharkService::SetPlaylistSongs(int playlist_id, const QList& songs_ids) { // If we are still retrieving playlists songs, don't update playlist: don't // take the risk to erase all (not yet retrieved) playlist's songs. if (!pending_retrieve_playlists_.isEmpty()) return; int task_id = app_->task_manager()->StartTask(tr("Update Grooveshark playlist")); QList parameters; // Convert song ids to QVariant QVariantList songs_ids_qvariant; foreach (int song_id, songs_ids) { songs_ids_qvariant << QVariant(song_id); } parameters << Param("playlistID", playlist_id) << Param("songIDs", songs_ids_qvariant); QNetworkReply* reply = CreateRequest("setPlaylistSongs", parameters); NewClosure(reply, SIGNAL(finished()), this, SLOT(PlaylistSongsSet(QNetworkReply*, int, int)), reply, playlist_id, task_id); } void GroovesharkService::PlaylistSongsSet(QNetworkReply* reply, int playlist_id, int task_id) { reply->deleteLater(); app_->task_manager()->SetTaskFinished(task_id); QVariantMap result = ExtractResult(reply); if (!result["success"].toBool()) { qLog(Warning) << "Grooveshark setPlaylistSongs failed"; return; } RefreshPlaylist(playlist_id); } void GroovesharkService::RefreshPlaylist(int playlist_id) { QList parameters; parameters << Param("playlistID", playlist_id); QNetworkReply* reply = CreateRequest("getPlaylistSongs", parameters); NewClosure(reply, SIGNAL(finished()), this, SLOT(PlaylistSongsRetrieved(QNetworkReply*, int)), reply, playlist_id); pending_retrieve_playlists_.insert(playlist_id); } void GroovesharkService::CreateNewPlaylist() { QString name = QInputDialog::getText(NULL, tr("Create a new Grooveshark playlist"), tr("Name"), QLineEdit::Normal); if (name.isEmpty()) { return; } QList parameters; parameters << Param("name", name) << Param("songIDs", QVariantList()); QNetworkReply* reply = CreateRequest("createPlaylist", parameters); NewClosure(reply, SIGNAL(finished()), this, SLOT(NewPlaylistCreated(QNetworkReply*, const QString&)), reply, name); } void GroovesharkService::NewPlaylistCreated(QNetworkReply* reply, const QString& name) { reply->deleteLater(); QVariantMap result = ExtractResult(reply); if (!result["success"].toBool() || !result["playlistID"].isValid()) { qLog(Warning) << "Grooveshark createPlaylist failed"; return; } int playlist_id = result["playlistID"].toInt(); QStandardItem* new_playlist_item = CreatePlaylistItem(name, playlist_id); PlaylistInfo playlist_info(playlist_id, name, new_playlist_item); playlist_info.item_ = new_playlist_item; playlists_parent_->appendRow(new_playlist_item); playlists_.insert(playlist_id, playlist_info); } void GroovesharkService::DeleteCurrentPlaylist() { if (model()->current_index().data(InternetModel::Role_Type).toInt() != InternetModel::Type_UserPlaylist) { return; } int playlist_id = model()->current_index().data(Role_UserPlaylistId).toInt(); DeletePlaylist(playlist_id); } void GroovesharkService::DeletePlaylist(int playlist_id) { if (!playlists_.contains(playlist_id)) { return; } boost::scoped_ptr confirmation_dialog(new QMessageBox( QMessageBox::Question, tr("Delete Grooveshark playlist"), tr("Are you sure you want to delete this playlist?"), QMessageBox::Yes | QMessageBox::Cancel)); if (confirmation_dialog->exec() != QMessageBox::Yes) { return; } QList parameters; parameters << Param("playlistID", playlist_id); QNetworkReply* reply = CreateRequest("deletePlaylist", parameters); NewClosure(reply, SIGNAL(finished()), this, SLOT(PlaylistDeleted(QNetworkReply*, int)), reply, playlist_id); } void GroovesharkService::PlaylistDeleted(QNetworkReply* reply, int playlist_id) { reply->deleteLater(); QVariantMap result = ExtractResult(reply); if (!result["success"].toBool()) { qLog(Warning) << "Grooveshark deletePlaylist failed"; return; } if (!playlists_.contains(playlist_id)) { return; } PlaylistInfo playlist_info = playlists_.take(playlist_id); playlists_parent_->removeRow(playlist_info.item_->row()); } void GroovesharkService::RenameCurrentPlaylist() { const QModelIndex& index(model()->current_index()); if (index.data(InternetModel::Role_Type).toInt() != InternetModel::Type_UserPlaylist || index.data(Role_PlaylistType).toInt() != UserPlaylist) { return; } const int playlist_id = index.data(Role_UserPlaylistId).toInt(); RenamePlaylist(playlist_id); } void GroovesharkService::RenamePlaylist(int playlist_id) { if (!playlists_.contains(playlist_id)) { return; } const QString& old_name = playlists_[playlist_id].name_; QString new_name = QInputDialog::getText(NULL, tr("Rename \"%1\" playlist").arg(old_name), tr("Name"), QLineEdit::Normal, old_name); if (new_name.isEmpty()) { return; } QList parameters; parameters << Param("playlistID", playlist_id) << Param("name", new_name); QNetworkReply* reply = CreateRequest("renamePlaylist", parameters); NewClosure(reply, SIGNAL(finished()), this, SLOT(PlaylistRenamed(QNetworkReply*, int, const QString&)), reply, playlist_id, new_name); } void GroovesharkService::PlaylistRenamed(QNetworkReply* reply, int playlist_id, const QString& new_name) { reply->deleteLater(); QVariantMap result = ExtractResult(reply); if (!result["success"].toBool()) { qLog(Warning) << "Grooveshark renamePlaylist failed"; return; } if (!playlists_.contains(playlist_id)) { return; } PlaylistInfo& playlist_info = playlists_[playlist_id]; playlist_info.name_ = new_name; playlist_info.item_->setText(new_name); } void GroovesharkService::AddUserFavoriteSong(int song_id) { int task_id = app_->task_manager()->StartTask(tr("Adding song to favorites")); QList parameters; parameters << Param("songID", song_id); QNetworkReply* reply = CreateRequest("addUserFavoriteSong", parameters); NewClosure(reply, SIGNAL(finished()), this, SLOT(UserFavoriteSongAdded(QNetworkReply*, int)), reply, task_id); } void GroovesharkService::UserFavoriteSongAdded(QNetworkReply* reply, int task_id) { reply->deleteLater(); app_->task_manager()->SetTaskFinished(task_id); QVariantMap result = ExtractResult(reply); if (!result["success"].toBool()) { qLog(Warning) << "Grooveshark addUserFavoriteSong failed"; return; } // Refresh user's favorites list RetrieveUserFavorites(); } void GroovesharkService::AddUserLibrarySongs(const QList& songs_ids) { int task_id = app_->task_manager()->StartTask(tr("Adding song to My Music")); QList parameters; // Convert songs ids to QVariant QVariantList songs_ids_qvariant; foreach (int song_id, songs_ids) { songs_ids_qvariant << QVariant(song_id); } QVariantList albums_ids_qvariant; QVariantList artists_ids_qvariant; parameters << Param("songIDs", songs_ids_qvariant); // We do not support albums and artist parameters for now, but they are // required parameters << Param("albumIDs", albums_ids_qvariant); parameters << Param("artistIDs", artists_ids_qvariant); QNetworkReply* reply = CreateRequest("addUserLibrarySongs", parameters); NewClosure(reply, SIGNAL(finished()), this, SLOT(UserLibrarySongAdded(QNetworkReply*, int)), reply, task_id); } void GroovesharkService::UserLibrarySongAdded(QNetworkReply* reply, int task_id) { reply->deleteLater(); app_->task_manager()->SetTaskFinished(task_id); QVariantMap result = ExtractResult(reply); if (!result["success"].toBool()) { qLog(Warning) << "Grooveshark addUserLibrarySongs failed"; return; } // Refresh user's library list RetrieveUserLibrarySongs(); } void GroovesharkService::RemoveCurrentFromPlaylist() { const QModelIndexList& indexes(model()->selected_indexes()); QMap > playlists_songs_ids; foreach (const QModelIndex& index, indexes) { if (index.parent().data(InternetModel::Role_Type).toInt() != InternetModel::Type_UserPlaylist) { continue; } int playlist_id = index.data(Role_UserPlaylistId).toInt(); int song_id = ExtractSongId(index.data(InternetModel::Role_Url).toUrl()); if (song_id) { playlists_songs_ids[playlist_id] << song_id; } } for (QMap >::const_iterator it = playlists_songs_ids.constBegin(); it != playlists_songs_ids.constEnd(); ++it) { RemoveFromPlaylist(it.key(), it.value()); } } void GroovesharkService::RemoveFromPlaylist(int playlist_id, const QList& songs_ids_to_remove) { if (!playlists_.contains(playlist_id)) { return; } QList songs_ids = playlists_[playlist_id].songs_ids_; foreach (const int song_id, songs_ids_to_remove) { songs_ids.removeOne(song_id); } SetPlaylistSongs(playlist_id, songs_ids); } void GroovesharkService::RemoveCurrentFromFavorites() { const QModelIndexList& indexes(model()->selected_indexes()); QList songs_ids; foreach (const QModelIndex& index, indexes) { if (index.parent().data(Role_PlaylistType).toInt() != UserFavorites) { continue; } int song_id = ExtractSongId(index.data(InternetModel::Role_Url).toUrl()); if (song_id) { songs_ids << song_id; } } RemoveFromFavorites(songs_ids); } void GroovesharkService::RemoveFromFavorites(const QList& songs_ids_to_remove) { if (songs_ids_to_remove.isEmpty()) return; int task_id = app_->task_manager()->StartTask(tr("Removing songs from favorites")); QList parameters; // Convert song ids to QVariant QVariantList songs_ids_qvariant; foreach (const int song_id, songs_ids_to_remove) { songs_ids_qvariant << QVariant(song_id); } parameters << Param("songIDs", songs_ids_qvariant); QNetworkReply* reply = CreateRequest("removeUserFavoriteSongs", parameters); NewClosure(reply, SIGNAL(finished()), this, SLOT(SongsRemovedFromFavorites(QNetworkReply*, int)), reply, task_id); } void GroovesharkService::SongsRemovedFromFavorites(QNetworkReply* reply, int task_id) { app_->task_manager()->SetTaskFinished(task_id); reply->deleteLater(); QVariantMap result = ExtractResult(reply); if (!result["success"].toBool()) { qLog(Warning) << "Grooveshark removeUserFavoriteSongs failed"; return; } RetrieveUserFavorites(); } void GroovesharkService::RemoveCurrentFromLibrary() { const QModelIndexList& indexes(model()->selected_indexes()); QList songs_ids; foreach (const QModelIndex& index, indexes) { if (index.parent().data(Role_PlaylistType).toInt() != UserLibrary) { continue; } int song_id = ExtractSongId(index.data(InternetModel::Role_Url).toUrl()); if (song_id) { songs_ids << song_id; } } RemoveFromLibrary(songs_ids); } void GroovesharkService::RemoveFromLibrary(const QList& songs_ids_to_remove) { if (songs_ids_to_remove.isEmpty()) return; int task_id = app_->task_manager()->StartTask(tr("Removing songs from My Music")); QList parameters; // Convert song ids to QVariant QVariantList songs_ids_qvariant; foreach (const int song_id, songs_ids_to_remove) { songs_ids_qvariant << QVariant(song_id); } QVariantList albums_ids_qvariant; QVariantList artists_ids_qvariant; parameters << Param("songIDs", songs_ids_qvariant); // We do not support albums and artist parameters for now, but they are // required parameters << Param("albumIDs", albums_ids_qvariant); parameters << Param("artistIDs", artists_ids_qvariant); QNetworkReply* reply = CreateRequest("removeUserLibrarySongs", parameters); NewClosure(reply, SIGNAL(finished()), this, SLOT(SongsRemovedFromLibrary(QNetworkReply*, int)), reply, task_id); } void GroovesharkService::SongsRemovedFromLibrary(QNetworkReply* reply, int task_id) { app_->task_manager()->SetTaskFinished(task_id); reply->deleteLater(); QVariantMap result = ExtractResult(reply); if (!result["success"].toBool()) { qLog(Warning) << "Grooveshark removeUserLibrarySongs failed"; return; } RetrieveUserLibrarySongs(); } QNetworkReply* GroovesharkService::CreateRequest( const QString& method_name, const QList& params, bool use_https) { QVariantMap request_params; request_params.insert("method", method_name); QVariantMap header; header.insert("wsKey", kApiKey); if (session_id_.isEmpty()) { if (method_name != "startSession") { // It's normal to not have a session_id when calling startSession. // Otherwise it's not, so print a warning message qLog(Warning) << "Session ID is empty: will not be added to query"; } } else { header.insert("sessionID", session_id_); } request_params.insert("header", header); QVariantMap parameters; foreach(const Param& param, params) { parameters.insert(param.first, param.second); } request_params.insert("parameters", parameters); QJson::Serializer serializer; QByteArray post_params = serializer.serialize(request_params); QUrl url(kUrl); if (use_https) { url.setScheme("https"); } url.setQueryItems( QList >() << QPair("sig", Utilities::HmacMd5(api_key_, post_params).toHex())); QNetworkRequest req(url); QNetworkReply *reply = network_->post(req, post_params); if (use_https) { connect(reply, SIGNAL(sslErrors(QList)), SLOT(RequestSslErrors(QList))); } return reply; } void GroovesharkService::RequestSslErrors(const QList& errors) { QNetworkReply* reply = qobject_cast(sender()); foreach (const QSslError& error, errors) { emit StreamError("SSL error occurred in Grooveshark request for " + reply->url().toString() + ": " + error.errorString()); } } bool GroovesharkService::WaitForReply(QNetworkReply* reply) { QEventLoop event_loop; QTimer timeout_timer; connect(&timeout_timer, SIGNAL(timeout()), &event_loop, SLOT(quit())); connect(reply, SIGNAL(finished()), &event_loop, SLOT(quit())); timeout_timer.start(10000); event_loop.exec(); if (!timeout_timer.isActive()) { qLog(Error) << "Grooveshark request timeout"; return false; } timeout_timer.stop(); return true; } QVariantMap GroovesharkService::ExtractResult(QNetworkReply* reply) { QJson::Parser parser; bool ok; QVariantMap result = parser.parse(reply, &ok).toMap(); if (!ok) { qLog(Error) << "Error while parsing Grooveshark result"; } QVariantList errors = result["errors"].toList(); QVariantList::iterator it; for (it = errors.begin(); it != errors.end(); ++it) { QVariantMap error = (*it).toMap(); qLog(Error) << "Grooveshark error: " << error["message"].toString(); switch (error["code"].toInt()) { case 100: // User auth required case 102: // User premium required // These errors can happen if session_id is obsolete (e.g. we haven't use // it for more than two weeks): force the user to login again Logout(); break; } } return result["result"].toMap(); } SongList GroovesharkService::ExtractSongs(const QVariantMap& result) { QVariantList result_songs = result["songs"].toList(); SongList songs; for (int i=0; i GroovesharkService::ExtractSongsIds(const QVariantMap& result) { QVariantList result_songs = result["songs"].toList(); QList songs_ids; for (int i=0; i GroovesharkService::ExtractSongsIds(const QList& urls) { QList songs_ids; foreach (const QUrl& url, urls) { int song_id = ExtractSongId(url); if (song_id) { songs_ids << song_id; } } return songs_ids; } int GroovesharkService::ExtractSongId(const QUrl& url) { if (url.scheme() == "grooveshark") { QStringList ids = url.toString().remove("grooveshark://").split("/"); if (ids.size() == 3) // Returns the third id: song id return ids[2].toInt(); } return 0; } QList GroovesharkService::ExtractPlaylistInfo(const QVariantMap& result) { QVariantList playlists_qvariant = result["playlists"].toList(); QList playlists; // Get playlists info foreach (const QVariant& playlist_qvariant, playlists_qvariant) { QVariantMap playlist = playlist_qvariant.toMap(); int playlist_id = playlist["PlaylistID"].toInt(); QString playlist_name = playlist["PlaylistName"].toString(); playlists << PlaylistInfo(playlist_id, playlist_name); } // Sort playlists by name qSort(playlists.begin(), playlists.end()); return playlists; } clementine-1.2.0+dfsg/src/internet/groovesharkservice.h000066400000000000000000000270501223327513400232650ustar00rootroot00000000000000/* 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 GROOVESHARKSERVICE_H #define GROOVESHARKSERVICE_H #include "internetmodel.h" #include "internetservice.h" #include class GroovesharkUrlHandler; class NetworkAccessManager; class Playlist; class SearchBoxWidget; class QMenu; class QNetworkReply; class QNetworkRequest; class QSortFilterProxyModel; class GroovesharkService : public InternetService { Q_OBJECT public: GroovesharkService(Application* app, InternetModel *parent); ~GroovesharkService(); enum Role { Role_UserPlaylistId = InternetModel::RoleCount, Role_PlaylistType }; enum PlaylistType { UserPlaylist = Qt::UserRole, // Favorites and Library list are like playlists, but we want to do special // treatments in some cases UserFavorites, UserLibrary, SubscribedPlaylist }; // Values are persisted - don't change. enum LoginState { LoginState_LoggedIn = 1, LoginState_AuthFailed = 2, LoginState_NoPremium = 3, LoginState_OtherError = 4 }; // Internet Service methods QStandardItem* CreateRootItem(); void LazyPopulate(QStandardItem *parent); void ItemDoubleClicked(QStandardItem* item); smart_playlists::GeneratorPtr CreateGenerator(QStandardItem* item); void DropMimeData(const QMimeData* data, const QModelIndex& index); QList playlistitem_actions(const Song& song); void ShowContextMenu(const QPoint& global_pos); QWidget* HeaderWidget() const; // User should be logged in to be able to generate streaming urls QUrl GetStreamingUrlFromSongId(const QString& song_id, const QString& artist_id, QString* server_id, QString* stream_key, qint64* length_nanosec); void Login(const QString& username, const QString& password); void Logout(); bool IsLoggedIn() const { return !session_id_.isEmpty(); } void RetrieveUserPlaylists(); void RetrieveUserFavorites(); void RetrieveUserLibrarySongs(); void RetrievePopularSongs(); void RetrievePopularSongsMonth(); void RetrievePopularSongsToday(); void RetrieveSubscribedPlaylists(); void RetrieveAutoplayTags(); void SetPlaylistSongs(int playlist_id, const QList& songs_ids); void RemoveFromPlaylist(int playlist_id, const QList& songs_ids_to_remove); // Refresh playlist_id playlist , or create it if it doesn't exist void RefreshPlaylist(int playlist_id); void DeletePlaylist(int playlist_id); void RenamePlaylist(int playlist_id); void AddUserFavoriteSong(int song_id); void RemoveFromFavorites(const QList& songs_ids_to_remove); void AddUserLibrarySongs(const QList& songs_ids); void RemoveFromLibrary(const QList& songs_ids_to_remove); void GetSongUrlToShare(int song_id); void GetPlaylistUrlToShare(int playlist_id); // Start autoplay for the given tag_id, fill the autoplay_state, returns a // first song to play Song StartAutoplayTag(int tag_id, QVariantMap& autoplay_state); Song StartAutoplay(QVariantMap& autoplay_state); // Get another autoplay song. autoplay_state is the autoplay_state received from StartAutoplayTag Song GetAutoplaySong(QVariantMap& autoplay_state); void MarkStreamKeyOver30Secs(const QString& stream_key, const QString& server_id); void MarkSongComplete(const QString& song_id, const QString& stream_key, const QString& server_id); // Persisted in the settings and updated on each Login(). LoginState login_state() const { return login_state_; } const QString& session_id() { return session_id_; } int SimpleSearch(const QString& query); int SearchAlbums(const QString& query); void GetAlbumSongs(quint64 album_id); static const char* kServiceName; static const char* kSettingsGroup; signals: void LoginFinished(bool success); void SimpleSearchResults(int id, SongList songs); // AlbumSearchResult emits the search id and the Grooveshark ids of the // albums found. Albums' songs will be loaded asynchronously and // AlbumSongsLoaded will be emitted, containing the actual Albums' songs. void AlbumSearchResult(int id, QList albums_ids); void AlbumSongsLoaded(quint64 id, SongList songs); public slots: void Search(const QString& text, bool now = false); void ShowConfig(); protected: struct PlaylistInfo { PlaylistInfo() {} PlaylistInfo(int id, QString name, QStandardItem* item = NULL) : id_(id), name_(name), item_(item) {} bool operator< (const PlaylistInfo other) const { return name_.localeAwareCompare(other.name_) < 0; } int id_; QString name_; QStandardItem* item_; QList songs_ids_; }; private slots: void SessionCreated(QNetworkReply* reply); void DoSearch(); void SearchSongsFinished(QNetworkReply* reply); void SimpleSearchFinished(QNetworkReply* reply, int id); void SearchAlbumsFinished(QNetworkReply* reply, int id); void GetAlbumSongsFinished(QNetworkReply* reply, quint64 album_id); void Authenticated(QNetworkReply* reply); void UserPlaylistsRetrieved(QNetworkReply* reply); void UserFavoritesRetrieved(QNetworkReply* reply, int task_id); void UserLibrarySongsRetrieved(QNetworkReply* reply, int task_id); void PopularSongsMonthRetrieved(QNetworkReply* reply); void PopularSongsTodayRetrieved(QNetworkReply* reply); void SubscribedPlaylistsRetrieved(QNetworkReply* reply); void AutoplayTagsRetrieved(QNetworkReply* reply); void PlaylistSongsRetrieved(QNetworkReply* reply, int playlist_id); void PlaylistSongsSet(QNetworkReply* reply, int playlist_id, int task_id); void CreateNewPlaylist(); void NewPlaylistCreated(QNetworkReply* reply, const QString& name); void DeleteCurrentPlaylist(); void RenameCurrentPlaylist(); void PlaylistDeleted(QNetworkReply* reply, int playlist_id); void PlaylistRenamed(QNetworkReply* reply, int playlist_id, const QString& new_name); void AddCurrentSongToUserFavorites() { AddUserFavoriteSong(current_song_id_); } void AddCurrentSongToUserLibrary() { AddUserLibrarySongs(QList() << current_song_id_); } void AddCurrentSongToPlaylist(QAction* action); void UserFavoriteSongAdded(QNetworkReply* reply, int task_id); void UserLibrarySongAdded(QNetworkReply* reply, int task_id); void GetCurrentSongUrlToShare(); void SongUrlToShareReceived(QNetworkReply* reply); void GetCurrentPlaylistUrlToShare(); void PlaylistUrlToShareReceived(QNetworkReply* reply); void RemoveCurrentFromPlaylist(); void RemoveCurrentFromFavorites(); void RemoveCurrentFromLibrary(); void SongsRemovedFromFavorites(QNetworkReply* reply, int task_id); void SongsRemovedFromLibrary(QNetworkReply* reply, int task_id); void StreamMarked(QNetworkReply* reply); void SongMarkedAsComplete(QNetworkReply* reply); void RequestSslErrors(const QList& errors); void Homepage(); // Refresh all Grooveshark's items, and re-fill them void RefreshItems(); private: void EnsureMenuCreated(); void EnsureItemsCreated(); void RemoveItems(); void EnsureConnected(); void ClearSearchResults(); // Create a playlist item, with data set as excepted. Doesn't fill the item // with songs rows. QStandardItem* CreatePlaylistItem(const QString& playlist_name, int playlist_id); void AuthenticateSession(); void InitCountry(); // Create a request for the given method, with the given params. // If need_authentication is true, add session_id to params. // Returns the reply object created QNetworkReply* CreateRequest( const QString& method_name, const QList >& params, bool use_https = false); // Convenient function which block until 'reply' replies, or timeout after 10 // seconds. Returns false if reply has timeouted bool WaitForReply(QNetworkReply* reply); void ShowUrlBox(const QString& title, const QString& url); // Convenient function for extracting result from reply QVariantMap ExtractResult(QNetworkReply* reply); // Convenient function for extracting songs from grooveshark result. result // should be the "result" field of most Grooveshark replies SongList ExtractSongs(const QVariantMap& result); // Convenient function for extracting song from grooveshark result. // result_song should be the song field ('song', 'nextSong', ...) of the // Grooveshark reply Song ExtractSong(const QVariantMap& result_song); // Convenient functions for extracting Grooveshark songs ids QList ExtractSongsIds(const QVariantMap& result); QList ExtractSongsIds(const QList& urls); int ExtractSongId(const QUrl& url); // Returns 0 if url is not a Grooveshark url // Convenient function for extracting basic playlist info (only 'id' and // 'name': QStandardItem still need to be created), and sort them by name QList ExtractPlaylistInfo(const QVariantMap& result); void ResetSessionId(); GroovesharkUrlHandler* url_handler_; QString pending_search_; int next_pending_search_id_; QSet pending_retrieve_playlists_; QMap playlists_; QMap subscribed_playlists_; QStandardItem* root_; QStandardItem* search_; QStandardItem* popular_month_; QStandardItem* popular_today_; QStandardItem* stations_; QStandardItem* grooveshark_radio_; QStandardItem* favorites_; // Grooveshark Library (corresponds to Grooveshark 'MyMusic' actually, but // called 'Library' in the API). // Nothing to do with Clementine's local library QStandardItem* library_; QStandardItem* playlists_parent_; QStandardItem* subscribed_playlists_parent_; NetworkAccessManager* network_; QMenu* context_menu_; // IDs kept when showing menu, to know what the user has clicked on, to be // able to perform actions on corresponding items int current_song_id_; int current_playlist_id_; QAction* create_playlist_; QAction* delete_playlist_; QAction* rename_playlist_; QAction* remove_from_playlist_; QAction* remove_from_favorites_; QAction* remove_from_library_; QAction* get_url_to_share_song_; QAction* get_url_to_share_playlist_; QList playlistitem_actions_; SearchBoxWidget* search_box_; QTimer* search_delay_; QNetworkReply* last_search_reply_; QString username_; QString password_; // In fact, password's md5 hash QString user_id_; QString session_id_; QMap country_; // The last artists and songs ids th users has listened to. Used for autoplay QList last_artists_ids_; QList last_songs_ids_; QByteArray api_key_; LoginState login_state_; // Tasks' ids: we need to keep them in mind to be able to update task status // on each step int task_popular_id_; int task_playlists_id_; int task_search_id_; static const char* kUrl; static const char* kUrlCover; static const char* kHomepage; static const int kSongSearchLimit; static const int kSongSimpleSearchLimit; static const int kAlbumSearchLimit; static const int kSearchDelayMsec; static const char* kApiKey; static const char* kApiSecret; }; #endif // GROOVESHARKSERVICE_H clementine-1.2.0+dfsg/src/internet/groovesharksettingspage.cpp000066400000000000000000000070321223327513400246530ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "groovesharkservice.h" #include "groovesharksettingspage.h" #include "internetmodel.h" #include "core/logging.h" #include "core/network.h" #include "ui_groovesharksettingspage.h" #include "ui/iconloader.h" #include #include #include #include #include GroovesharkSettingsPage::GroovesharkSettingsPage(SettingsDialog* dialog) : SettingsPage(dialog), ui_(new Ui_GroovesharkSettingsPage), service_(InternetModel::Service()), validated_(false) { ui_->setupUi(this); setWindowIcon(QIcon(":/providers/grooveshark.png")); 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))); ui_->login_state->AddCredentialField(ui_->username); ui_->login_state->AddCredentialField(ui_->password); ui_->login_state->AddCredentialGroup(ui_->account_group); } GroovesharkSettingsPage::~GroovesharkSettingsPage() { delete ui_; } void GroovesharkSettingsPage::Login() { if (service_->IsLoggedIn()) { return; } ui_->login_state->SetLoggedIn(LoginStateWidget::LoginInProgress); service_->Login(ui_->username->text(), ui_->password->text()); } void GroovesharkSettingsPage::Load() { QSettings s; s.beginGroup(GroovesharkService::kSettingsGroup); original_username_ = s.value("username").toString(); ui_->username->setText(original_username_); validated_ = false; UpdateLoginState(); } void GroovesharkSettingsPage::Save() { QSettings s; s.beginGroup(GroovesharkService::kSettingsGroup); s.setValue("username", ui_->username->text()); s.setValue("sessionid", service_->session_id()); } void GroovesharkSettingsPage::LoginFinished(bool success) { validated_ = success; Save(); UpdateLoginState(); } void GroovesharkSettingsPage::UpdateLoginState() { const bool logged_in = service_->IsLoggedIn(); ui_->login_state->SetLoggedIn(logged_in ? LoginStateWidget::LoggedIn : LoginStateWidget::LoggedOut, ui_->username->text()); ui_->login_state->SetAccountTypeVisible(!logged_in); switch (service_->login_state()) { case GroovesharkService::LoginState_NoPremium: ui_->login_state->SetAccountTypeText(tr("You do not have a Grooveshark Anywhere account.")); break; case GroovesharkService::LoginState_AuthFailed: ui_->login_state->SetAccountTypeText(tr("Your username or password was incorrect.")); break; default: ui_->login_state->SetAccountTypeText(tr("A Grooveshark Anywhere account is required.")); break; } } void GroovesharkSettingsPage::Logout() { service_->Logout(); UpdateLoginState(); } clementine-1.2.0+dfsg/src/internet/groovesharksettingspage.h000066400000000000000000000026211223327513400243170ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef GROOVESHARKSETTINGSPAGE_H #define GROOVESHARKSETTINGSPAGE_H #include "ui/settingspage.h" class NetworkAccessManager; class Ui_GroovesharkSettingsPage; class GroovesharkService; class GroovesharkSettingsPage : public SettingsPage { Q_OBJECT public: GroovesharkSettingsPage(SettingsDialog* dialog); ~GroovesharkSettingsPage(); void Load(); void Save(); private slots: void Login(); void LoginFinished(bool success); void Logout(); private: void UpdateLoginState(); private: Ui_GroovesharkSettingsPage* ui_; GroovesharkService* service_; bool validated_; QString original_username_; QString original_password_; }; #endif // GROOVESHARKSETTINGSPAGE_H clementine-1.2.0+dfsg/src/internet/groovesharksettingspage.ui000066400000000000000000000052711223327513400245110ustar00rootroot00000000000000 GroovesharkSettingsPage 0 0 480 141 Grooveshark Account details true 0 Username Password QLineEdit::Password Login Qt::Vertical 20 30 LoginStateWidget QWidget
widgets/loginstatewidget.h
1
clementine-1.2.0+dfsg/src/internet/groovesharkurlhandler.cpp000066400000000000000000000056411223327513400243220ustar00rootroot00000000000000/* 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 "groovesharkurlhandler.h" #include #include "groovesharkservice.h" #include "core/logging.h" GroovesharkUrlHandler::GroovesharkUrlHandler(GroovesharkService* service, QObject* parent) : UrlHandler(parent), service_(service), timer_mark_stream_key_(new QTimer(this)) { // We have to warn Grooveshark when user has listened for more than 30 // seconds of a song, and when it ends. I guess this is used by Grooveshark // for statistics and user history. // To do this, we have TrackAboutToEnd method, and timer_mark_stream_key_ timer. // It is not perfect, as we may call Grooveshark MarkStreamKeyOver30Secs even // if user hasn't actually listen to 30 seconds (e.g. stream set to pause // state) but this is not a big deal and it should be accurate enough anyway. timer_mark_stream_key_->setInterval(30000); timer_mark_stream_key_->setSingleShot(true); connect(timer_mark_stream_key_, SIGNAL(timeout()), SLOT(MarkStreamKeyOver30Secs())); } UrlHandler::LoadResult GroovesharkUrlHandler::StartLoading(const QUrl& url) { qint64 length_nanosec = 0; QUrl streaming_url; QStringList ids = url.toString().remove("grooveshark://").split("/"); if (ids.size() < 3) { qLog(Error) << "Invalid grooveshark URL: " << url.toString(); qLog(Error) << "Should be grooveshark://artist_id/album_id/song_id"; } else { last_artist_id_ = ids[0]; last_album_id_ = ids[1]; last_song_id_ = ids[2]; streaming_url = service_->GetStreamingUrlFromSongId(last_song_id_, last_artist_id_, &last_server_id_, &last_stream_key_, &length_nanosec); qLog(Debug) << "Grooveshark Streaming URL: " << streaming_url; timer_mark_stream_key_->start(); } return LoadResult(url, LoadResult::TrackAvailable, streaming_url, length_nanosec); } void GroovesharkUrlHandler::TrackAboutToEnd() { if (timer_mark_stream_key_->isActive()) { timer_mark_stream_key_->stop(); return; } service_->MarkSongComplete(last_song_id_, last_stream_key_, last_server_id_); } void GroovesharkUrlHandler::TrackSkipped() { timer_mark_stream_key_->stop(); } void GroovesharkUrlHandler::MarkStreamKeyOver30Secs() { service_->MarkStreamKeyOver30Secs(last_stream_key_, last_server_id_); } clementine-1.2.0+dfsg/src/internet/groovesharkurlhandler.h000066400000000000000000000027571223327513400237740ustar00rootroot00000000000000/* 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 GROOVESHARKURLHANDLER_H #define GROOVESHARKURLHANDLER_H #include "core/urlhandler.h" class GroovesharkService; class QTimer; class GroovesharkUrlHandler : public UrlHandler { Q_OBJECT public: GroovesharkUrlHandler(GroovesharkService* service, QObject* parent); QString scheme() const { return "grooveshark"; } QIcon icon() const { return QIcon(":providers/grooveshark.png"); } LoadResult StartLoading(const QUrl& url); void TrackAboutToEnd(); void TrackSkipped(); private slots: void MarkStreamKeyOver30Secs(); private: GroovesharkService* service_; QTimer* timer_mark_stream_key_; QString last_artist_id_; QString last_album_id_; QString last_song_id_; QString last_server_id_; QString last_stream_key_; }; #endif // GROOVESHARKURLHANDLER_H clementine-1.2.0+dfsg/src/internet/icecastbackend.cpp000066400000000000000000000123161223327513400226270ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "core/database.h" #include "core/scopedtransaction.h" #include #include 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); foreach (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 foreach (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.0+dfsg/src/internet/icecastbackend.h000066400000000000000000000033401223327513400222710ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef ICECASTBACKEND_H #define ICECASTBACKEND_H #include "core/song.h" #include #include class Database; class IcecastBackend : public QObject { Q_OBJECT public: IcecastBackend(QObject* parent = 0); 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 // ICECASTBACKEND_H clementine-1.2.0+dfsg/src/internet/icecastfilterwidget.cpp000066400000000000000000000062431223327513400237330ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "icecastmodel.h" #include "icecastfilterwidget.h" #include "ui_icecastfilterwidget.h" #include "ui/iconloader.h" #include #include #include #include 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.0+dfsg/src/internet/icecastfilterwidget.h000066400000000000000000000030311223327513400233700ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef ICECASTFILTERWIDGET_H #define ICECASTFILTERWIDGET_H #include "icecastmodel.h" #include class LineEditInterface; class Ui_IcecastFilterWidget; class QActionGroup; class QMenu; class QSignalMapper; class IcecastFilterWidget : public QWidget { Q_OBJECT public: IcecastFilterWidget(QWidget* parent = 0); ~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 // ICECASTFILTERWIDGET_H clementine-1.2.0+dfsg/src/internet/icecastfilterwidget.ui000066400000000000000000000037241223327513400235670ustar00rootroot00000000000000 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.0+dfsg/src/internet/icecastitem.h000066400000000000000000000023611223327513400216420ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef ICECASTITEM_H #define ICECASTITEM_H #include "icecastbackend.h" #include "core/simpletreeitem.h" class IcecastItem : public SimpleTreeItem { public: enum Type { Type_Root, Type_Genre, Type_Station, Type_Divider, }; IcecastItem(SimpleTreeModel* model) : SimpleTreeItem(Type_Root, model) {} IcecastItem(Type type, IcecastItem* parent = NULL) : SimpleTreeItem(type, parent) {} IcecastBackend::Station station; }; #endif // ICECASTITEM_H clementine-1.2.0+dfsg/src/internet/icecastmodel.cpp000066400000000000000000000141541223327513400223420ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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); foreach (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; foreach (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 NULL; SongMimeData* data = new SongMimeData; QList urls; foreach (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 NULL; } 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.0+dfsg/src/internet/icecastmodel.h000066400000000000000000000044671223327513400220150ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef ICECASTMODEL_H #define ICECASTMODEL_H #include "icecastitem.h" #include "core/simpletreemodel.h" #include "library/librarymodel.h" #include class IcecastBackend; class IcecastModel : public SimpleTreeModel { Q_OBJECT public: IcecastModel(IcecastBackend* backend, QObject* parent = 0); ~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 // ICECASTMODEL_H clementine-1.2.0+dfsg/src/internet/icecastservice.cpp000066400000000000000000000223651223327513400227050ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 #include "icecastbackend.h" #include "icecastfilterwidget.h" #include "icecastmodel.h" #include "icecastservice.h" #include "internetmodel.h" #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 "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_(NULL), backend_(NULL), model_(NULL), filter_(new IcecastFilterWidget(0)), load_directory_task_id_(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() { RequestDirectory(QUrl(kDirectoryUrl)); if (!load_directory_task_id_) { load_directory_task_id_ = app_->task_manager()->StartTask( tr("Downloading Icecast directory")); } } void IcecastService::RequestDirectory(const QUrl& url) { QNetworkRequest req = QNetworkRequest(url); req.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysNetwork); QNetworkReply* reply = network_->get(req); NewClosure(reply, SIGNAL(finished()), this, SLOT(DownloadDirectoryFinished(QNetworkReply*)), reply); } void IcecastService::DownloadDirectoryFinished(QNetworkReply* reply) { if (reply->attribute(QNetworkRequest::RedirectionTargetAttribute).isValid()) { // Discard the old reply and follow the redirect reply->deleteLater(); RequestDirectory(reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl()); 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)), future); connect(watcher, SIGNAL(finished()), watcher, SLOT(deleteLater())); } namespace { template struct GenreSorter { 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; foreach (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; } } void IcecastService::ParseDirectoryFinished( QFuture future) { 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 genre_set = genres.keys().toSet(); // Merge genres with only 1 or 2 stations into "Other". foreach (const QString& genre, genre_set) { if (genres.count(genre) < 3) { const QList& small_genre = genres.values(genre); foreach (IcecastBackend::Station* s, small_genre) { s->genre = "Other"; } } } backend_->ClearAndAddStations(all_stations); app_->task_manager()->SetTaskFinished(load_directory_task_id_); load_directory_task_id_ = 0; } 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.0+dfsg/src/internet/icecastservice.h000066400000000000000000000040711223327513400223440ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef ICECASTSERVICE_H #define ICECASTSERVICE_H #include #include "icecastbackend.h" #include "internetservice.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); void ParseDirectoryFinished( QFuture future); private: void RequestDirectory(const QUrl& url); 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_; int load_directory_task_id_; }; #endif clementine-1.2.0+dfsg/src/internet/internetmimedata.h000066400000000000000000000021271223327513400227020ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNETMIMEDATA_H #define INTERNETMIMEDATA_H #include "core/mimedata.h" #include #include class InternetModel; class InternetMimeData : public MimeData { Q_OBJECT public: InternetMimeData(const InternetModel* _model) : model(_model) {} const InternetModel* model; QModelIndexList indexes; }; #endif // INTERNETMIMEDATA_H clementine-1.2.0+dfsg/src/internet/internetmodel.cpp000066400000000000000000000231501223327513400225530ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "internetmodel.h" #include #include #include "digitallyimportedservicebase.h" #include "groovesharkservice.h" #include "icecastservice.h" #include "internetmimedata.h" #include "internetservice.h" #include "jamendoservice.h" #include "magnatuneservice.h" #include "savedradio.h" #include "somafmservice.h" #include "soundcloudservice.h" #include "spotifyservice.h" #include "subsonicservice.h" #include "core/closure.h" #include "core/logging.h" #include "core/mergedproxymodel.h" #include "podcasts/podcastservice.h" #include "smartplaylists/generatormimedata.h" #ifdef HAVE_LIBLASTFM #include "lastfmservice.h" #endif #ifdef HAVE_GOOGLE_DRIVE #include "googledriveservice.h" #endif #ifdef HAVE_UBUNTU_ONE #include "ubuntuoneservice.h" #endif #ifdef HAVE_DROPBOX #include "dropboxservice.h" #endif #ifdef HAVE_SKYDRIVE #include "skydriveservice.h" #endif #ifdef HAVE_BOX #include "boxservice.h" #endif using smart_playlists::Generator; using smart_playlists::GeneratorMimeData; using smart_playlists::GeneratorPtr; QMap* InternetModel::sServices = NULL; 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)); #ifdef HAVE_LIBLASTFM AddService(new LastFMService(app, this)); #endif #ifdef HAVE_GOOGLE_DRIVE AddService(new GoogleDriveService(app, this)); #endif AddService(new GroovesharkService(app, this)); AddService(new JazzRadioService(app, this)); AddService(new MagnatuneService(app, this)); AddService(new PodcastService(app, this)); AddService(new RadioGFMService(app, this)); AddService(new RockRadioService(app, this)); AddService(new SavedRadio(app, this)); AddService(new SkyFmService(app, this)); AddService(new SomaFMService(app, this)); AddService(new SoundCloudService(app, this)); AddService(new SpotifyService(app, this)); AddService(new SubsonicService(app, this)); #ifdef HAVE_UBUNTU_ONE AddService(new UbuntuOneService(app, this)); #endif #ifdef HAVE_DROPBOX AddService(new DropboxService(app, this)); #endif #ifdef HAVE_SKYDRIVE AddService(new SkydriveService(app, this)); #endif #ifdef HAVE_BOX AddService(new BoxService(app, this)); #endif } 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); 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())); 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 ; irowCount() ; ++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()); // 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 NULL; } 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 NULL; } 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 NULL; } 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 NULL; 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; foreach (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 NULL; 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()) { 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(); foreach (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() { foreach (InternetService* service, sServices->values()) { service->ReloadSettings(); } } clementine-1.2.0+dfsg/src/internet/internetmodel.h000066400000000000000000000143661223327513400222310ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNETMODEL_H #define 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: InternetModel(Application* app, QObject* parent = 0); 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, }; // Needs to be static for InternetPlaylistItem::restore static InternetService* ServiceByName(const QString& name); 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); // 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_; } 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: 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 // INTERNETMODEL_H clementine-1.2.0+dfsg/src/internet/internetplaylistitem.cpp000066400000000000000000000062011223327513400241710ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "internetplaylistitem.h" #include "internetservice.h" #include "internetmodel.h" #include "core/settingsprovider.h" #include "library/sqlrow.h" #include "playlist/playlistbackend.h" #include #include #include 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.0+dfsg/src/internet/internetplaylistitem.h000066400000000000000000000027701223327513400236450ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNETPLAYLISTITEM_H #define INTERNETPLAYLISTITEM_H #include "core/song.h" #include "playlist/playlistitem.h" #include class InternetService; class InternetPlaylistItem : public PlaylistItem { public: 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 // INTERNETPLAYLISTITEM_H clementine-1.2.0+dfsg/src/internet/internetservice.cpp000066400000000000000000000100541223327513400231120ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "internetservice.h" #include "internetmodel.h" #include "core/logging.h" #include "core/mergedproxymodel.h" #include "core/mimedata.h" #include "ui/iconloader.h" #include #include InternetService::InternetService(const QString& name, Application* app, InternetModel* model, QObject* parent) : QObject(parent), app_(app), model_(model), name_(name), append_to_playlist_(NULL), replace_playlist_(NULL), open_in_new_playlist_(NULL), separator_(NULL) { } 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.0+dfsg/src/internet/internetservice.h000066400000000000000000000103421223327513400225570ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNETSERVICE_H #define 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 = NULL); virtual ~InternetService() {} QString name() const { return name_; } InternetModel* model() const { return model_; } virtual QStandardItem* CreateRootItem() = 0; virtual void LazyPopulate(QStandardItem* parent) = 0; 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 NULL; } 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 // INTERNETSERVICE_H clementine-1.2.0+dfsg/src/internet/internetsongmimedata.h000066400000000000000000000021121223327513400235630ustar00rootroot00000000000000/* 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 INTERNETSONGMIMEDATA_H #define INTERNETSONGMIMEDATA_H #include "core/mimedata.h" #include "core/song.h" class InternetService; class InternetSongMimeData : public MimeData { Q_OBJECT public: InternetSongMimeData(InternetService* _service) : service(_service) {} InternetService* service; SongList songs; }; #endif // INTERNETSONGMIMEDATA_H clementine-1.2.0+dfsg/src/internet/internetview.cpp000066400000000000000000000037721223327513400224350ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "internetmodel.h" #include "core/mergedproxymodel.h" #include "library/libraryview.h" #include 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 ¤t, 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.0+dfsg/src/internet/internetview.h000066400000000000000000000023141223327513400220710ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNETVIEW_H #define INTERNETVIEW_H #include "widgets/autoexpandingtreeview.h" class InternetView : public AutoExpandingTreeView { Q_OBJECT public: InternetView(QWidget* parent = 0); // QWidget void contextMenuEvent(QContextMenuEvent* e); // QTreeView void currentChanged(const QModelIndex ¤t, const QModelIndex &previous); void setModel(QAbstractItemModel *model); signals: void CurrentIndexChanged(const QModelIndex& index); }; #endif // INTERNETVIEW_H clementine-1.2.0+dfsg/src/internet/internetviewcontainer.cpp000066400000000000000000000111271223327513400243310ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "internetmodel.h" #include "internetservice.h" #include "ui_internetviewcontainer.h" #include "core/application.h" #include "core/mergedproxymodel.h" #include "globalsearch/globalsearch.h" #include #include #include const int InternetViewContainer::kAnimationDuration = 500; InternetViewContainer::InternetViewContainer(QWidget *parent) : QWidget(parent), ui_(new Ui_InternetViewContainer), app_(NULL), current_service_(NULL), current_header_(NULL) { 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_ = NULL; current_header_ = NULL; } } 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 = NULL; foreach (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.0+dfsg/src/internet/internetviewcontainer.h000066400000000000000000000036301223327513400237760ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef INTERNETVIEWCONTAINER_H #define 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: InternetViewContainer(QWidget* parent = 0); ~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 // INTERNETVIEWCONTAINER_H clementine-1.2.0+dfsg/src/internet/internetviewcontainer.ui000066400000000000000000000035731223327513400241720ustar00rootroot00000000000000 InternetViewContainer 0 0 424 395 Form 0 0 0 0 false true QAbstractItemView::DragDrop true 16 16 true true true InternetView QTreeView
internet/internetview.h
clementine-1.2.0+dfsg/src/internet/jamendodynamicplaylist.cpp000066400000000000000000000114441223327513400244510ustar00rootroot00000000000000/* 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 "jamendodynamicplaylist.h" #include "jamendoplaylistitem.h" #include "jamendoservice.h" #include #include #include #include #include "core/logging.h" #include "core/network.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(); foreach (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.0+dfsg/src/internet/jamendodynamicplaylist.h000066400000000000000000000043761223327513400241240ustar00rootroot00000000000000/* 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 JAMENDODYNAMICPLAYLIST_H #define 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 clementine-1.2.0+dfsg/src/internet/jamendoplaylistitem.cpp000066400000000000000000000023411223327513400237570ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/internet/jamendoplaylistitem.h000066400000000000000000000020761223327513400234310ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef JAMENDOPLAYLISTITEM_H #define JAMENDOPLAYLISTITEM_H #include "library/libraryplaylistitem.h" class JamendoPlaylistItem : public LibraryPlaylistItem { public: JamendoPlaylistItem(const QString& type); JamendoPlaylistItem(const Song& song); bool InitFromQuery(const SqlRow& query); QUrl Url() const; }; #endif // JAMENDOPLAYLISTITEM_H clementine-1.2.0+dfsg/src/internet/jamendoservice.cpp000066400000000000000000000425331223327513400227060ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "jamendodynamicplaylist.h" #include "jamendoplaylistitem.h" #include "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" #include #include #include #include #include #include #include #include #include "qtiocompressor.h" const char* JamendoService::kServiceName = "Jamendo"; const char* JamendoService::kDirectoryUrl = "http://img.jamendo.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 = 300000; JamendoService::JamendoService(Application* app, InternetModel* parent) : InternetService(kServiceName, app, parent, parent), network_(new NetworkAccessManager(this)), context_menu_(NULL), library_backend_(NULL), library_filter_(NULL), library_model_(NULL), library_sort_model_(new QSortFilterProxyModel(this)), search_provider_(NULL), 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 = float(received) / total; app_->task_manager()->SetTaskProgress(load_database_task_id_, int(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: 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); foreach (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.0+dfsg/src/internet/jamendoservice.h000066400000000000000000000065101223327513400223460ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef JAMENDOSERVICE_H #define JAMENDOSERVICE_H #include "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 clementine-1.2.0+dfsg/src/internet/lastfmcompat.cpp000066400000000000000000000054201223327513400223740ustar00rootroot00000000000000/* 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 "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 } } clementine-1.2.0+dfsg/src/internet/lastfmcompat.h000066400000000000000000000034541223327513400220460ustar00rootroot00000000000000/* 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 LASTFMCOMPAT_H #define 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 = NULL); 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 } } #endif // LASTFMCOMPAT_H clementine-1.2.0+dfsg/src/internet/lastfmservice.cpp000066400000000000000000000750431223327513400225610ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 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 #include #ifdef HAVE_LIBLASTFM1 #include #else #include #endif #include "lastfmcompat.h" #include "lastfmstationdialog.h" #include "lastfmurlhandler.h" #include "internetmodel.h" #include "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 "globalsearch/globalsearch.h" #include "globalsearch/lastfmsearchprovider.h" #include "ui/iconloader.h" #include "ui/settingsdialog.h" using boost::scoped_ptr; 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"; const char* LastFMService::kUrlArtist = "lastfm://artist/%1/similarartists"; const char* LastFMService::kUrlTag = "lastfm://globaltags/%1"; const char* LastFMService::kUrlCustom = "lastfm://rql/%1"; const char* LastFMService::kTitleArtist = QT_TR_NOOP("Last.fm Similar Artists to %1"); const char* LastFMService::kTitleTag = QT_TR_NOOP("Last.fm Tag Radio: %1"); const char* LastFMService::kTitleCustom = QT_TR_NOOP("Last.fm Custom Radio: %1"); const int LastFMService::kFriendsCacheDurationSecs = 60 * 60 * 24; // 1 day LastFMService::LastFMService(Application* app, InternetModel* parent) : InternetService(kServiceName, app, parent, parent), url_handler_(new LastFMUrlHandler(this, this)), scrobbler_(NULL), already_scrobbled_(false), station_dialog_(new LastFMStationDialog), context_menu_(new QMenu), initial_tune_(false), tune_task_id_(0), scrobbling_enabled_(false), root_item_(NULL), artist_list_(NULL), tag_list_(NULL), custom_list_(NULL), friends_list_(NULL), neighbours_list_(NULL), friend_names_(kSettingsGroup, "friend_names", kFriendsCacheDurationSecs), connection_problems_(false) { ReloadSettings(); //we emit the signal the first time to be sure the buttons are in the right state emit ScrobblingEnabledChanged(scrobbling_enabled_); context_menu_->addActions(GetPlaylistActions()); remove_action_ = context_menu_->addAction( IconLoader::Load("list-remove"), tr("Remove"), this, SLOT(Remove())); context_menu_->addSeparator(); add_artist_action_ = context_menu_->addAction( QIcon(":last.fm/icon_radio.png"), tr("Play artist radio..."), this, SLOT(AddArtistRadio())); add_tag_action_ = context_menu_->addAction( QIcon(":last.fm/icon_tag.png"), tr("Play tag radio..."), this, SLOT(AddTagRadio())); add_custom_action_ = context_menu_->addAction( QIcon(":last.fm/icon_radio.png"), tr("Play custom radio..."), this, SLOT(AddCustomRadio())); refresh_friends_action_ = context_menu_->addAction( IconLoader::Load("view-refresh"), tr("Refresh friends list"), this, SLOT(ForceRefreshFriends())); context_menu_->addAction( IconLoader::Load("configure"), tr("Configure Last.fm..."), this, SLOT(ShowConfig())); remove_action_->setEnabled(false); add_artist_action_->setEnabled(false); add_tag_action_->setEnabled(false); add_custom_action_->setEnabled(false); app_->player()->RegisterUrlHandler(url_handler_); app_->cover_providers()->AddProvider(new LastFmCoverProvider(this)); app_->global_search()->AddProvider(new LastFMSearchProvider(this, app_, 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(); friend_names_.Load(); //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(); } QStandardItem* LastFMService::CreateRootItem() { root_item_ = new QStandardItem(QIcon(":last.fm/as.png"), kServiceName); root_item_->setData(true, InternetModel::Role_CanLazyLoad); return root_item_; } void LastFMService::LazyPopulate(QStandardItem* parent) { switch (parent->data(InternetModel::Role_Type).toInt()) { case InternetModel::Type_Service: // Normal radio types CreateStationItem(parent, tr("My Recommendations"), ":last.fm/recommended_radio.png", QUrl("lastfm://user/USERNAME/recommended"), tr("My Last.fm Recommended Radio")); CreateStationItem(parent, tr("My Radio Station"), ":last.fm/personal_radio.png", QUrl("lastfm://user/USERNAME/library"), tr("My Last.fm Library")); CreateStationItem(parent, tr("My Mix Radio"), ":last.fm/loved_radio.png", QUrl("lastfm://user/USERNAME/mix"), tr("My Last.fm Mix Radio")); CreateStationItem(parent, tr("My Neighborhood"), ":last.fm/neighbour_radio.png", QUrl("lastfm://user/USERNAME/neighbours"), tr("My Last.fm Neighborhood")); // Types that have children artist_list_ = new QStandardItem(QIcon(":last.fm/icon_radio.png"), tr("Artist radio")); artist_list_->setData(Type_Artists, InternetModel::Role_Type); parent->appendRow(artist_list_); tag_list_ = new QStandardItem(QIcon(":last.fm/icon_tag.png"), tr("Tag radio")); tag_list_->setData(Type_Tags, InternetModel::Role_Type); parent->appendRow(tag_list_); custom_list_ = new QStandardItem(QIcon(":last.fm/icon_radio.png"), tr("Custom radio")); custom_list_->setData(Type_Custom, InternetModel::Role_Type); parent->appendRow(custom_list_); RestoreList("artists", kUrlArtist, tr(kTitleArtist), QIcon(":last.fm/icon_radio.png"), artist_list_); RestoreList("tags", kUrlTag, tr(kTitleTag), QIcon(":last.fm/icon_tag.png"), tag_list_); RestoreList("custom", kUrlCustom, tr(kTitleCustom), QIcon(":last.fm/icon_radio.png"), custom_list_); friends_list_ = new QStandardItem(QIcon(":last.fm/my_friends.png"), tr("Friends")); friends_list_->setData(Type_Friends, InternetModel::Role_Type); friends_list_->setData(true, InternetModel::Role_CanLazyLoad); parent->appendRow(friends_list_); neighbours_list_ = new QStandardItem(QIcon(":last.fm/my_neighbours.png"), tr("Neighbors")); neighbours_list_->setData(Type_Neighbours, InternetModel::Role_Type); neighbours_list_->setData(true, InternetModel::Role_CanLazyLoad); parent->appendRow(neighbours_list_); if (!IsAuthenticated()) ShowConfig(); add_artist_action_->setEnabled(true); add_tag_action_->setEnabled(true); add_custom_action_->setEnabled(true); break; case Type_Friends: RefreshFriends(false); break; case Type_Neighbours: RefreshNeighbours(); break; case Type_OtherUser: CreateStationItem(parent, tr("Last.fm Radio Station - %1").arg(parent->text()), ":last.fm/personal_radio.png", QUrl("lastfm://user/" + parent->text() + "/library"), tr("Last.fm Library - %1").arg(parent->text())); CreateStationItem(parent, tr("Last.fm Mix Radio - %1").arg(parent->text()), ":last.fm/loved_radio.png", QUrl("lastfm://user/" + parent->text() + "/mix"), tr("Last.fm Mix Radio - %1").arg(parent->text())); CreateStationItem(parent, tr("Last.fm Neighbor Radio - %1").arg(parent->text()), ":last.fm/neighbour_radio.png", QUrl("lastfm://user/" + parent->text() + "/neighbours"), tr("Last.fm Neighbor Radio - %1").arg(parent->text())); break; default: break; } } QStandardItem* LastFMService::CreateStationItem( QStandardItem* parent, const QString& name, const QString& icon, const QUrl& url, const QString& title) { Song song; song.set_url(url); song.set_title(title); QStandardItem* ret = new QStandardItem(QIcon(icon), name); ret->setData(QVariant::fromValue(song), InternetModel::Role_SongMetadata); ret->setData(InternetModel::PlayBehaviour_SingleItem, InternetModel::Role_PlayBehaviour); parent->appendRow(ret); return ret; } 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(); friend_names_.Update(QStringList()); 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_ = NULL; 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; } QUrl LastFMService::DeququeNextMediaUrl() { if (playlist_.empty()) { return QUrl(); } lastfm::MutableTrack track = playlist_.dequeue(); track.stamp(); already_scrobbled_ = false; last_track_ = track; if (playlist_.empty()) { FetchMoreTracks(); } next_metadata_ = track; StreamMetadataReady(); return last_track_.url(); } void LastFMService::StreamMetadataReady() { Song metadata; metadata.InitFromLastFM(next_metadata_); if (art_urls_.contains(next_metadata_)) metadata.set_art_automatic(art_urls_[next_metadata_]); emit StreamMetadataFound(last_url_, metadata); } void LastFMService::TunerError(lastfm::ws::Error error) { qLog(Warning) << "Last.fm error" << error; if (!initial_tune_) return; app_->task_manager()->SetTaskFinished(tune_task_id_); tune_task_id_ = 0; if (error == lastfm::ws::NotEnoughContent) { url_handler_->TunerError(); return; } emit StreamError(ErrorString(error)); } 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"); } } void LastFMService::TunerTrackAvailable() { if (initial_tune_) { url_handler_->TunerTrackAvailable(); initial_tune_ = false; } } 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: 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() { lastfm::MutableTrack mtrack(last_track_); mtrack.ban(); last_track_ = mtrack; Scrobble(); app_->player()->Next(); } void LastFMService::ShowContextMenu(const QPoint& global_pos) { switch (model()->current_index().parent().data(InternetModel::Role_Type).toInt()) { case Type_Artists: case Type_Tags: case Type_Custom: remove_action_->setEnabled(true); break; default: remove_action_->setEnabled(false); break; } const bool playable = model()->IsPlayable(model()->current_index()); GetAppendToPlaylistAction()->setEnabled(playable); GetReplacePlaylistAction()->setEnabled(playable); GetOpenInNewPlaylistAction()->setEnabled(playable); context_menu_->popup(global_pos); } QStringList LastFMService::FriendNames() { // Update the list for next time, in the main thread. if (IsFriendsListStale()) metaObject()->invokeMethod(this, "RefreshFriends", Qt::QueuedConnection); return friend_names_.Data(); } static QStringList SavedArtistOrTagRadioNames(const QString& name) { QStringList ret; QSettings s; s.beginGroup(LastFMService::kSettingsGroup); int count = s.beginReadArray(name); for (int i=0 ; isetData(false, InternetModel::Role_CanLazyLoad); LazyPopulate(root_item_); } if (!force && !IsFriendsListStale()) { PopulateFriendsList(); return; } lastfm::compat::AuthenticatedUser user; QNetworkReply* reply = user.getFriends(); NewClosure(reply, SIGNAL(finished()), this, SLOT(RefreshFriendsFinished(QNetworkReply*)), reply); } void LastFMService::RefreshNeighbours() { if (!neighbours_list_ || !IsAuthenticated()) return; lastfm::compat::AuthenticatedUser user; QNetworkReply* reply = user.getNeighbours(); NewClosure(reply, SIGNAL(finished()), this, SLOT(RefreshNeighboursFinished(QNetworkReply*)), reply); } void LastFMService::RefreshFriendsFinished(QNetworkReply* reply) { QList friends; if (!lastfm::compat::ParseUserList(reply, &friends)) { return; } QStringList names; foreach (const lastfm::User& f, friends) { names << f.name(); } friend_names_.Update(names); PopulateFriendsList(); emit SavedItemsChanged(); } void LastFMService::PopulateFriendsList() { if (friends_list_->hasChildren()) friends_list_->removeRows(0, friends_list_->rowCount()); foreach (const QString& name, friend_names_) { Song song; song.set_url(QUrl("lastfm://user/" + name + "/library")); song.set_title(tr("Last.fm Library - %1").arg(name)); QStandardItem* item = new QStandardItem(QIcon(":last.fm/icon_user.png"), name); item->setData(QVariant::fromValue(song), InternetModel::Role_SongMetadata); item->setData(true, InternetModel::Role_CanLazyLoad); item->setData(Type_OtherUser, InternetModel::Role_Type); item->setData(InternetModel::PlayBehaviour_SingleItem, InternetModel::Role_PlayBehaviour); friends_list_->appendRow(item); } } void LastFMService::RefreshNeighboursFinished(QNetworkReply* reply) { QList neighbours; if (!lastfm::compat::ParseUserList(reply, &neighbours)) { return; } if (neighbours_list_->hasChildren()) neighbours_list_->removeRows(0, neighbours_list_->rowCount()); foreach (const lastfm::User& n, neighbours) { Song song; song.set_url(QUrl("lastfm://user/" + n.name() + "/library")); song.set_title(tr("Last.fm Library - %1").arg(n.name())); QStandardItem* item = new QStandardItem(QIcon(":last.fm/user_purple.png"), n.name()); item->setData(QVariant::fromValue(song), InternetModel::Role_SongMetadata); item->setData(true, InternetModel::Role_CanLazyLoad); item->setData(Type_OtherUser, InternetModel::Role_Type); item->setData(InternetModel::PlayBehaviour_SingleItem, InternetModel::Role_PlayBehaviour); neighbours_list_->appendRow(item); } } void LastFMService::AddArtistRadio() { AddArtistOrTag("artists", LastFMStationDialog::Artist, kUrlArtist, tr(kTitleArtist), ":last.fm/icon_radio.png", artist_list_); } void LastFMService::AddTagRadio() { AddArtistOrTag("tags", LastFMStationDialog::Tag, kUrlTag, tr(kTitleTag), ":last.fm/icon_tag.png", tag_list_); } void LastFMService::AddCustomRadio() { AddArtistOrTag("custom", LastFMStationDialog::Custom, kUrlCustom, tr(kTitleCustom), ":last.fm/icon_radio.png", custom_list_); } void LastFMService::AddArtistOrTag(const QString& name, LastFMStationDialog::Type dialog_type, const QString& url_pattern, const QString& title_pattern, const QString& icon, QStandardItem* list) { station_dialog_->SetType(dialog_type); if (station_dialog_->exec() == QDialog::Rejected) return; if (station_dialog_->content().isEmpty()) return; QString content = station_dialog_->content(); QString url; if (name == "custom" && content.startsWith("lastfm://")) { url = content; } else if (name == "custom") { url = url_pattern.arg(QString(content.toUtf8().toBase64())); } else { url = url_pattern.arg(content); } Song song; song.set_url(QUrl((url))); song.set_title(title_pattern.arg(content)); QStandardItem* item = new QStandardItem(QIcon(icon), content); item->setData(QVariant::fromValue(song), InternetModel::Role_SongMetadata); item->setData(InternetModel::PlayBehaviour_SingleItem, InternetModel::Role_PlayBehaviour); list->appendRow(item); emit AddItemToPlaylist(item->index(), AddMode_Append); SaveList(name, list); emit SavedItemsChanged(); } void LastFMService::SaveList(const QString& name, QStandardItem* list) const { QSettings settings; settings.beginGroup(kSettingsGroup); settings.beginWriteArray(name, list->rowCount()); for (int i=0 ; irowCount() ; ++i) { settings.setArrayIndex(i); settings.setValue("key", list->child(i)->text()); } settings.endArray(); } void LastFMService::RestoreList(const QString& name, const QString& url_pattern, const QString& title_pattern, const QIcon& icon, QStandardItem* parent) { if (parent->hasChildren()) parent->removeRows(0, parent->rowCount()); const QStringList keys = SavedArtistOrTagRadioNames(name); foreach (const QString& key, keys) { QString url; if (name == "custom" && key.startsWith("lastfm://")) { url = key; } else if (name == "custom") { url = url_pattern.arg(QString(key.toUtf8().toBase64())); } else { url = url_pattern.arg(key); } Song song; song.set_url(QUrl(url)); song.set_title(title_pattern.arg(key)); QStandardItem* item = new QStandardItem(icon, key); item->setData(QVariant::fromValue(song), InternetModel::Role_SongMetadata); item->setData(InternetModel::PlayBehaviour_SingleItem, InternetModel::Role_PlayBehaviour); parent->appendRow(item); } } void LastFMService::Remove() { QStandardItem* context_item = model()->itemFromIndex(model()->current_index()); int type = context_item->parent()->data(InternetModel::Role_Type).toInt(); context_item->parent()->removeRow(context_item->row()); if (type == Type_Artists) SaveList("artists", artist_list_); else if (type == Type_Tags) SaveList("tags", tag_list_); else if (type == Type_Custom) SaveList("custom", custom_list_); } void LastFMService::FetchMoreTracks() { QMap params; params["method"] = "radio.getPlaylist"; params["rtp"] = "1"; QNetworkReply* reply = lastfm::ws::post(params); NewClosure(reply, SIGNAL(finished()), this, SLOT(FetchMoreTracksFinished(QNetworkReply*)), reply); } void LastFMService::FetchMoreTracksFinished(QNetworkReply* reply) { reply->deleteLater(); app_->task_manager()->SetTaskFinished(tune_task_id_); tune_task_id_ = 0; lastfm::XmlQuery query(lastfm::compat::EmptyXmlQuery()); if (lastfm::compat::ParseQuery(reply->readAll(), &query)) { const XmlQuery& playlist = query["playlist"]; foreach (const XmlQuery& q, playlist["trackList"].children("track")) { lastfm::MutableTrack t; t.setUrl(QUrl(q["location"].text())); t.setExtra("trackauth", q["extension"]["trackauth"].text()); t.setTitle(q["title"].text()); t.setArtist(q["creator"].text()); t.setAlbum(q["album"].text()); t.setDuration(q["duration"].text().toInt() / 1000); t.setSource(lastfm::Track::LastFmRadio); art_urls_[t] = q["image"].text(); playlist_ << t; } } else { emit StreamError(tr("Couldn't load the last.fm radio station")); return; } TunerTrackAvailable(); } void LastFMService::Tune(const QUrl& url) { if (!tune_task_id_) tune_task_id_ = app_->task_manager()->StartTask(tr("Loading Last.fm radio")); last_url_ = url; initial_tune_ = true; const lastfm::RadioStation station(FixupUrl(url).toString()); playlist_.clear(); // Remove all the old album art URLs art_urls_.clear(); QMap params; params["method"] = "radio.tune"; params["station"] = station.url(); QNetworkReply* reply = lastfm::ws::post(params); NewClosure(reply, SIGNAL(finished()), this, SLOT(TuneFinished(QNetworkReply*)), reply); } void LastFMService::TuneFinished(QNetworkReply* reply) { reply->deleteLater(); FetchMoreTracks(); } PlaylistItem::Options LastFMService::playlistitem_options() const { return PlaylistItem::LastFMControls | PlaylistItem::PauseDisabled | PlaylistItem::SeekDisabled; } PlaylistItemPtr LastFMService::PlaylistItemForUrl(const QUrl& url) { // This is a bit of a hack, it's only used by the artist/song info tag // widgets for tag radio and similar artists radio. if (url.scheme() != "lastfm") return PlaylistItemPtr(); QStringList sections(url.path().split("/", QString::SkipEmptyParts)); Song song; song.set_url(url); if (sections.count() == 2 && url.host() == "artist" && sections[1] == "similarartists") { song.set_title(tr(kTitleArtist).arg(sections[0])); } else if (sections.count() == 1 && url.host() == "globaltags") { song.set_title(tr(kTitleTag).arg(sections[0])); } else { return PlaylistItemPtr(); } return PlaylistItemPtr(new InternetPlaylistItem(this, song)); } 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.0+dfsg/src/internet/lastfmservice.h000066400000000000000000000146151223327513400222240ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef LASTFMSERVICE_H #define LASTFMSERVICE_H namespace lastfm { class RadioStation; class Track; } #include uint qHash(const lastfm::Track& track); #include "lastfmcompat.h" #include "internetmodel.h" #include "internetservice.h" #include "lastfmstationdialog.h" #include "core/cachedlist.h" #include "core/song.h" #include "playlist/playlistitem.h" #include #include #include #include #include class LastFMUrlHandler; class QAction; class QNetworkAccessManager; class LastFMService : public InternetService { Q_OBJECT friend class LastFMUrlHandler; public: LastFMService(Application* app, InternetModel* parent); ~LastFMService(); static const char* kServiceName; static const char* kSettingsGroup; static const char* kAudioscrobblerClientId; static const char* kApiKey; static const char* kSecret; static const char* kUrlArtist; static const char* kUrlTag; static const char* kUrlCustom; static const char* kTitleArtist; static const char* kTitleTag; static const char* kTitleCustom; static const int kFriendsCacheDurationSecs; enum ItemType { Type_Root = InternetModel::TypeCount, Type_Artists, Type_Tags, Type_Custom, Type_Friends, Type_Neighbours, Type_OtherUser, }; // InternetService QStandardItem* CreateRootItem(); void LazyPopulate(QStandardItem* parent); void ShowContextMenu(const QPoint &global_pos); PlaylistItem::Options playlistitem_options() const; 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(); void FetchMoreTracks(); QUrl DeququeNextMediaUrl(); PlaylistItemPtr PlaylistItemForUrl(const QUrl& url); bool IsFriendsListStale() const { return friend_names_.IsStale(); } // Thread safe QStringList FriendNames(); QStringList SavedArtistRadioNames() const; QStringList SavedTagRadioNames() const; 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 RefreshFriendsFinished(QNetworkReply* reply); void RefreshNeighboursFinished(QNetworkReply* reply); void TunerTrackAvailable(); void TunerError(lastfm::ws::Error error); void ScrobblerStatus(int value); void AddArtistRadio(); void AddTagRadio(); void AddCustomRadio(); void ForceRefreshFriends(); void RefreshFriends(); void Remove(); // Radio tuner. void FetchMoreTracksFinished(QNetworkReply* reply); void TuneFinished(QNetworkReply* reply); void StreamMetadataReady(); private: QStandardItem* CreateStationItem(QStandardItem* parent, const QString& name, const QString& icon, const QUrl& url, const QString& title); QString ErrorString(lastfm::ws::Error error) const; bool InitScrobbler(); lastfm::Track TrackFromSong(const Song& song) const; void RefreshFriends(bool force); void RefreshNeighbours(); void AddArtistOrTag(const QString& name, LastFMStationDialog::Type dialog_type, const QString& url_pattern, const QString& title_pattern, const QString& icon, QStandardItem* list); void SaveList(const QString& name, QStandardItem* list) const; void RestoreList(const QString& name, const QString& url_pattern, const QString& title_pattern, const QIcon& icon, QStandardItem* parent); static QUrl FixupUrl(const QUrl& url); void Tune(const QUrl& station); void PopulateFriendsList(); void AddSelectedToPlaylist(bool clear_first); private: LastFMUrlHandler* url_handler_; lastfm::Audioscrobbler* scrobbler_; lastfm::Track last_track_; lastfm::Track next_metadata_; QQueue playlist_; bool already_scrobbled_; boost::scoped_ptr station_dialog_; boost::scoped_ptr context_menu_; QAction* remove_action_; QAction* add_artist_action_; QAction* add_tag_action_; QAction* add_custom_action_; QAction* refresh_friends_action_; QUrl last_url_; bool initial_tune_; int tune_task_id_; bool scrobbling_enabled_; bool buttons_visible_; bool scrobble_button_visible_; bool prefer_albumartist_; QStandardItem* root_item_; QStandardItem* artist_list_; QStandardItem* tag_list_; QStandardItem* custom_list_; QStandardItem* friends_list_; QStandardItem* neighbours_list_; QHash art_urls_; CachedList friend_names_; // Useful to inform the user that we can't scrobble right now bool connection_problems_; }; #endif // LASTFMSERVICE_H clementine-1.2.0+dfsg/src/internet/lastfmsettingspage.cpp000066400000000000000000000117471223327513400236170ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "lastfmservice.h" #include "internetmodel.h" #include "ui_lastfmsettingspage.h" #include "ui/iconloader.h" #include #include #include #include LastFMSettingsPage::LastFMSettingsPage(SettingsDialog* dialog) : SettingsPage(dialog), service_(static_cast(InternetModel::ServiceByName("Last.fm"))), 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(service_, SIGNAL(UpdatedSubscriberStatus(bool)), SLOT(UpdatedSubscriberStatus(bool))); 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); service_->UpdateSubscriberStatus(); } 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()); if (service_->IsAuthenticated()) { service_->UpdateSubscriberStatus(); } RefreshControls(service_->IsAuthenticated()); } void LastFMSettingsPage::UpdatedSubscriberStatus(bool is_subscriber) { ui_->login_state->SetAccountTypeVisible(!is_subscriber); if (!is_subscriber) { if (service_->HasConnectionProblems()) { ui_->login_state->SetAccountTypeText( tr("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.")); } else { ui_->login_state->SetAccountTypeText( tr("You will not be able to play Last.fm radio stations " "as you are not a Last.fm subscriber.")); } } } 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); ui_->login_state->SetAccountTypeVisible(!authenticated); if (!authenticated) { ui_->login_state->SetAccountTypeText( tr("You can scrobble tracks for free, but only " "paid subscribers " "can stream Last.fm radio from Clementine.")); } } clementine-1.2.0+dfsg/src/internet/lastfmsettingspage.h000066400000000000000000000026121223327513400232530ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef LASTFMSETTINGSPAGE_H #define LASTFMSETTINGSPAGE_H #include "ui/settingspage.h" class LastFMService; class Ui_LastFMSettingsPage; class LastFMSettingsPage : public SettingsPage { Q_OBJECT public: LastFMSettingsPage(SettingsDialog* dialog); ~LastFMSettingsPage(); void Load(); void Save(); private slots: void Login(); void AuthenticationComplete(bool success, const QString& error_message); void Logout(); void UpdatedSubscriberStatus(bool is_subscriber); private: LastFMService* service_; Ui_LastFMSettingsPage* ui_; QMovie* loading_icon_; bool waiting_for_auth_; void RefreshControls(bool authenticated); }; #endif // LASTFMSETTINGSPAGE_H clementine-1.2.0+dfsg/src/internet/lastfmsettingspage.ui000066400000000000000000000075041223327513400234460ustar00rootroot00000000000000 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" and "ban" buttons 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.0+dfsg/src/internet/lastfmstationdialog.cpp000066400000000000000000000023651223327513400237570ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "lastfmstationdialog.h" #include "ui_lastfmstationdialog.h" LastFMStationDialog::LastFMStationDialog(QWidget* parent) : QDialog(parent), ui_(new Ui_LastFMStationDialog) { ui_->setupUi(this); resize(sizeHint()); } LastFMStationDialog::~LastFMStationDialog() { delete ui_; } void LastFMStationDialog::SetType(Type type) { ui_->type->setCurrentIndex(type); ui_->content->clear(); ui_->content->setFocus(Qt::OtherFocusReason); } QString LastFMStationDialog::content() const { return ui_->content->text(); } clementine-1.2.0+dfsg/src/internet/lastfmstationdialog.h000066400000000000000000000022161223327513400234170ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef LASTFMSTATIONDIALOG_H #define LASTFMSTATIONDIALOG_H #include class Ui_LastFMStationDialog; class LastFMStationDialog : public QDialog { Q_OBJECT public: LastFMStationDialog(QWidget* parent = 0); ~LastFMStationDialog(); enum Type { Artist, Tag, Custom, }; void SetType(Type type); QString content() const; private: Ui_LastFMStationDialog* ui_; }; #endif // LASTFMSTATIONDIALOG_H clementine-1.2.0+dfsg/src/internet/lastfmstationdialog.ui000066400000000000000000000054751223327513400236170ustar00rootroot00000000000000 LastFMStationDialog 0 0 407 126 Play Artist or Tag :/last.fm/as.png:/last.fm/as.png Enter an <b>artist</b> or <b>tag</b> to start listening to Last.fm radio. true Artist Tag Custom Qt::Vertical 20 7 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() LastFMStationDialog accept() 248 254 157 274 buttonBox rejected() LastFMStationDialog reject() 316 260 286 274 clementine-1.2.0+dfsg/src/internet/lastfmurlhandler.cpp000066400000000000000000000031311223327513400232460ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "lastfmservice.h" #include "lastfmurlhandler.h" LastFMUrlHandler::LastFMUrlHandler(LastFMService* service, QObject* parent) : UrlHandler(parent), service_(service) { } UrlHandler::LoadResult LastFMUrlHandler::StartLoading(const QUrl& url) { if (!service_->IsAuthenticated()) return LoadResult(); service_->Tune(url); return LoadResult(url, LoadResult::WillLoadAsynchronously); } void LastFMUrlHandler::TunerTrackAvailable() { emit AsyncLoadComplete(LoadNext(service_->last_url_)); } void LastFMUrlHandler::TunerError() { emit AsyncLoadComplete(LoadResult(service_->last_url_, LoadResult::NoMoreTracks)); } UrlHandler::LoadResult LastFMUrlHandler::LoadNext(const QUrl& url) { const QUrl media_url = service_->DeququeNextMediaUrl(); if (media_url.isEmpty()) { return LoadResult(); } return LoadResult(url, LoadResult::TrackAvailable, media_url); } clementine-1.2.0+dfsg/src/internet/lastfmurlhandler.h000066400000000000000000000024201223327513400227130ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef LASTFMURLHANDLER_H #define 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 // LASTFMURLHANDLER_H clementine-1.2.0+dfsg/src/internet/localredirectserver.cpp000066400000000000000000000052471223327513400237540ustar00rootroot00000000000000#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.0+dfsg/src/internet/localredirectserver.h000066400000000000000000000015711223327513400234150ustar00rootroot00000000000000#ifndef LOCALREDIRECTSERVER_H #define LOCALREDIRECTSERVER_H #include #include #include class QTcpServer; class QTcpSocket; class LocalRedirectServer : public QObject { Q_OBJECT public: LocalRedirectServer(QObject* parent = 0); // 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 // LOCALREDIRECTSERVER_H clementine-1.2.0+dfsg/src/internet/magnatunedownloaddialog.cpp000066400000000000000000000226141223327513400245750ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "magnatuneservice.h" #include "internetmodel.h" #include "ui_magnatunedownloaddialog.h" #include "core/logging.h" #include "core/network.h" #include "core/utilities.h" #include "widgets/progressitemdelegate.h" #include #include #include #include #include #include #include #include #include #include MagnatuneDownloadDialog::MagnatuneDownloadDialog(MagnatuneService* service, QWidget *parent) : QDialog(parent), ui_(new Ui_MagnatuneDownloadDialog), service_(service), network_(new NetworkAccessManager(this)), current_reply_(NULL), 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; foreach (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 ; ialbums->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 = float(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_ = NULL; 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 ; ialbums->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()) { boost::scoped_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.0+dfsg/src/internet/magnatunedownloaddialog.h000066400000000000000000000036551223327513400242460ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef MAGNATUNEDOWNLOADDIALOG_H #define 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: MagnatuneDownloadDialog(MagnatuneService* service, QWidget *parent = 0); ~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_; boost::scoped_ptr download_file_; int next_row_; }; #endif // MAGNATUNEDOWNLOADDIALOG_H clementine-1.2.0+dfsg/src/internet/magnatunedownloaddialog.ui000066400000000000000000000106021223327513400244220ustar00rootroot00000000000000 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.0+dfsg/src/internet/magnatuneplaylistitem.cpp000066400000000000000000000024061223327513400243230ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "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.0+dfsg/src/internet/magnatuneplaylistitem.h000066400000000000000000000021131223327513400237630ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef MAGNATUNEPLAYLISTITEM_H #define MAGNATUNEPLAYLISTITEM_H #include "library/libraryplaylistitem.h" class MagnatunePlaylistItem : public LibraryPlaylistItem { public: MagnatunePlaylistItem(const QString& type); MagnatunePlaylistItem(const Song& song); bool InitFromQuery(const SqlRow& query); QUrl Url() const; }; #endif // MAGNATUNEPLAYLISTITEM_H clementine-1.2.0+dfsg/src/internet/magnatuneservice.cpp000066400000000000000000000264411223327513400232500ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "magnatuneplaylistitem.h" #include "magnatuneservice.h" #include "magnatuneurlhandler.h" #include "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" #include "qtiocompressor.h" #include #include #include #include #include #include #include #include #include #include using boost::shared_ptr; 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_(NULL), root_(NULL), library_backend_(NULL), library_model_(NULL), library_filter_(NULL), 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: 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: 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.0+dfsg/src/internet/magnatuneservice.h000066400000000000000000000064661223327513400227220ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef MAGNATUNESERVICE_H #define MAGNATUNESERVICE_H #include #include "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 // MAGNATUNESERVICE_H clementine-1.2.0+dfsg/src/internet/magnatunesettingspage.cpp000066400000000000000000000130671223327513400243050ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "core/network.h" #include "magnatuneservice.h" #include "internetmodel.h" #include "ui_magnatunesettingspage.h" #include #include #include #include #include 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.0+dfsg/src/internet/magnatunesettingspage.h000066400000000000000000000026741223327513400237540ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef MAGNATUNESETTINGSPAGE_H #define MAGNATUNESETTINGSPAGE_H #include "ui/settingspage.h" class QAuthenticator; class QNetworkReply; class NetworkAccessManager; class Ui_MagnatuneSettingsPage; class MagnatuneSettingsPage : public SettingsPage { Q_OBJECT public: 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 // MAGNATUNESETTINGSPAGE_H clementine-1.2.0+dfsg/src/internet/magnatunesettingspage.ui000066400000000000000000000117061223327513400241360ustar00rootroot00000000000000 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.0+dfsg/src/internet/magnatuneurlhandler.cpp000066400000000000000000000021021223327513400237340ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/internet/magnatuneurlhandler.h000066400000000000000000000022711223327513400234100ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef MAGNATUNEURLHANDLER_H #define 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 // MAGNATUNEURLHANDLER_H clementine-1.2.0+dfsg/src/internet/oauthenticator.cpp000066400000000000000000000124421223327513400227350ustar00rootroot00000000000000#include "oauthenticator.h" #include #include #include #include #include "core/closure.h" #include "core/logging.h" #include "internet/localredirectserver.h" 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; if (redirect_style_ == RedirectStyle::REMOTE) { const int port = server->url().port(); redirect_url = QUrl( QString("http://data.clementine-player.org/skydrive?port=%1").arg(port)); } else { redirect_url = server->url(); } url.addQueryItem("redirect_uri", redirect_url.toString()); 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; foreach (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()); 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; foreach (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(); } clementine-1.2.0+dfsg/src/internet/oauthenticator.h000066400000000000000000000033271223327513400224040ustar00rootroot00000000000000#ifndef OAUTHENTICATOR_H #define 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, }; OAuthenticator( const QString& client_id, const QString& client_secret, RedirectStyle redirect, QObject* parent = 0); 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); private: 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 clementine-1.2.0+dfsg/src/internet/savedradio.cpp000066400000000000000000000122441223327513400220250ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "internetmodel.h" #include "savedradio.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" #include #include const char* SavedRadio::kServiceName = "SavedRadio"; const char* SavedRadio::kSettingsGroup = "SavedRadio"; SavedRadio::SavedRadio(Application* app, InternetModel* parent) : InternetService(kServiceName, app, parent, parent), context_menu_(NULL), root_(NULL) { 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: foreach (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 ; iaddActions(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.0+dfsg/src/internet/savedradio.h000066400000000000000000000041201223327513400214640ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SAVEDRADIO_H #define SAVEDRADIO_H #include "internetservice.h" #include class QMenu; class AddStreamDialog; class SavedRadio : public InternetService { Q_OBJECT public: SavedRadio(Application* app, InternetModel* parent); ~SavedRadio(); enum ItemType { Type_Stream = 2000, }; struct Stream { 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_; boost::scoped_ptr edit_dialog_; }; #endif // SAVEDRADIO_H clementine-1.2.0+dfsg/src/internet/searchboxwidget.cpp000066400000000000000000000041651223327513400230710ustar00rootroot00000000000000/* 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 "internetservice.h" #include "searchboxwidget.h" #include "ui_searchboxwidget.h" #include "ui/iconloader.h" #include "widgets/didyoumean.h" #include #include 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::keyReleaseEvent(QKeyEvent* e) { switch (e->key()) { case Qt::Key_Escape: ui_->filter->clear(); e->accept(); break; } QWidget::keyReleaseEvent(e); } clementine-1.2.0+dfsg/src/internet/searchboxwidget.h000066400000000000000000000025521223327513400225340ustar00rootroot00000000000000/* 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 SEARCHBOXWIDGET_H #define SEARCHBOXWIDGET_H #include class InternetService; class DidYouMean; class Ui_SearchBoxWidget; class QActionGroup; class QMenu; class SearchBoxWidget : public QWidget { Q_OBJECT public: SearchBoxWidget(InternetService* service); ~SearchBoxWidget(); DidYouMean* did_you_mean() { return did_you_mean_; } signals: void TextChanged(const QString& text); public slots: void FocusOnFilter(QKeyEvent* e); protected: void keyReleaseEvent(QKeyEvent* e); private: InternetService* service_; Ui_SearchBoxWidget* ui_; QMenu* menu_; DidYouMean* did_you_mean_; }; #endif // SEARCHBOXWIDGET_H clementine-1.2.0+dfsg/src/internet/searchboxwidget.ui000066400000000000000000000023111223327513400227130ustar00rootroot00000000000000 SearchBoxWidget 0 0 513 27 Form 0 0 16 16 QToolButton::InstantPopup true QSearchField QWidget
3rdparty/qocoa/qsearchfield.h
clementine-1.2.0+dfsg/src/internet/skydriveservice.cpp000066400000000000000000000121351223327513400231240ustar00rootroot00000000000000#include "skydriveservice.h" #include using boost::scoped_ptr; #include #include "core/application.h" #include "core/player.h" #include "core/waitforsignal.h" #include "internet/oauthenticator.h" #include "internet/skydriveurlhandler.h" namespace { static const char* kServiceName = "Skydrive"; static const char* kServiceId = "skydrive"; static const char* kSettingsGroup = "Skydrive"; static const char* kClientId = "00000000400E7C78"; static const char* kClientSecret = "B0KLZjEgC5SpW0KknrsBFwlaKmGThaAk"; 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 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 true; } void SkydriveService::Connect() { OAuthenticator* oauth = new OAuthenticator( kClientId, kClientSecret, OAuthenticator::RedirectStyle::REMOTE, this); QSettings s; s.beginGroup(kSettingsGroup); if (s.contains("refresh_token")) { oauth->RefreshAuthorisation( kOAuthTokenEndpoint, s.value("refresh_token").toString()); } 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(); qLog(Debug) << response; 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(); qLog(Debug) << response; QVariantList files = response["data"].toList(); foreach (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); } } } QUrl SkydriveService::GetStreamingUrlFromSongId(const QString& file_id) { EnsureConnected(); QUrl url(QString(kSkydriveBase) + file_id); QNetworkRequest request(url); AddAuthorizationHeader(&request); scoped_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())); } clementine-1.2.0+dfsg/src/internet/skydriveservice.h000066400000000000000000000015731223327513400225750ustar00rootroot00000000000000#ifndef SKYDRIVESERVICE_H #define SKYDRIVESERVICE_H #include "cloudfileservice.h" #include class OAuthenticator; class QNetworkRequest; class QNetworkReply; class SkydriveService : public CloudFileService { Q_OBJECT public: SkydriveService( Application* app, InternetModel* parent); QUrl GetStreamingUrlFromSongId(const QString& song_id); protected: // CloudFileService virtual bool has_credentials() const; virtual void Connect(); private slots: void ConnectFinished(OAuthenticator* oauth); void FetchUserInfoFinished(QNetworkReply* reply); void ListFilesFinished(QNetworkReply* reply); signals: void Connected(); private: void AddAuthorizationHeader(QNetworkRequest* request); void ListFiles(const QString& folder); void EnsureConnected(); QString access_token_; QDateTime expiry_time_; }; #endif // SKYDRIVESERVICE_H clementine-1.2.0+dfsg/src/internet/skydriveurlhandler.cpp000066400000000000000000000006711223327513400236260ustar00rootroot00000000000000#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.0+dfsg/src/internet/skydriveurlhandler.h000066400000000000000000000007441223327513400232740ustar00rootroot00000000000000#ifndef SKYDRIVEURLHANDLER_H #define SKYDRIVEURLHANDLER_H #include "core/urlhandler.h" class SkydriveService; class SkydriveUrlHandler : public UrlHandler { Q_OBJECT public: SkydriveUrlHandler(SkydriveService* service, QObject* parent = 0); QString scheme() const { return "skydrive"; } QIcon icon() const { return QIcon(":providers/skydrive.png"); } LoadResult StartLoading(const QUrl& url); private: SkydriveService* service_; }; #endif // SKYDRIVEURLHANDLER_H clementine-1.2.0+dfsg/src/internet/somafmservice.cpp000066400000000000000000000174201223327513400225500ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "somafmurlhandler.h" #include "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" #include #include #include #include #include #include #include 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_(NULL), context_menu_(NULL), 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: 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()); foreach (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")) { } RadioGFMService::RadioGFMService(Application* app, InternetModel* parent) : SomaFMServiceBase( app, parent, "Radio GFM", QUrl("http://streams.radio-gfm.net/channels.xml"), QUrl("http://www.radio-gfm.net"), QUrl("http://www.radio-gfm.net/spenden"), QIcon(":providers/radiogfm.png")) { } clementine-1.2.0+dfsg/src/internet/somafmservice.h000066400000000000000000000060441223327513400222150ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SOMAFMSERVICE_H #define SOMAFMSERVICE_H #include #include "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); }; class RadioGFMService : public SomaFMServiceBase { public: RadioGFMService(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 // SOMAFMSERVICE_H clementine-1.2.0+dfsg/src/internet/somafmurlhandler.cpp000066400000000000000000000055471223327513400232570ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include "internetmodel.h" #include "somafmservice.h" #include "somafmurlhandler.h" #include "core/application.h" #include "core/logging.h" #include "core/taskmanager.h" #include "playlistparsers/playlistparser.h" #include #include #include #include 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: Error handling qLog(Error) << reply->errorString(); emit AsyncLoadComplete(LoadResult(original_url, LoadResult::NoMoreTracks)); return; } // Parse the playlist PlaylistParser parser(NULL); 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.0+dfsg/src/internet/somafmurlhandler.h000066400000000000000000000024021223327513400227070ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SOMAFMURLHANDLER_H #define 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 // SOMAFMURLHANDLER_H clementine-1.2.0+dfsg/src/internet/soundcloudservice.cpp000066400000000000000000000212651223327513400234470ustar00rootroot00000000000000/* 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 "soundcloudservice.h" #include #include #include #include #include #include #include #include "internetmodel.h" #include "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::kServiceName = "SoundCloud"; const char* SoundCloudService::kSettingsGroup = "SoundCloud"; const char* SoundCloudService::kUrl = "https://api.soundcloud.com/"; 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_(NULL), search_(NULL), network_(new NetworkAccessManager(this)), context_menu_(NULL), 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() { 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_); } QWidget* SoundCloudService::HeaderWidget() const { return search_box_; } void SoundCloudService::Homepage() { QDesktopServices::openUrl(QUrl(kHomepage)); } 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 foreach (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); } QNetworkReply* SoundCloudService::CreateRequest( const QString& ressource_name, const QList& params) { QUrl url(kUrl); url.setPath(ressource_name); url.addQueryItem("client_id", kApiClientId); foreach(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) { QJson::Parser parser; bool ok; QVariant result = parser.parse(reply, &ok); if (!ok) { qLog(Error) << "Error while parsing SoundCloud result"; } return result; } SongList SoundCloudService::ExtractSongs(const QVariant& result) { SongList songs; QVariantList q_variant_list = result.toList(); foreach(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()) { // 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. QUrl cover_url = cover.toUrl(); 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.0+dfsg/src/internet/soundcloudservice.h000066400000000000000000000052561223327513400231160ustar00rootroot00000000000000/* 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 SOUNDCLOUDSERVICE_H #define SOUNDCLOUDSERVICE_H #include "internetmodel.h" #include "internetservice.h" class NetworkAccessManager; 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 //QList playlistitem_actions(const Song& song); void ShowContextMenu(const QPoint& global_pos); QWidget* HeaderWidget() const; int SimpleSearch(const QString& query); static const char* kServiceName; static const char* kSettingsGroup; signals: void SimpleSearchResults(int id, SongList songs); private slots: 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: void ClearSearchResults(); void EnsureItemsCreated(); void EnsureMenuCreated(); QNetworkReply* CreateRequest(const QString& ressource_name, const QList >& params); // Convenient function for extracting result from reply QVariant ExtractResult(QNetworkReply* reply); SongList ExtractSongs(const QVariant& result); Song ExtractSong(const QVariantMap& result_song); QStandardItem* root_; QStandardItem* search_; NetworkAccessManager* network_; QMenu* context_menu_; SearchBoxWidget* search_box_; QTimer* search_delay_; QString pending_search_; int next_pending_search_id_; QByteArray api_key_; static const char* kUrl; static const char* kUrlCover; static const char* kHomepage; static const int kSongSearchLimit; static const int kSongSimpleSearchLimit; static const int kSearchDelayMsec; static const char* kApiClientId; }; #endif // SOUNDCLOUDSERVICE_H clementine-1.2.0+dfsg/src/internet/spotifyblobdownloader.cpp000066400000000000000000000146561223327513400243300ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "spotifyblobdownloader.h" #include "spotifyservice.h" #include "core/logging.h" #include "core/network.h" #include "core/utilities.h" #include #include #include #include #include #ifdef HAVE_QCA #include #endif // HAVE_QCA const char* SpotifyBlobDownloader::kSignatureSuffix = ".sha1"; 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(NULL, 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); foreach (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? foreach (QNetworkReply* reply, replies_) { if (!reply->isFinished()) { return; } } // Read files into memory first. QMap file_data; QStringList signature_filenames; foreach (QNetworkReply* reply, replies_) { const QString filename = reply->url().path().section('/', -1, -1); if (filename.endsWith(kSignatureSuffix)) { signature_filenames << filename; } file_data[filename] = reply->readAll(); } #ifdef HAVE_QCA // Load the public key QCA::ConvertResult conversion_result; QCA::PublicKey key = QCA::PublicKey::fromPEMFile(":/clementine-spotify-public.pem", &conversion_result); if (QCA::ConvertGood != conversion_result) { ShowError("Failed to load Spotify public key"); return; } // Verify signatures foreach (const QString& signature_filename, signature_filenames) { QString actual_filename = signature_filename; actual_filename.remove(kSignatureSuffix); qLog(Debug) << "Verifying" << actual_filename << "against" << signature_filename; if (!key.verifyMessage(file_data[actual_filename], file_data[signature_filename], QCA::EMSA3_SHA1)) { ShowError("Invalid signature: " + actual_filename); return; } } #endif // HAVE_QCA // Make the destination directory and write the files into it QDir().mkpath(path_); foreach (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(); } void SpotifyBlobDownloader::ReplyProgress() { int progress = 0; int total = 0; foreach (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 foreach (QNetworkReply* reply, replies_) { disconnect(reply, 0, this, 0); reply->abort(); } qLog(Warning) << message; QMessageBox::warning(NULL, tr("Error downloading Spotify plugin"), message, QMessageBox::Close); deleteLater(); } void SpotifyBlobDownloader::EmitFinished() { emit Finished(); deleteLater(); } clementine-1.2.0+dfsg/src/internet/spotifyblobdownloader.h000066400000000000000000000030221223327513400237560ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SPOTIFYBLOBDOWNLOADER_H #define SPOTIFYBLOBDOWNLOADER_H #include class QNetworkAccessManager; class QNetworkReply; class QProgressDialog; class SpotifyBlobDownloader : public QObject { Q_OBJECT public: SpotifyBlobDownloader(const QString& version, const QString& path, QObject* parent = 0); ~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(); private: QString version_; QString path_; QNetworkAccessManager* network_; QList replies_; QProgressDialog* progress_; }; #endif // SPOTIFYBLOBDOWNLOADER_H clementine-1.2.0+dfsg/src/internet/spotifyserver.cpp000066400000000000000000000207051223327513400226310ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "core/closure.h" #include "core/logging.h" #include "spotifymessages.pb.h" #include #include #include SpotifyServer::SpotifyServer(QObject* parent) : AbstractMessageHandler(NULL, 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 foreach (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 foreach (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::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_bytes) { pb::spotify::Message message; pb::spotify::SeekRequest* req = message.mutable_seek_request(); req->set_offset_bytes(offset_bytes); 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); } clementine-1.2.0+dfsg/src/internet/spotifyserver.h000066400000000000000000000061231223327513400222740ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SPOTIFYSERVER_H #define SPOTIFYSERVER_H #include "spotifymessages.pb.h" #include "core/messagehandler.h" #include #include class QTcpServer; class QTcpSocket; class SpotifyServer : public AbstractMessageHandler { Q_OBJECT public: SpotifyServer(QObject* parent = 0); 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 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(); int server_port() const; public slots: void StartPlayback(const QString& uri, quint16 port); void Seek(qint64 offset_bytes); 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 SendOrQueueMessage(const pb::spotify::Message& message); QTcpServer* server_; bool logged_in_; QList queued_login_messages_; QList queued_messages_; }; #endif // SPOTIFYSERVER_H clementine-1.2.0+dfsg/src/internet/spotifyservice.cpp000066400000000000000000000545501223327513400227700ustar00rootroot00000000000000#include "blobversion.h" #include "config.h" #include "internetmodel.h" #include "searchboxwidget.h" #include "spotifyserver.h" #include "spotifyservice.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" #include #include #include #include #include #include #include #include #include #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_(NULL), blob_process_(NULL), root_(NULL), search_(NULL), starred_(NULL), inbox_(NULL), toplist_(NULL), login_task_id_(0), context_menu_(NULL), 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(NULL, 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_ = NULL; 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::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); 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_); } // 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; } // Remove and recreate the other playlists foreach (QStandardItem* item, playlists_) { item->parent()->removeRow(item->row()); } playlists_.clear(); for (int i=0 ; isetData(InternetModel::Type_UserPlaylist, InternetModel::Role_Type); item->setData(true, InternetModel::Role_CanLazyLoad); item->setData(msg.index(), Role_UserPlaylistIndex); item->setData(InternetModel::PlayBehaviour_MultipleItems, InternetModel::Role_PlayBehaviour); 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 ; itext()) { 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 { foreach (QStandardItem* item, playlists_) { if (item->data(Role_UserPlaylistIndex).toInt() == index) { return item; } } return NULL; } 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 ; iset_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); } PlaylistItem::Options SpotifyService::playlistitem_options() const { return PlaylistItem::PauseDisabled | PlaylistItem::SeekDisabled; } QWidget* SpotifyService::HeaderWidget() const { if (IsLoggedIn()) return search_box_; return NULL; } void SpotifyService::EnsureMenuCreated() { if (context_menu_) return; context_menu_ = new QMenu; context_menu_->addAction(IconLoader::Load("configure"), tr("Configure Spotify..."), this, SLOT(ShowConfig())); 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())); playlist_context_menu_->addSeparator(); playlist_context_menu_->addAction(IconLoader::Load("configure"), tr("Configure Spotify..."), this, SLOT(ShowConfig())); } 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 ; iappendRow(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); return; } } context_menu_->popup(global_pos); } void SpotifyService::ItemDoubleClicked(QStandardItem* item) { } void SpotifyService::DropMimeData(const QMimeData* data, const QModelIndex& index) { qLog(Debug) << Q_FUNC_INFO << data->urls(); } void SpotifyService::LoadImage(const QString& id) { EnsureServerCreated(); server_->LoadImage(id); } 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); } } } void SpotifyService::ShowConfig() { app_->OpenSettingsDialogAtPage(SettingsDialog::Page_Spotify); } void SpotifyService::Logout() { delete server_; delete blob_process_; server_ = NULL; blob_process_ = NULL; login_state_ = LoginState_OtherError; QSettings s; s.beginGroup(kSettingsGroup); s.setValue("login_state", login_state_); } clementine-1.2.0+dfsg/src/internet/spotifyservice.h000066400000000000000000000101461223327513400224260ustar00rootroot00000000000000#ifndef SPOTIFYSERVICE_H #define SPOTIFYSERVICE_H #include "internetmodel.h" #include "internetservice.h" #include "spotifymessages.pb.h" #include #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_Track, 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(); QStandardItem* CreateRootItem(); void LazyPopulate(QStandardItem* parent); void ShowContextMenu(const QPoint& global_pos); void ItemDoubleClicked(QStandardItem* item); void DropMimeData(const QMimeData* data, const QModelIndex& index); PlaylistItem::Options playlistitem_options() const; QWidget* HeaderWidget() const; void Logout(); void Login(const QString& username, const QString& password); Q_INVOKABLE void LoadImage(const QString& id); 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(); private: void StartBlobProcess(); void FillPlaylist( QStandardItem* item, const google::protobuf::RepeatedPtrField& tracks); void FillPlaylist(QStandardItem* item, const pb::spotify::LoadPlaylistResponse& response); void EnsureMenuCreated(); 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 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 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_; QAction* playlist_sync_action_; 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 clementine-1.2.0+dfsg/src/internet/spotifysettingspage.cpp000066400000000000000000000123231223327513400240150ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "config.h" #include "spotifymessages.pb.h" #include "spotifyservice.h" #include "internetmodel.h" #include "ui_spotifysettingspage.h" #include "core/network.h" #include "ui/iconloader.h" #include #include #include #include #include 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.0+dfsg/src/internet/spotifysettingspage.h000066400000000000000000000026521223327513400234660ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #ifndef SPOTIFYSETTINGSPAGE_H #define SPOTIFYSETTINGSPAGE_H #include "ui/settingspage.h" class NetworkAccessManager; class Ui_SpotifySettingsPage; class SpotifyService; class SpotifySettingsPage : public SettingsPage { Q_OBJECT public: 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 // SPOTIFYSETTINGSPAGE_H clementine-1.2.0+dfsg/src/internet/spotifysettingspage.ui000066400000000000000000000133251223327513400236530ustar00rootroot00000000000000 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.0+dfsg/src/internet/subsonicservice.cpp000066400000000000000000000402141223327513400231100ustar00rootroot00000000000000#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/internetmodel.h" #include "internet/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_(NULL), root_(NULL), library_backend_(NULL), library_model_(NULL), library_filter_(NULL), 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", password_); 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: library refresh logic? } 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(); QXmlStreamReader reader(reply); reader.readNextStartElement(); Q_ASSERT(reader.name() == "subsonic-response"); if (reader.attributes().value("status") != "ok") { // TODO: error handling return; } int albums_added = 0; reader.readNextStartElement(); Q_ASSERT(reader.name() == "albumList2"); while (reader.readNextStartElement()) { Q_ASSERT(reader.name() == "album"); 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; } 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(); Q_ASSERT(reader.name() == "subsonic-response"); if (reader.attributes().value("status") != "ok") { // TODO: error handling return; } // Read album information reader.readNextStartElement(); Q_ASSERT(reader.name() == "album"); QString album_artist = reader.attributes().value("artist").toString(); // Read song information while (reader.readNextStartElement()) { Q_ASSERT(reader.name() == "song"); 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); } clementine-1.2.0+dfsg/src/internet/subsonicservice.h000066400000000000000000000105511223327513400225560ustar00rootroot00000000000000#ifndef SUBSONICSERVICE_H #define SUBSONICSERVICE_H #include #include "internet/internetmodel.h" #include "internet/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: SubsonicLibraryScanner(SubsonicService* service, QObject* parent = 0); ~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); SubsonicService* service_; bool scanning_; QQueue album_queue_; QSet pending_requests_; SongList songs_; }; #endif // SUBSONICSERVICE_H clementine-1.2.0+dfsg/src/internet/subsonicsettingspage.cpp000066400000000000000000000142161223327513400241500ustar00rootroot00000000000000#include "subsonicsettingspage.h" #include "ui_subsonicsettingspage.h" #include "core/logging.h" #include "internetmodel.h" #include 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.0+dfsg/src/internet/subsonicsettingspage.h000066400000000000000000000011331223327513400236070ustar00rootroot00000000000000#ifndef SUBSONICSETTINGSPAGE_H #define SUBSONICSETTINGSPAGE_H #include "ui/settingspage.h" #include "subsonicservice.h" class Ui_SubsonicSettingsPage; class SubsonicSettingsPage : public SettingsPage { Q_OBJECT public: 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 // SUBSONICSETTINGSPAGE_H clementine-1.2.0+dfsg/src/internet/subsonicsettingspage.ui000066400000000000000000000055301223327513400240020ustar00rootroot00000000000000 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.0+dfsg/src/internet/subsonicurlhandler.cpp000066400000000000000000000010151223327513400236040ustar00rootroot00000000000000#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(); QUrl newurl = service_->BuildRequestUrl("stream"); newurl.addQueryItem("id", url.host()); return LoadResult(url, LoadResult::TrackAvailable, newurl); } clementine-1.2.0+dfsg/src/internet/subsonicurlhandler.h000066400000000000000000000010631223327513400232540ustar00rootroot00000000000000#ifndef SUBSONICURLHANDLER_H #define 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 // SUBSONICURLHANDLER_H clementine-1.2.0+dfsg/src/internet/ubuntuoneauthenticator.cpp000066400000000000000000000106011223327513400245160ustar00rootroot00000000000000#include "ubuntuoneauthenticator.h" #include #include #include #include #include #include #include "core/closure.h" #include "core/logging.h" #include "core/network.h" #include "core/timeconstants.h" namespace { static const char* kUbuntuOneEndpoint = "https://login.ubuntu.com/api/1.0/authentications"; static const char* kTokenNameTemplate = "Ubuntu One @ %1 [%2]"; static const char* kOAuthSSOFinishedEndpoint = "https://one.ubuntu.com/oauth/sso-finished-so-get-tokens/"; static const char* kOAuthHeaderPrefix = "OAuth realm=\"\", "; } UbuntuOneAuthenticator::UbuntuOneAuthenticator(QObject* parent) : QObject(parent), network_(new NetworkAccessManager(this)), success_(false) { } void UbuntuOneAuthenticator::StartAuthorisation( const QString& email, const QString& password) { QUrl url(kUbuntuOneEndpoint); url.addQueryItem("ws.op", "authenticate"); QString token_name = QString(kTokenNameTemplate).arg( QHostInfo::localHostName(), QCoreApplication::applicationName()); url.addQueryItem("token_name", token_name); QByteArray authentication = QString(email + ":" + password).toAscii().toBase64(); QString authorisation = QString("Basic %1").arg(QString::fromAscii(authentication)); QNetworkRequest request(url); request.setRawHeader("Authorization", authorisation.toAscii()); request.setRawHeader("Accept", "application/json"); QNetworkReply* reply = network_->get(request); NewClosure(reply, SIGNAL(finished()), this, SLOT(AuthorisationFinished(QNetworkReply*)), reply); qLog(Debug) << url; qLog(Debug) << authorisation; } void UbuntuOneAuthenticator::AuthorisationFinished(QNetworkReply* reply) { reply->deleteLater(); QByteArray data = reply->readAll(); qLog(Debug) << data; QJson::Parser parser; bool ok = false; QVariant json = parser.parse(data, &ok); if (!ok) { qLog(Error) << "Failed to authenticate to Ubuntu One:" << parser.errorString(); emit Finished(); return; } QVariantMap auth_info = json.toMap(); consumer_key_ = auth_info["consumer_key"].toString(); consumer_secret_ = auth_info["consumer_secret"].toString(); token_ = auth_info["token"].toString(); token_secret_ = auth_info["token_secret"].toString(); CopySSOTokens(); } QByteArray UbuntuOneAuthenticator::GenerateAuthorisationHeader( const QString& consumer_key, const QString& consumer_secret, const QString& token, const QString& token_secret) { typedef QPair Param; QString timestamp = QString::number(time(NULL)); QList parameters; parameters << Param("oauth_nonce", QString::number(qrand())) << Param("oauth_timestamp", timestamp) << Param("oauth_version", "1.0") << Param("oauth_consumer_key", consumer_key) << Param("oauth_token", token) << Param("oauth_signature_method", "PLAINTEXT"); qSort(parameters.begin(), parameters.end()); QStringList encoded_params; foreach (const Param& p, parameters) { encoded_params << QString("%1=%2").arg(p.first, p.second); } QString signing_key = consumer_secret + "&" + token_secret; QByteArray signature = QUrl::toPercentEncoding(signing_key); // Construct authorisation header parameters << Param("oauth_signature", signature); QStringList header_params; foreach (const Param& p, parameters) { header_params << QString("%1=\"%2\"").arg(p.first, p.second); } QString authorisation_header = header_params.join(", "); authorisation_header.prepend(kOAuthHeaderPrefix); return authorisation_header.toAscii(); } QByteArray UbuntuOneAuthenticator::GenerateAuthorisationHeader() { return GenerateAuthorisationHeader( consumer_key_, consumer_secret_, token_, token_secret_); } void UbuntuOneAuthenticator::CopySSOTokens() { QUrl url(kOAuthSSOFinishedEndpoint); QNetworkRequest request(url); request.setRawHeader("Authorization", GenerateAuthorisationHeader()); request.setRawHeader("Accept", "application/json"); QNetworkReply* reply = network_->get(request); NewClosure(reply, SIGNAL(finished()), this, SLOT(CopySSOTokensFinished(QNetworkReply*)), reply); } void UbuntuOneAuthenticator::CopySSOTokensFinished(QNetworkReply* reply) { reply->deleteLater(); qLog(Debug) << reply->readAll(); success_ = true; emit Finished(); } clementine-1.2.0+dfsg/src/internet/ubuntuoneauthenticator.h000066400000000000000000000023031223327513400241630ustar00rootroot00000000000000#ifndef UBUNTUONEAUTHENTICATOR_H #define UBUNTUONEAUTHENTICATOR_H #include class QNetworkReply; class NetworkAccessManager; class UbuntuOneAuthenticator : public QObject { Q_OBJECT public: explicit UbuntuOneAuthenticator(QObject* parent = 0); void StartAuthorisation(const QString& email, const QString& password); bool success() const { return success_; } QString consumer_key() const { return consumer_key_; } QString consumer_secret() const { return consumer_secret_; } QString token() const { return token_; } QString token_secret() const { return token_secret_; } static QByteArray GenerateAuthorisationHeader( const QString& consumer_key, const QString& consumer_secret, const QString& token, const QString& token_secret); signals: void Finished(); private slots: void AuthorisationFinished(QNetworkReply* reply); void CopySSOTokensFinished(QNetworkReply* reply); private: void CopySSOTokens(); QByteArray GenerateAuthorisationHeader(); private: NetworkAccessManager* network_; bool success_; QString consumer_key_; QString consumer_secret_; QString token_; QString token_secret_; }; #endif // UBUNTUONEAUTHENTICATOR_H clementine-1.2.0+dfsg/src/internet/ubuntuoneservice.cpp000066400000000000000000000135351223327513400233150ustar00rootroot00000000000000#include "ubuntuoneservice.h" #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/network.h" #include "core/player.h" #include "core/timeconstants.h" #include "core/utilities.h" #include "globalsearch/globalsearch.h" #include "globalsearch/librarysearchprovider.h" #include "internet/internetmodel.h" #include "internet/ubuntuoneauthenticator.h" #include "internet/ubuntuoneurlhandler.h" #include "library/librarybackend.h" #include "playlist/playlist.h" #include "ui/iconloader.h" const char* UbuntuOneService::kServiceName = "Ubuntu One"; const char* UbuntuOneService::kSettingsGroup = "Ubuntu One"; namespace { static const char* kFileStorageEndpoint = "https://one.ubuntu.com/api/file_storage/v1"; static const char* kVolumesEndpoint = "https://one.ubuntu.com/api/file_storage/v1/volumes"; static const char* kContentRoot = "https://files.one.ubuntu.com"; static const char* kServiceId = "ubuntu_one"; } UbuntuOneService::UbuntuOneService(Application* app, InternetModel* parent) : CloudFileService( app, parent, kServiceName, kServiceId, QIcon(":/providers/ubuntuone.png"), SettingsDialog::Page_UbuntuOne) { app_->player()->RegisterUrlHandler(new UbuntuOneUrlHandler(this, this)); QSettings s; s.beginGroup(kSettingsGroup); if (s.contains("consumer_key")) { consumer_key_ = s.value("consumer_key").toString(); consumer_secret_ = s.value("consumer_secret").toString(); token_ = s.value("token").toString(); token_secret_ = s.value("token_secret").toString(); } } bool UbuntuOneService::has_credentials() const { return !consumer_key_.isEmpty(); } void UbuntuOneService::Connect() { if (has_credentials()) { RequestVolumeList(); } else { ShowSettingsDialog(); } } QByteArray UbuntuOneService::GenerateAuthorisationHeader() { return UbuntuOneAuthenticator::GenerateAuthorisationHeader( consumer_key_, consumer_secret_, token_, token_secret_); } void UbuntuOneService::AuthenticationFinished( UbuntuOneAuthenticator* authenticator) { authenticator->deleteLater(); if (!authenticator->success()) { return; } consumer_key_ = authenticator->consumer_key(); consumer_secret_ = authenticator->consumer_secret(); token_ = authenticator->token(); token_secret_ = authenticator->token_secret(); QSettings s; s.beginGroup(kSettingsGroup); s.setValue("consumer_key", consumer_key_); s.setValue("consumer_secret", consumer_secret_); s.setValue("token", token_); s.setValue("token_secret", token_secret_); RequestVolumeList(); } QNetworkReply* UbuntuOneService::SendRequest(const QUrl& url) { QNetworkRequest request(url); request.setRawHeader("Authorization", GenerateAuthorisationHeader()); request.setRawHeader("Accept", "application/json"); return network_->get(request); } void UbuntuOneService::RequestVolumeList() { QUrl volumes_url(kVolumesEndpoint); QNetworkReply* reply = SendRequest(volumes_url); NewClosure(reply, SIGNAL(finished()), this, SLOT(VolumeListRequestFinished(QNetworkReply*)), reply); } void UbuntuOneService::VolumeListRequestFinished(QNetworkReply* reply) { reply->deleteLater(); QJson::Parser parser; QVariantList result = parser.parse(reply).toList(); foreach (const QVariant& v, result) { RequestFileList(v.toMap()["node_path"].toString()); } } void UbuntuOneService::RequestFileList(const QString& path) { QUrl files_url(QString(kFileStorageEndpoint) + path); files_url.addQueryItem("include_children", "true"); qLog(Debug) << "Sending files request" << files_url; QNetworkReply* files_reply = SendRequest(files_url); NewClosure(files_reply, SIGNAL(finished()), this, SLOT(FileListRequestFinished(QNetworkReply*)), files_reply); } void UbuntuOneService::FileListRequestFinished(QNetworkReply* reply) { reply->deleteLater(); QJson::Parser parser; QVariantMap result = parser.parse(reply).toMap(); QVariantList children = result["children"].toList(); foreach (const QVariant& c, children) { QVariantMap child = c.toMap(); if (child["kind"].toString() == "file") { QString content_path = child["content_path"].toString(); QUrl content_url(kContentRoot); content_url.setPath(content_path); QUrl service_url; service_url.setScheme("ubuntuonefile"); service_url.setPath(content_path); Song metadata; metadata.set_url(service_url); metadata.set_etag(child["hash"].toString()); metadata.set_mtime(QDateTime::fromString( child["when_changed"].toString(), Qt::ISODate).toTime_t()); metadata.set_ctime(QDateTime::fromString( child["when_created"].toString(), Qt::ISODate).toTime_t()); metadata.set_filesize(child["size"].toInt()); metadata.set_title(child["path"].toString().mid(1)); MaybeAddFileToDatabase( metadata, GuessMimeTypeForFile(child["path"].toString().mid(1)), content_url, GenerateAuthorisationHeader()); } else { RequestFileList(child["resource_path"].toString()); } } } QUrl UbuntuOneService::GetStreamingUrlFromSongId(const QString& song_id) { QUrl url(kContentRoot); url.setPath(song_id); url.setFragment(GenerateAuthorisationHeader()); return url; } void UbuntuOneService::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 UbuntuOneService::AddToPlaylist(QMimeData* mime) { playlist_manager_->current()->dropMimeData( mime, Qt::CopyAction, -1, 0, QModelIndex()); } clementine-1.2.0+dfsg/src/internet/ubuntuoneservice.h000066400000000000000000000020641223327513400227550ustar00rootroot00000000000000#ifndef UBUNTUONESERVICE_H #define UBUNTUONESERVICE_H #include "internet/cloudfileservice.h" #include "core/tagreaderclient.h" class QNetworkReply; class UbuntuOneAuthenticator; class UbuntuOneService : public CloudFileService { Q_OBJECT public: UbuntuOneService(Application* app, InternetModel* parent); static const char* kServiceName; static const char* kSettingsGroup; QUrl GetStreamingUrlFromSongId(const QString& song_id); private slots: void AuthenticationFinished(UbuntuOneAuthenticator* authenticator); void FileListRequestFinished(QNetworkReply* reply); void ShowCoverManager(); void AddToPlaylist(QMimeData* mime); void VolumeListRequestFinished(QNetworkReply* reply); private: void Connect(); QNetworkReply* SendRequest(const QUrl& url); void RequestVolumeList(); void RequestFileList(const QString& path); bool has_credentials() const; private: QByteArray GenerateAuthorisationHeader(); QString consumer_key_; QString consumer_secret_; QString token_; QString token_secret_; }; #endif // UBUNTUONESERVICE_H clementine-1.2.0+dfsg/src/internet/ubuntuonesettingspage.cpp000066400000000000000000000054431223327513400243510ustar00rootroot00000000000000#include "ubuntuonesettingspage.h" #include "ui_ubuntuonesettingspage.h" #include "core/application.h" #include "core/closure.h" #include "core/logging.h" #include "internet/internetmodel.h" #include "internet/ubuntuoneauthenticator.h" #include "internet/ubuntuoneservice.h" #include UbuntuOneSettingsPage::UbuntuOneSettingsPage(SettingsDialog* parent) : SettingsPage(parent), ui_(new Ui::UbuntuOneSettingsPage), service_(dialog()->app()->internet_model()->Service()), authenticated_(false) { ui_->setupUi(this); ui_->login_state->AddCredentialField(ui_->username); ui_->login_state->AddCredentialField(ui_->password); ui_->login_state->AddCredentialGroup(ui_->login_container); connect(ui_->login_state, SIGNAL(LogoutClicked()), SLOT(LogoutClicked())); connect(ui_->login_state, SIGNAL(LoginClicked()), SLOT(LoginClicked())); connect(ui_->login_button, SIGNAL(clicked()), SLOT(LoginClicked())); } void UbuntuOneSettingsPage::Load() { QSettings s; s.beginGroup(UbuntuOneService::kSettingsGroup); const QString user_email = s.value("user_email").toString(); if (!user_email.isEmpty()) { ui_->login_state->SetLoggedIn(LoginStateWidget::LoggedIn, user_email); ui_->username->setText(user_email); } } void UbuntuOneSettingsPage::Save() { } void UbuntuOneSettingsPage::LoginClicked() { const QString username = ui_->username->text(); const QString password = ui_->password->text(); ui_->password->clear(); UbuntuOneAuthenticator* authenticator = new UbuntuOneAuthenticator; authenticator->StartAuthorisation(username, password); NewClosure(authenticator, SIGNAL(Finished()), this, SLOT(Connected(UbuntuOneAuthenticator*)), authenticator); NewClosure(authenticator, SIGNAL(Finished()), service_, SLOT(AuthenticationFinished(UbuntuOneAuthenticator*)), authenticator); ui_->login_state->SetLoggedIn(LoginStateWidget::LoginInProgress); } void UbuntuOneSettingsPage::LogoutClicked() { QSettings s; s.beginGroup(UbuntuOneService::kSettingsGroup); s.remove("user_email"); s.remove("consumer_key"); s.remove("consumer_secret"); s.remove("token"); s.remove("token_secret"); ui_->login_state->SetLoggedIn(LoginStateWidget::LoggedOut); } void UbuntuOneSettingsPage::Connected(UbuntuOneAuthenticator* authenticator) { if (!authenticator->success()) { ui_->login_state->SetLoggedIn(LoginStateWidget::LoggedOut); QMessageBox::warning(this, tr("Authentication failed"), tr("Your username or password was incorrect.")); return; } ui_->login_state->SetLoggedIn(LoginStateWidget::LoggedIn, ui_->username->text()); authenticated_ = true; QSettings s; s.beginGroup(UbuntuOneService::kSettingsGroup); s.setValue("user_email", ui_->username->text()); } clementine-1.2.0+dfsg/src/internet/ubuntuonesettingspage.h000066400000000000000000000011241223327513400240060ustar00rootroot00000000000000#ifndef UBUNTUONESETTINGSPAGE_H #define UBUNTUONESETTINGSPAGE_H #include "ui/settingspage.h" class UbuntuOneAuthenticator; class UbuntuOneService; class Ui_UbuntuOneSettingsPage; class UbuntuOneSettingsPage : public SettingsPage { Q_OBJECT public: UbuntuOneSettingsPage(SettingsDialog* parent = 0); void Load(); void Save(); private slots: void LoginClicked(); void LogoutClicked(); void Connected(UbuntuOneAuthenticator* authenticator); private: Ui_UbuntuOneSettingsPage* ui_; UbuntuOneService* service_; bool authenticated_; }; #endif // UBUNTUONESETTINGSPAGE_H clementine-1.2.0+dfsg/src/internet/ubuntuonesettingspage.ui000066400000000000000000000064631223327513400242070ustar00rootroot00000000000000 UbuntuOneSettingsPage 0 0 569 491 Ubuntu One :/providers/ubuntuone.png:/providers/ubuntuone.png Clementine can play music that you have uploaded to Ubuntu One true Account details Ubuntu One username Login Ubuntu One password QLineEdit::Password <a href="https://one.ubuntu.com/auth/login">Create a new account or reset your password</a> true Qt::Vertical 20 40 LoginStateWidget QWidget
widgets/loginstatewidget.h
1
username password login_button
clementine-1.2.0+dfsg/src/internet/ubuntuoneurlhandler.cpp000066400000000000000000000007001223327513400240030ustar00rootroot00000000000000#include "ubuntuoneurlhandler.h" #include "ubuntuoneservice.h" UbuntuOneUrlHandler::UbuntuOneUrlHandler( UbuntuOneService* service, QObject* parent) : UrlHandler(parent), service_(service) { } UrlHandler::LoadResult UbuntuOneUrlHandler::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.0+dfsg/src/internet/ubuntuoneurlhandler.h000066400000000000000000000007621223327513400234600ustar00rootroot00000000000000#ifndef UBUNTUONEURLHANDLER_H #define UBUNTUONEURLHANDLER_H #include "core/urlhandler.h" class UbuntuOneService; class UbuntuOneUrlHandler : public UrlHandler { Q_OBJECT public: UbuntuOneUrlHandler(UbuntuOneService* service, QObject* parent = 0); QString scheme() const { return "ubuntuonefile"; } QIcon icon() const { return QIcon(":providers/ubuntuone.png"); } LoadResult StartLoading(const QUrl& url); private: UbuntuOneService* service_; }; #endif // UBUNTUONEURLHANDLER_H clementine-1.2.0+dfsg/src/library/000077500000000000000000000000001223327513400170115ustar00rootroot00000000000000clementine-1.2.0+dfsg/src/library/directory.h000066400000000000000000000025711223327513400211730ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/library/groupbydialog.cpp000066400000000000000000000051321223327513400223650ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 GroupByDialog::GroupByDialog(QWidget *parent) : QDialog(parent), ui_(new Ui_GroupByDialog) { ui_->setupUi(this); Reset(); mapping_.insert(Mapping(LibraryModel::GroupBy_None, 0)); mapping_.insert(Mapping(LibraryModel::GroupBy_Album, 1)); mapping_.insert(Mapping(LibraryModel::GroupBy_Artist, 2)); mapping_.insert(Mapping(LibraryModel::GroupBy_AlbumArtist, 3)); mapping_.insert(Mapping(LibraryModel::GroupBy_Composer, 4)); mapping_.insert(Mapping(LibraryModel::GroupBy_FileType, 5)); mapping_.insert(Mapping(LibraryModel::GroupBy_Genre, 6)); mapping_.insert(Mapping(LibraryModel::GroupBy_Year, 7)); mapping_.insert(Mapping(LibraryModel::GroupBy_YearAlbum, 8)); mapping_.insert(Mapping(LibraryModel::GroupBy_Performer, 9)); mapping_.insert(Mapping(LibraryModel::GroupBy_Grouping, 10)); connect(ui_->button_box->button(QDialogButtonBox::Reset), SIGNAL(clicked()), SLOT(Reset())); resize(sizeHint()); } GroupByDialog::~GroupByDialog() { delete ui_; } 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( mapping_.get().find(ui_->first->currentIndex())->group_by, mapping_.get().find(ui_->second->currentIndex())->group_by, mapping_.get().find(ui_->third->currentIndex())->group_by)); QDialog::accept(); } void GroupByDialog::LibraryGroupingChanged(const LibraryModel::Grouping& g) { ui_->first->setCurrentIndex(mapping_.get().find(g[0])->combo_box_index); ui_->second->setCurrentIndex(mapping_.get().find(g[1])->combo_box_index); ui_->third->setCurrentIndex(mapping_.get().find(g[2])->combo_box_index); } clementine-1.2.0+dfsg/src/library/groupbydialog.h000066400000000000000000000040431223327513400220320ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 #include #include "librarymodel.h" class Ui_GroupByDialog; 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; class GroupByDialog : public QDialog { Q_OBJECT public: GroupByDialog(QWidget *parent = 0); ~GroupByDialog(); public slots: void LibraryGroupingChanged(const LibraryModel::Grouping& g); void accept(); signals: void Accepted(const LibraryModel::Grouping& g); private slots: void Reset(); private: 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 {}; typedef multi_index_container< Mapping, indexed_by< ordered_unique, member >, ordered_unique, member > > > MappingContainer; MappingContainer mapping_; Ui_GroupByDialog* ui_; }; #endif // GROUPBYDIALOG_H clementine-1.2.0+dfsg/src/library/groupbydialog.ui000066400000000000000000000151671223327513400222310ustar00rootroot00000000000000 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 Year - Album Second level None Album Artist Album artist Composer File type Genre Year Year - Album Third level None Album Artist Album artist Composer File type Genre Year Year - Album 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.0+dfsg/src/library/library.cpp000066400000000000000000000161261223327513400211670ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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/tagreaderclient.h" #include "core/taskmanager.h" #include "smartplaylists/generator.h" #include "smartplaylists/querygenerator.h" #include "smartplaylists/search.h" #include 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_(NULL), model_(NULL), watcher_(NULL), watcher_thread_(NULL) { 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"); } Library::~Library() { watcher_->deleteLater(); watcher_thread_->exit(); watcher_thread_->wait(5000 /* five seconds */); } void Library::Init() { watcher_ = new LibraryWatcher; watcher_thread_ = new QThread(this); 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(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(SubdirsDiscovered(SubdirectoryList)), backend_, SLOT(AddOrUpdateSubdirs(SubdirectoryList))); connect(watcher_, SIGNAL(SubdirsMTimeUpdated(SubdirectoryList)), backend_, SLOT(AddOrUpdateSubdirs(SubdirectoryList))); connect(watcher_, SIGNAL(CompilationsNeedUpdating()), backend_, SLOT(UpdateCompilations())); // 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() { backend_->ReloadSettingsAsync(); watcher_->ReloadSettingsAsync(); } 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; foreach (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); } clementine-1.2.0+dfsg/src/library/library.h000066400000000000000000000036471223327513400206400ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 class Application; class Database; class LibraryBackend; class LibraryModel; class LibraryWatcher; class TaskManager; 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(); private: Application* app_; LibraryBackend* backend_; LibraryModel* model_; LibraryWatcher* watcher_; QThread* watcher_thread_; // 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.0+dfsg/src/library/librarybackend.cpp000066400000000000000000001020521223327513400224710ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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/database.h" #include "core/scopedtransaction.h" #include "core/tagreaderclient.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; ReloadSettings(); } 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::LoadDirectories() { DirectoryList dirs = GetAllDirectories(); QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); foreach (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(); 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", canonical_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); foreach (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; foreach (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); foreach (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); foreach (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) { QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); QSqlQuery remove(QString("UPDATE %1 SET unavailable = 1 WHERE ROWID = :id") .arg(songs_table_), db); ScopedTransaction transaction(&db); foreach (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; foreach (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; foreach(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; QMutexLocker l(db_->Mutex()); QSqlDatabase db(db_->Connect()); QSqlQuery q(QString("UPDATE %1 SET rating = :rating" " WHERE ROWID = :id").arg(songs_table_), db); q.bindValue(":rating", rating); q.bindValue(":id", id); q.exec(); if (db_->CheckErrors(q)) return; Song new_song = GetSongById(id, db); emit SongsRatingChanged(SongList() << new_song); } 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(); } void LibraryBackend::ReloadSettingsAsync() { QMetaObject::invokeMethod(this, "ReloadSettings", Qt::QueuedConnection); } void LibraryBackend::ReloadSettings() { QSettings s; s.beginGroup(kSettingsGroup); // Statistics { bool save_statistics_in_file = s.value("save_statistics_in_file", false).toBool(); // Compare with previous value to know if we should connect, disconnect or nothing if (save_statistics_in_file_ && !save_statistics_in_file) { disconnect(this, SIGNAL(SongsStatisticsChanged(SongList)), TagReaderClient::Instance(), SLOT(UpdateSongsStatistics(SongList))); } else if (!save_statistics_in_file_ && save_statistics_in_file) { connect(this, SIGNAL(SongsStatisticsChanged(SongList)), TagReaderClient::Instance(), SLOT(UpdateSongsStatistics(SongList))); } // Save old value save_statistics_in_file_ = save_statistics_in_file; } // Rating { bool save_ratings_in_file = s.value("save_ratings_in_file", false).toBool(); // Compare with previous value to know if we should connect, disconnect or nothing if (save_ratings_in_file_ && !save_ratings_in_file) { disconnect(this, SIGNAL(SongsRatingChanged(SongList)), TagReaderClient::Instance(), SLOT(UpdateSongsRating(SongList))); } else if (!save_ratings_in_file_ && save_ratings_in_file) { connect(this, SIGNAL(SongsRatingChanged(SongList)), TagReaderClient::Instance(), SLOT(UpdateSongsRating(SongList))); } // Save old value save_ratings_in_file_ = save_ratings_in_file; } } clementine-1.2.0+dfsg/src/library/librarybackend.h000066400000000000000000000211141223327513400221350ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0) : 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 = 0); 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 DeleteAll(); void ReloadSettingsAsync(); 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); 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 ReloadSettings(); 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.0+dfsg/src/library/librarydirectorymodel.cpp000066400000000000000000000054421223327513400241340ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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/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 = new QStandardItem(dir.path); item->setData(dir.id, kIdRole); item->setIcon(dir_icon_); storage_ << boost::shared_ptr(new FilesystemMusicStorage(dir.path)); appendRow(item); } void LibraryDirectoryModel::DirectoryDeleted(const Directory &dir) { for (int i=0 ; idata(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.0+dfsg/src/library/librarydirectorymodel.h000066400000000000000000000031751223327513400236020ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); ~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.0+dfsg/src/library/libraryfilterwidget.cpp000066400000000000000000000230471223327513400236010ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "ui/iconloader.h" #include "ui/settingsdialog.h" #include #include #include #include #include #include LibraryFilterWidget::LibraryFilterWidget(QWidget *parent) : QWidget(parent), ui_(new Ui_LibraryFilterWidget), model_(NULL), group_by_dialog_(new GroupByDialog), filter_delay_(new QTimer(this)), filter_applies_to_model_(true), delay_behaviour_(DelayedOnLargeLibraries) { ui_->setupUi(this); 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 foreach (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::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.0+dfsg/src/library/libraryfilterwidget.h000066400000000000000000000056571223327513400232550ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); ~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); 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_; boost::scoped_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.0+dfsg/src/library/libraryfilterwidget.ui000066400000000000000000000050651223327513400234340ustar00rootroot00000000000000 LibraryFilterWidget 0 0 400 30 Form 0 0 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.0+dfsg/src/library/libraryitem.h000066400000000000000000000030651223327513400215110ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_(NULL) {} LibraryItem(Type type, LibraryItem* parent = NULL) : SimpleTreeItem(type, parent), container_level(-1), compilation_artist_node_(NULL) {} int container_level; Song metadata; QByteArray smart_playlist_data; LibraryItem* compilation_artist_node_; }; #endif // LIBRARYITEM_H clementine-1.2.0+dfsg/src/library/librarymodel.cpp000066400000000000000000001165071223327513400222140ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "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 "covers/albumcoverloader.h" #include "playlist/songmimedata.h" #include "smartplaylists/generator.h" #include "smartplaylists/generatormimedata.h" #include "smartplaylists/querygenerator.h" #include "ui/iconloader.h" #include #include #include #include #include #include #include #include #include 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; 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"), 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))); 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) { foreach (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_ == NULL) 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_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_YearAlbum: key = PrettyYearAlbum(qMax(0, song.year()), song.album()); break; case GroupBy_FileType: key = song.filetype(); 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. foreach (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_ = NULL; 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_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: return SortTextForYear(item->sort_text.toInt() / 10 * 10); case GroupBy_YearAlbum: return SortTextForYear(item->metadata.year()); 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_Grouping: case GroupBy_Genre: case GroupBy_AlbumArtist: case GroupBy_FileType: if (key == "0") return "0-9"; return key.toUpper(); case GroupBy_YearAlbum: if (key == "0000") return tr("Unknown"); return key.toUpper(); case GroupBy_Year: if (key == "0000") 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; foreach (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()) { foreach (LibraryItem* node, parents) { 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_ = NULL; 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 foreach (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; foreach (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; } // 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)); } 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; } 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: 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()) { foreach(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 foreach (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_ = NULL; root_ = new LibraryItem(this); root_->compilation_artist_node_ = NULL; 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_Grouping: q->SetColumnSpec("DISTINCT grouping"); break; case GroupBy_YearAlbum: q->SetColumnSpec("DISTINCT year, album"); break; case GroupBy_Year: q->SetColumnSpec("DISTINCT year"); break; case GroupBy_Genre: q->SetColumnSpec("DISTINCT genre"); break; case GroupBy_AlbumArtist: q->SetColumnSpec("DISTINCT effective_albumartist"); 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()); break; case GroupBy_Year: q->AddWhere("year", item->key); break; case GroupBy_Composer: q->AddWhere("composer", item->key); break; case GroupBy_Performer: q->AddWhere("performer", 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_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_ = NULL; 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; 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->key = PrettyYearAlbum(year, item->metadata.album()); item->sort_text = SortTextForYear(year) + item->metadata.album(); break; case GroupBy_Year: year = qMax(0, row.value(0).toInt()); item->key = QString::number(year); item->sort_text = SortTextForYear(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_FileType: item->metadata.set_filetype(Song::FileType(row.value(0).toInt())); item->key = item->metadata.TextForFiletype(); 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; 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 = SortTextForYear(year) + s.album(); break; case GroupBy_Year: year = qMax(0, s.year()); item->key = QString::number(year); item->sort_text = SortTextForYear(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_FileType: item->metadata.set_filetype(s.filetype()); item->key = s.TextForFiletype(); 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"; } return artist; } QString LibraryModel::SortTextForYear(int year) { QString str = QString::number(year); return QString("0").repeated(qMax(0, 4 - str.length())) + str; } 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 NULL; // Special case: a smart playlist was dragged if (IndexToItem(indexes.first())->type == LibraryItem::Type_SmartPlaylist) { GeneratorPtr generator = CreateGenerator(indexes.first()); if (!generator) return NULL; 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_; foreach (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(), boost::bind( &LibraryModel::CompareItems, this, _1, _2)); foreach (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; foreach (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) { foreach (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 ; idisplay_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; foreach (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.0+dfsg/src/library/librarymodel.h000066400000000000000000000231031223327513400216460ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "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" #include 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 = 0); ~LibraryModel(); static const char* kSmartPlaylistsMimeType; static const char* kSmartPlaylistsSettingsGroup; static const char* kSmartPlaylistsArray; static const int kSmartPlaylistsVersion; static const int kPrettyCoverSize; 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, }; 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 SortTextForYear(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_; 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.0+dfsg/src/library/libraryplaylistitem.cpp000066400000000000000000000033011223327513400236170ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/library/libraryplaylistitem.h000066400000000000000000000024761223327513400233000ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/library/libraryquery.cpp000066400000000000000000000131771223327513400222600ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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. // Split on whitespace QStringList tokens(options.filter().split(QRegExp("\\s+"))); QString query; foreach (QString token, tokens) { token.remove('('); token.remove(')'); token.remove('"'); if (token.contains(':')) query += "fts" + 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; foreach(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) { 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 foreach (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.0+dfsg/src/library/libraryquery.h000066400000000000000000000066421223327513400217240ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/library/librarysettingspage.cpp000066400000000000000000000125311223327513400236010ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/library/librarysettingspage.h000066400000000000000000000025201223327513400232430ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/library/librarysettingspage.ui000066400000000000000000000143071223327513400234370ustar00rootroot00000000000000 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.0+dfsg/src/library/libraryview.cpp000066400000000000000000000566101223327513400220640ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "libraryfilterwidget.h" #include "librarymodel.h" #include "libraryview.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" #include #include #include #include #include #include #include #include #include #include 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 QPen line_pen(opt.palette.color(QPalette::Dark)); 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_(NULL), filter_(NULL), total_song_count_(-1), nomusic_(":nomusic.png"), context_menu_(NULL), 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); foreach (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_ != NULL) { 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; foreach(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; foreach (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; foreach (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) { foreach (const QString& s, other_artists) { albums.insert(album, s); } } } } foreach (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. boost::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 ; rowrowCount() ; ++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; foreach (const Song& song, GetSelectedSongs()) { urls << song.url(); } Utilities::OpenInFileBrowser(urls); } clementine-1.2.0+dfsg/src/library/libraryview.h000066400000000000000000000076201223327513400215260ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "core/song.h" #include "ui/edittagdialog.h" #include "widgets/autoexpandingtreeview.h" #include #include 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 = 0); ~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_; boost::scoped_ptr organise_dialog_; boost::scoped_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.0+dfsg/src/library/libraryviewcontainer.cpp000066400000000000000000000032061223327513400237600ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/library/libraryviewcontainer.h000066400000000000000000000022651223327513400234310ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); ~LibraryViewContainer(); LibraryFilterWidget* filter() const; LibraryView* view() const; void ReloadSettings(); private: Ui_LibraryViewContainer* ui_; }; #endif // LIBRARYVIEWCONTAINER_H clementine-1.2.0+dfsg/src/library/libraryviewcontainer.ui000066400000000000000000000022041223327513400236100ustar00rootroot00000000000000 LibraryViewContainer 0 0 400 300 Form 0 0 LibraryFilterWidget QWidget
library/libraryfilterwidget.h
1
LibraryView QWidget
library/libraryview.h
1
clementine-1.2.0+dfsg/src/library/librarywatcher.cpp000066400000000000000000000562121223327513400225450ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_(NULL), task_manager_(NULL), 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)) { Utilities::SetThreadIOPriority(Utilities::IOPRIO_CLASS_IDLE); 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 (!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 foreach (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; foreach (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_)); foreach (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; foreach (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()); foreach (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(); foreach (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); foreach (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 foreach (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 || matching_song.is_unavailable(); // 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); } } } 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); foreach (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 foreach (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()); foreach (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; foreach(const Song& song, old_sections) { sections_map[song.beginning_nanosec()] = song; } QSet used_ids; // update every song that's in the cue and library foreach(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 foreach(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) { foreach(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! foreach(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 foreach (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 foreach (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() { foreach (int dir, rescan_queue_.keys()) { if (stop_requested_) return; ScanTransaction transaction(this, dir, false); transaction.AddToProgressMax(rescan_queue_[dir].count()); foreach (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; foreach(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 foreach(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; foreach (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(); foreach(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 foreach (const Directory& dir, watched_dirs_.values()) { SubdirectoryList subdirs = backend_->SubdirsInDirectory(dir.id); foreach (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) { foreach (const Directory& dir, watched_dirs_.values()) { ScanTransaction transaction(this, dir.id, incremental, ignore_mtimes); SubdirectoryList subdirs(transaction.GetAllSubdirs()); transaction.AddToProgressMax(subdirs.count()); foreach (const Subdirectory& subdir, subdirs) { if (stop_requested_) return; ScanSubdirectory(subdir.path, subdir, &transaction); } } emit CompilationsNeedUpdating(); } clementine-1.2.0+dfsg/src/library/librarywatcher.h000066400000000000000000000171451223327513400222140ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); 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 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 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.0+dfsg/src/library/sqlrow.cpp000066400000000000000000000021131223327513400210410ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/library/sqlrow.h000066400000000000000000000022661223327513400205170ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/main.cpp000066400000000000000000000350601223327513400170010ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Clementine. If not, see . */ #include #ifdef Q_OS_WIN32 # define _WIN32_WINNT 0x0600 # include # include #endif // Q_OS_WIN32 #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/discogscoverprovider.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 #include #include #include #include #include #include #include #include #include #include using boost::scoped_ptr; #include #ifdef HAVE_SPOTIFY_DOWNLOADER #include #endif #ifdef Q_OS_DARWIN #include #include #endif #ifdef HAVE_LIBLASTFM #include "internet/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. #ifdef HAVE_STATIC_SQLITE # include Q_IMPORT_PLUGIN(qsqlite) #endif 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, NULL, 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 } #ifdef HAVE_GIO # undef signals // Clashes with GIO, and not needed in this file # include 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()); } } #endif void ParseAProto() { const QByteArray data = QByteArray::fromHex( "08001a8b010a8801b2014566696c653a2f2f2f453a2f4d7573696b2f28414c42554d2" "9253230476f74616e25323050726f6a6563742532302d253230416d6269656e742532" "304c6f756e67652e6d786dba012a28414c42554d2920476f74616e2050726f6a65637" "4202d20416d6269656e74204c6f756e67652e6d786dc001c7a7efd104c801bad685e4" "04d001eeca32"); pb::tagreader::Message message; message.ParseFromArray(data.constData(), data.size()); } 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(); #endif QCoreApplication::setApplicationName("Clementine"); QCoreApplication::setApplicationVersion(CLEMENTINE_VERSION_DISPLAY); QCoreApplication::setOrganizationName("Clementine"); QCoreApplication::setOrganizationDomain("clementine-player.org"); #ifdef Q_OS_DARWIN // Must happen after QCoreApplication::setOrganizationName(). setenv("XDG_CONFIG_HOME", Utilities::GetConfigPath(Utilities::Path_Root).toLocal8Bit().constData(), 1); #endif // 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(); #ifdef HAVE_LIBLASTFM lastfm::ws::ApiKey = LastFMService::kApiKey; lastfm::ws::SharedSecret = LastFMService::kSecret; lastfm::setNetworkAccessManager(new NetworkAccessManager); #endif 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); 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; 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 } } // Initialise logging logging::Init(); logging::SetLevels(options.log_levels()); g_log_set_default_handler(reinterpret_cast(&logging::GLog), NULL); // 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(NULL); 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 #ifdef HAVE_SPOTIFY_DOWNLOADER QCA::Initializer qca_initializer; #endif // Resources Q_INIT_RESOURCE(data); Q_INIT_RESOURCE(translations); // Grooveshark uses GoDaddy to sign its SSL certificates, which are in turn // signed by a ValiCert CA. This CA certificate isn't installed by default // in Windows, it's only added by windows update, or manually browsing to a // website with a certificate signed by ValiCert. Here we explicitly add // that CA to the default list used by QSslSocket, so it always works in // Clementine. QSslSocket::addDefaultCaCertificates( QSslCertificate::fromPath(":/grooveshark-valicert-ca.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 DiscogsCoverProvider); 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 scoped_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.0+dfsg/src/moodbar/000077500000000000000000000000001223327513400167705ustar00rootroot00000000000000clementine-1.2.0+dfsg/src/moodbar/moodbarcontroller.cpp000066400000000000000000000047551223327513400232360ustar00rootroot00000000000000/* 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 = NULL; 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; } emit CurrentMoodbarDataChanged(pipeline->data()); } clementine-1.2.0+dfsg/src/moodbar/moodbarcontroller.h000066400000000000000000000024201223327513400226660ustar00rootroot00000000000000/* 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 = 0); 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.0+dfsg/src/moodbar/moodbaritemdelegate.cpp000066400000000000000000000165021223327513400234750ustar00rootroot00000000000000/* 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 = NULL; 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) { foreach (const QPersistentModelIndex& index, data->indexes_) { if (index.isValid()) { return false; } } data_.remove(url); return true; } void MoodbarItemDelegate::ReloadAllColors() { foreach (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. foreach (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.0+dfsg/src/moodbar/moodbaritemdelegate.h000066400000000000000000000045231223327513400231420ustar00rootroot00000000000000/* 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 = 0); 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.0+dfsg/src/moodbar/moodbarloader.cpp000066400000000000000000000126371223327513400223170ustar00rootroot00000000000000/* 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" 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()); foreach (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? boost::scoped_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); 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()); } 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.0+dfsg/src/moodbar/moodbarloader.h000066400000000000000000000037621223327513400217630ustar00rootroot00000000000000/* 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 = 0); ~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.0+dfsg/src/moodbar/moodbarpipeline.cpp000066400000000000000000000127021223327513400226470ustar00rootroot00000000000000/* 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/utilities.h" bool MoodbarPipeline::sIsAvailable = false; MoodbarPipeline::MoodbarPipeline(const QUrl& local_filename) : QObject(NULL), local_filename_(local_filename), pipeline_(NULL), convert_element_(NULL), 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); factory = gst_element_factory_find("moodbar"); 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(), NULL); 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* fftwspectrum = CreateElement("fftwspectrum"); GstElement* moodbar = CreateElement("moodbar"); GstElement* appsink = CreateElement("appsink"); if (!decodebin || !convert_element_ || !fftwspectrum || !moodbar || !appsink) { pipeline_ = NULL; emit Finished(false); return; } // Join them together gst_element_link_many(convert_element_, fftwspectrum, moodbar, appsink, NULL); // Set properties g_object_set(decodebin, "uri", local_filename_.toEncoded().constData(), NULL); g_object_set(fftwspectrum, "def-size", 2048, "def-step", 1024, "hiquality", true, NULL); g_object_set(moodbar, "height", 1, "max-width", 1000, NULL); // Connect signals CHECKED_GCONNECT(decodebin, "pad-added", &NewPadCallback, this); gst_bus_set_sync_handler(gst_pipeline_get_bus(GST_PIPELINE(pipeline_)), BusCallbackSync, this); // Set appsink callbacks GstAppSinkCallbacks callbacks; memset(&callbacks, 0, sizeof(callbacks)); callbacks.new_buffer = NewBufferCallback; gst_app_sink_set_callbacks(reinterpret_cast(appsink), &callbacks, this, NULL); // 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); } GstFlowReturn MoodbarPipeline::NewBufferCallback(GstAppSink* app_sink, gpointer data) { MoodbarPipeline* self = reinterpret_cast(data); GstBuffer* buffer = gst_app_sink_pull_buffer(app_sink); self->data_.append(reinterpret_cast(buffer->data), buffer->size); gst_buffer_unref(buffer); return GST_FLOW_OK; } 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; emit Finished(success); } void MoodbarPipeline::Cleanup() { Q_ASSERT(QThread::currentThread() == thread()); Q_ASSERT(QThread::currentThread() != qApp->thread()); if (pipeline_) { gst_bus_set_sync_handler(gst_pipeline_get_bus(GST_PIPELINE(pipeline_)), NULL, NULL); gst_element_set_state(pipeline_, GST_STATE_NULL); gst_object_unref(pipeline_); pipeline_ = NULL; } } clementine-1.2.0+dfsg/src/moodbar/moodbarpipeline.h000066400000000000000000000035651223327513400223230ustar00rootroot00000000000000/* 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 // 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; QUrl local_filename_; GstElement* pipeline_; GstElement* convert_element_; bool success_; QByteArray data_; }; #endif // MOODBARPIPELINE_H clementine-1.2.0+dfsg/src/moodbar/moodbarproxystyle.cpp000066400000000000000000000254061223327513400233110ustar00rootroot00000000000000/* 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_(NULL), show_moodbar_action_(NULL), style_action_group_(NULL) { 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(); 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(); } 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(); painter->drawPixmap(option->rect, moodbar_pixmap_); DrawArrow(option, painter); break; } } void MoodbarProxyStyle::EnsureMoodbarRendered() { 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()); moodbar_pixmap_dirty_ = false; } } 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: return opt->rect.adjusted(kMarginSize, kMarginSize, -kMarginSize, -kMarginSize); case SC_SliderHandle: { const QStyleOptionSlider* slider_opt = qstyleoption_cast(opt); const int x = (slider_opt->sliderValue - slider_opt->minimum) * (opt->rect.width() - kArrowWidth) / (slider_opt->maximum - slider_opt->minimum); 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) { QRect rect(QPoint(0, 0), size); QRect border_rect(rect); border_rect.adjust(kMarginSize, kMarginSize, -kMarginSize, -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)); p.drawRect(rect.adjusted(1, 1, -2, -2)); 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 ; iaddAction(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 foreach (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.0+dfsg/src/moodbar/moodbarproxystyle.h000066400000000000000000000056671223327513400227650ustar00rootroot00000000000000/* 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(); void DrawArrow(const QStyleOptionSlider* option, QPainter* painter) const; void ShowContextMenu(const QPoint& pos); static QPixmap MoodbarPixmap(const ColorVector& colors, const QSize& size, const QPalette& palette); private slots: void ReloadSettings(); void FaderValueChanged(qreal value); void ChangeStyle(QAction* action); private: 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.0+dfsg/src/moodbar/moodbarrenderer.cpp000066400000000000000000000124731223327513400226550ustar00rootroot00000000000000/* 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 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 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; xsetPen(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.0+dfsg/src/moodbar/moodbarrenderer.h000066400000000000000000000037661223327513400223270ustar00rootroot00000000000000/* 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.0+dfsg/src/musicbrainz/000077500000000000000000000000001223327513400176735ustar00rootroot00000000000000clementine-1.2.0+dfsg/src/musicbrainz/acoustidclient.cpp000066400000000000000000000063261223327513400234200ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "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") << 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(); } void AcoustidClient::RequestFinished(QNetworkReply* reply, int id) { reply->deleteLater(); requests_.remove(id); if (reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() != 200) { emit Finished(id, QString()); return; } QJson::Parser parser; bool ok = false; QVariantMap result = parser.parse(reply, &ok).toMap(); if (!ok) { emit Finished(id, QString()); return; } QString status = result["status"].toString(); if (status != "ok") { emit Finished(id, QString()); return; } QVariantList results = result["results"].toList(); foreach (const QVariant& v, results) { QVariantMap r = v.toMap(); if (r.contains("recordings")) { QVariantList recordings = r["recordings"].toList(); foreach (const QVariant& recording, recordings) { QVariantMap o = recording.toMap(); if (o.contains("id")) { emit Finished(id, o["id"].toString()); return; } } } } emit Finished(id, QString()); } clementine-1.2.0+dfsg/src/musicbrainz/acoustidclient.h000066400000000000000000000045101223327513400230560ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); // 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 QString& mbid); 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.0+dfsg/src/musicbrainz/chromaprinter.cpp000066400000000000000000000164441223327513400232650ustar00rootroot00000000000000/* 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" #include "core/timeconstants.h" static const int kDecodeRate = 11025; static const int kDecodeChannels = 1; Chromaprinter::Chromaprinter(const QString& filename) : filename_(filename), event_loop_(NULL), convert_element_(NULL), finishing_(false) { } 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); GMainContext* context = g_main_context_new(); g_main_context_push_thread_default(context); event_loop_ = g_main_loop_new(context, FALSE); pipeline_ = gst_pipeline_new("pipeline"); GstElement* src = CreateElement("filesrc", pipeline_); GstElement* decode = CreateElement("decodebin2", 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, NULL); gst_element_link_many(convert, resample, NULL); // Chromaprint expects mono floats at a sample rate of 11025Hz. GstCaps* caps = gst_caps_new_simple( "audio/x-raw-int", "width", G_TYPE_INT, 16, "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_buffer = NewBufferCallback; gst_app_sink_set_callbacks(reinterpret_cast(sink), &callbacks, this, NULL); g_object_set(G_OBJECT(sink), "sync", FALSE, NULL); g_object_set(G_OBJECT(sink), "emit-signals", TRUE, NULL); // Set the filename g_object_set(src, "location", filename_.toUtf8().constData(), NULL); // Connect signals CHECKED_GCONNECT(decode, "new-decoded-pad", &NewPadCallback, this); gst_bus_set_sync_handler(gst_pipeline_get_bus(GST_PIPELINE(pipeline_)), BusCallbackSync, this); guint bus_callback_id = gst_bus_add_watch(gst_pipeline_get_bus(GST_PIPELINE(pipeline_)), BusCallback, this); QTime time; time.start(); // Start playing gst_element_set_state(pipeline_, GST_STATE_PLAYING); g_main_loop_run(event_loop_); g_main_loop_unref(event_loop_); g_main_context_unref(context); int decode_time = time.restart(); buffer_.close(); 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 = NULL; int size = 0; int ret = chromaprint_get_raw_fingerprint(chromaprint, &fprint, &size); QByteArray fingerprint; if (ret == 1) { void* encoded = NULL; 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_buffer = NULL; gst_app_sink_set_callbacks(reinterpret_cast(sink), &callbacks, this, NULL); gst_bus_set_sync_handler(gst_pipeline_get_bus(GST_PIPELINE(pipeline_)), NULL, NULL); g_source_remove(bus_callback_id); gst_element_set_state(pipeline_, GST_STATE_NULL); gst_object_unref(pipeline_); return fingerprint; } void Chromaprinter::NewPadCallback(GstElement*, GstPad* pad, gboolean, 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); } void Chromaprinter::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" << filename_ << ":" << message; } gboolean Chromaprinter::BusCallback(GstBus*, GstMessage* msg, gpointer data) { Chromaprinter* instance = reinterpret_cast(data); switch (GST_MESSAGE_TYPE(msg)) { case GST_MESSAGE_ERROR: instance->ReportError(msg); g_main_loop_quit(instance->event_loop_); break; default: break; } return GST_BUS_DROP; } GstBusSyncReply Chromaprinter::BusCallbackSync(GstBus*, GstMessage* msg, gpointer data) { Chromaprinter* instance = reinterpret_cast(data); switch (GST_MESSAGE_TYPE(msg)) { case GST_MESSAGE_EOS: g_main_loop_quit(instance->event_loop_); break; case GST_MESSAGE_ERROR: instance->ReportError(msg); g_main_loop_quit(instance->event_loop_); break; default: break; } return GST_BUS_PASS; } GstFlowReturn Chromaprinter::NewBufferCallback(GstAppSink* app_sink, gpointer self) { Chromaprinter* me = reinterpret_cast(self); if (me->finishing_) { return GST_FLOW_OK; } GstBuffer* buffer = gst_app_sink_pull_buffer(app_sink); me->buffer_.write(reinterpret_cast(buffer->data), buffer->size); gst_buffer_unref(buffer); gint64 pos = 0; GstFormat format = GST_FORMAT_TIME; gboolean ret = gst_element_query_position(me->pipeline_, &format, &pos); if (ret && pos > 30 * kNsecPerSec) { me->finishing_ = true; g_main_loop_quit(me->event_loop_); } return GST_FLOW_OK; } clementine-1.2.0+dfsg/src/musicbrainz/chromaprinter.h000066400000000000000000000042471223327513400227300ustar00rootroot00000000000000/* 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 #include class QEventLoop; 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 = NULL); void ReportError(GstMessage* message); static void NewPadCallback(GstElement*, GstPad* pad, gboolean, gpointer data); static gboolean BusCallback(GstBus*, GstMessage* msg, gpointer data); static GstBusSyncReply BusCallbackSync(GstBus*, GstMessage* msg, gpointer data); static GstFlowReturn NewBufferCallback(GstAppSink* app_sink, gpointer self); private: QString filename_; GMainLoop* event_loop_; GstElement* convert_element_; GstElement* pipeline_; QBuffer buffer_; bool finishing_; }; #endif // CHROMAPRINTER_H clementine-1.2.0+dfsg/src/musicbrainz/musicbrainzclient.cpp000066400000000000000000000154721223327513400241350ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = "http://musicbrainz.org/ws/2/recording/"; const char* MusicBrainzClient::kDiscUrl = "http://musicbrainz.org/ws/2/discid/"; const char* MusicBrainzClient::kDateRegex = "^[12]\\d{3}"; const int MusicBrainzClient::kDefaultTimeout = 5000; // msec MusicBrainzClient::MusicBrainzClient(QObject* parent) : QObject(parent), network_(new NetworkAccessManager(this)), timeouts_(new NetworkTimeouts(kDefaultTimeout, this)) { } void MusicBrainzClient::Start(int id, const QString& mbid) { typedef QPair Param; 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)), reply, id); requests_[id] = reply; timeouts_->AddReply(reply); } 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(QNetworkReply*)), reply); timeouts_->AddReply(reply); } void MusicBrainzClient::Cancel(int id) { delete requests_.take(id); } void MusicBrainzClient::CancelAll() { qDeleteAll(requests_.values()); requests_.clear(); } void MusicBrainzClient::DiscIdRequestFinished(QNetworkReply* reply) { reply->deleteLater(); ResultList ret; QString artist; QString album; if (reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() != 200) { emit Finished(artist, album, ret); return; } // Parse xml result: // -get title // -get artist // -get all the tracks' tags 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 == "artist") { ParseArtist(&reader, &artist); } else if (name == "track-list") { break; } } } while (!reader.atEnd()) { QXmlStreamReader::TokenType token = reader.readNext(); if (token == QXmlStreamReader::StartElement && reader.name() == "recording") { ResultList tracks = ParseTrack(&reader); foreach (const Result& track, tracks) { if (!track.title_.isEmpty()) { ret << track; } } } else if (token == QXmlStreamReader::EndElement && reader.name() == "track-list") { break; } } emit Finished(artist, album, UniqueResults(ret)); } void MusicBrainzClient::RequestFinished(QNetworkReply* reply, int id) { reply->deleteLater(); requests_.remove(id); ResultList ret; if (reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() != 200) { emit Finished(id, ret); return; } QXmlStreamReader reader(reply); while (!reader.atEnd()) { if (reader.readNext() == QXmlStreamReader::StartElement && reader.name() == "recording") { ResultList tracks = ParseTrack(&reader); foreach (const Result& track, tracks) { if (!track.title_.isEmpty()) { ret << track; } } } } emit Finished(id, UniqueResults(ret)); } 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") { 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 { foreach (const Release& release, releases) { ret << release.CopyAndMergeInto(result); } } return ret; } void MusicBrainzClient::ParseArtist(QXmlStreamReader* reader, QString* artist) { while (!reader->atEnd()) { QXmlStreamReader::TokenType type = reader->readNext(); if (type == QXmlStreamReader::StartElement && reader->name() == "name") { *artist = reader->readElementText(); } if (type == QXmlStreamReader::EndElement && reader->name() == "artist") { 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 == "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) { ResultList ret = QSet::fromList(results).toList(); qSort(ret); return ret; } clementine-1.2.0+dfsg/src/musicbrainz/musicbrainzclient.h000066400000000000000000000102171223327513400235720ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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: MusicBrainzClient(QObject* parent = 0); 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 QString& 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: void RequestFinished(QNetworkReply* reply, int id); void DiscIdRequestFinished(QNetworkReply* reply); private: struct Release { Release() : track_(0), year_(0) {} Result CopyAndMergeInto(const Result& orig) const { Result ret(orig); ret.album_ = album_; ret.track_ = track_; ret.year_ = year_; return ret; } QString album_; int track_; int year_; }; static ResultList ParseTrack(QXmlStreamReader* reader); static void ParseArtist(QXmlStreamReader* reader, QString* artist); static Release ParseRelease(QXmlStreamReader* reader); static ResultList UniqueResults(const ResultList& results); private: static const char* kTrackUrl; static const char* kDiscUrl; static const char* kDateRegex; static const int kDefaultTimeout; QNetworkAccessManager* network_; NetworkTimeouts* timeouts_; QMap requests_; }; 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.0+dfsg/src/musicbrainz/tagfetcher.cpp000066400000000000000000000070621223327513400225200ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_(NULL), acoustid_client_(new AcoustidClient(this)), musicbrainz_client_(new MusicBrainzClient(this)) { connect(acoustid_client_, SIGNAL(Finished(int,QString)), SLOT(PuidFound(int,QString))); 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))); foreach (const Song& song, songs) { emit Progress(song, tr("Fingerprinting song")); } } void TagFetcher::Cancel() { if (fingerprint_watcher_) { fingerprint_watcher_->cancel(); delete fingerprint_watcher_; fingerprint_watcher_ = NULL; } 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::PuidFound(int index, const QString& puid) { if (index >= songs_.count()) { return; } const Song& song = songs_[index]; if (puid.isEmpty()) { emit ResultAvailable(song, SongList()); return; } emit Progress(song, tr("Downloading metadata")); musicbrainz_client_->Start(index, puid); } void TagFetcher::TagsFetched(int index, const MusicBrainzClient::ResultList& results) { if (index >= songs_.count()) { return; } const Song& original_song = songs_[index]; SongList songs_guessed; foreach (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.0+dfsg/src/musicbrainz/tagfetcher.h000066400000000000000000000033241223327513400221620ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); 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 PuidFound(int index, const QString& puid); 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.0+dfsg/src/networkremote/000077500000000000000000000000001223327513400202525ustar00rootroot00000000000000clementine-1.2.0+dfsg/src/networkremote/avahi.cpp000066400000000000000000000065541223327513400220600ustar00rootroot00000000000000#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.0+dfsg/src/networkremote/avahi.h000066400000000000000000000004061223327513400215130ustar00rootroot00000000000000#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.0+dfsg/src/networkremote/bonjour.h000066400000000000000000000007501223327513400221030ustar00rootroot00000000000000#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.0+dfsg/src/networkremote/bonjour.mm000066400000000000000000000032121223327513400222610ustar00rootroot00000000000000#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.0+dfsg/src/networkremote/incomingdataparser.cpp000066400000000000000000000227431223327513400246400ustar00rootroot00000000000000/* 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 "engines/enginebase.h" #include "internet/internetmodel.h" #include "playlist/playlistmanager.h" #include "playlist/playlistsequence.h" #include "playlist/playlist.h" #ifdef HAVE_LIBLASTFM # include "internet/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(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()), InternetModel::Service(), SLOT(Love())); connect(this, SIGNAL(Ban()), InternetModel::Service(), SLOT(Ban())); #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); 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: emit SendSongs(msg.request_download_songs(), client); break; case pb::remote::SONG_OFFER_RESPONSE: emit ResponseSongOffer(client, msg.response_song_offer().accepted()); break; case pb::remote::GET_LIBRARY: emit SendLibrary(client); break; case pb::remote::RATE_SONG: RateSong(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(); // Extract urls QList urls; for (auto it = request.urls().begin(); it != request.urls().end(); ++it) { urls << QUrl(QString::fromStdString(*it)); } // Insert the urls emit InsertUrls(request.playlist_id(), urls, 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; std::copy(request.songs().begin(), request.songs().end(), songs.begin()); // Insert the urls emit RemoveSongs(request.playlist_id(), songs); } void IncomingDataParser::ClientConnect(const pb::remote::Message& msg) { // Always sned the Clementine infos emit SendClementineInfo(); // Check if we should send the first data 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); } clementine-1.2.0+dfsg/src/networkremote/incomingdataparser.h000066400000000000000000000041531223327513400243000ustar00rootroot00000000000000#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 RemoveSongs(int id, const QList& indices); void SeekTo(int seconds); void SendSongs(const pb::remote::RequestDownloadSongs& request, RemoteClient* client); void ResponseSongOffer(RemoteClient* client, bool accepted); void SendLibrary(RemoteClient* client); void RateCurrentSong(double); 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); 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); }; #endif // INCOMINGDATAPARSER_H clementine-1.2.0+dfsg/src/networkremote/networkremote.cpp000066400000000000000000000202061223327513400236630ustar00rootroot00000000000000/* 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; 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(SendSongs(pb::remote::RequestDownloadSongs,RemoteClient*)), outgoing_data_creator_.get(), SLOT(SendSongs(pb::remote::RequestDownloadSongs,RemoteClient*))); connect(incoming_data_parser_.get(), SIGNAL(ResponseSongOffer(RemoteClient*, bool)), outgoing_data_creator_.get(), SLOT(ResponseSongOffer(RemoteClient*, bool))); connect(incoming_data_parser_.get(), SIGNAL(SendLibrary(RemoteClient*)), outgoing_data_creator_.get(), SLOT(SendLibrary(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(); } 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))); } } clementine-1.2.0+dfsg/src/networkremote/networkremote.h000066400000000000000000000022121223327513400233250ustar00rootroot00000000000000#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; explicit NetworkRemote(Application* app, QObject* parent = 0); ~NetworkRemote(); public slots: void SetupServer(); void StartServer(); void ReloadSettings(); void AcceptConnection(); private: boost::scoped_ptr server_; boost::scoped_ptr server_ipv6_; boost::scoped_ptr incoming_data_parser_; boost::scoped_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.0+dfsg/src/networkremote/networkremotehelper.cpp000066400000000000000000000036121223327513400250650ustar00rootroot00000000000000/* 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 = NULL; 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 NULL; } return sInstance; } clementine-1.2.0+dfsg/src/networkremote/networkremotehelper.h000066400000000000000000000010411223327513400245240ustar00rootroot00000000000000#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.0+dfsg/src/networkremote/outgoingdatacreator.cpp000066400000000000000000000567701223327513400250420ustar00rootroot00000000000000/* 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 "library/librarybackend.h" #include #include #include "core/database.h" const quint32 OutgoingDataCreator::kFileChunkSize = 100000; // in Bytes OutgoingDataCreator::OutgoingDataCreator(Application* app) : app_(app), 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))); foreach (SongInfoProvider* provider, provider_list_) { fetcher_->AddProvider(provider); } CheckEnabledProviders(); } 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); foreach (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; foreach (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 foreach (SongInfoProvider* provider, fetcher_->providers()) { if (qobject_cast(provider) && !ordered_providers.contains(provider)) { provider->set_enabled(false); } } } SongInfoProvider* OutgoingDataCreator::ProviderByName(const QString& name) const { foreach (SongInfoProvider* provider, fetcher_->providers()) { if (UltimateLyricsProvider* lyrics = qobject_cast(provider)) { if (lyrics->name() == name) return provider; } } return NULL; } void OutgoingDataCreator::SendDataToClients(pb::remote::Message* msg) { // Check if we have clients to send data to if (clients_->empty()) { return; } RemoteClient* client; foreach(client, *clients_) { // Do not send data to downloaders if (client->isDownloader()) { if (client->State() != QTcpSocket::ConnectedState) { clients_->removeAt(clients_->indexOf(client)); download_queue_.remove(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::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. foreach (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; current_image_ = img; if (!clients_->empty()) { // 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_, img, 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()); // 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; } 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); const int position = std::floor( float(app_->player()->engine()->position_nanosec()) / kNsecPerSec + 0.5); msg.mutable_response_update_track_position()->set_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(); foreach (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::SendSongs(const pb::remote::RequestDownloadSongs &request, RemoteClient* client) { if (!download_queue_.contains(client)) { download_queue_.insert(client, QQueue() ); } switch (request.download_item()) { case pb::remote::CurrentItem: { DownloadItem item(current_song_, 1 , 1); download_queue_[client].append(item); break; } case pb::remote::ItemAlbum: SendAlbum(client, current_song_); break; case pb::remote::APlaylist: SendPlaylist(client, request.playlist_id()); break; default: break; } // Send first file OfferNextSong(client); } void OutgoingDataCreator::OfferNextSong(RemoteClient *client) { if (!download_queue_.contains(client)) return; pb::remote::Message msg; if (download_queue_.value(client).isEmpty()) { // We sent all songs, tell the client the queue is empty msg.set_type(pb::remote::DOWNLOAD_QUEUE_EMPTY); } else { // Get the item and send the single song DownloadItem item = download_queue_[client].head(); msg.set_type(pb::remote::SONG_FILE_CHUNK); pb::remote::ResponseSongFileChunk* chunk = msg.mutable_response_song_file_chunk(); // 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_); CreateSong(item.song_, QImage() , -1, chunk->mutable_song_metadata()); } client->SendData(&msg); } void OutgoingDataCreator::ResponseSongOffer(RemoteClient *client, bool accepted) { if (!download_queue_.contains(client)) return; if (download_queue_.value(client).isEmpty()) return; // Get the item and send the single song DownloadItem item = download_queue_[client].dequeue(); if (accepted) SendSingleSong(client, item.song_, item.song_no_, item.song_count_); // And offer the next song OfferNextSong(client); } void OutgoingDataCreator::SendSingleSong(RemoteClient* client, const Song &song, int song_no, int song_count) { // Only local files!!! if (!(song.url().scheme() == "file")) return; // Calculate the number of chunks int chunk_count = qRound((song.filesize() / kFileChunkSize) + 0.5); int chunk_number = 1; // Open the file QFile file(song.url().toLocalFile()); 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; 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(song_count); chunk->set_file_number(song_no); chunk->set_size(file.size()); chunk->set_data(data.data(), data.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(); CreateSong( song, null_image, i, msg.mutable_response_song_file_chunk()->mutable_song_metadata()); } // Send data directly to the client client->SendData(&msg); // Clear working data chunk->Clear(); data.clear(); chunk_number++; } file.close(); } void OutgoingDataCreator::SendAlbum(RemoteClient *client, const Song &song) { // No streams! if (song.url().scheme() != "file") return; SongList album = app_->library_backend()->GetSongsByAlbum(song.album()); foreach (Song s, album) { DownloadItem item(s, album.indexOf(s)+1, album.size()); download_queue_[client].append(item); } } void OutgoingDataCreator::SendPlaylist(RemoteClient *client, 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; foreach (Song s, song_list) { if (s.url().scheme() == "file") { count++; } } foreach (Song s, song_list) { // Only local files! if (s.url().scheme() == "file") { DownloadItem item(s, song_list.indexOf(s)+1, count); download_queue_[client].append(item); } } } 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); app_->database()->AttachDatabase("songs_export", adb); QSqlDatabase db(app_->database()->Connect()); // Copy the content of the song table to this temporary database QSqlQuery q(QString("create table songs_export.songs as SELECT * FROM songs;"), db); q.exec(); if (app_->database()->CheckErrors(q)) return; // Detach the database app_->database()->DetachDatabase("songs_export"); // Open the file QFile file(temp_file_name); 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()); // Send data directly to the client client->SendData(&msg); // Clear working data chunk->Clear(); data.clear(); chunk_number++; } // Remove temporary file file.remove(); } clementine-1.2.0+dfsg/src/networkremote/outgoingdatacreator.h000066400000000000000000000065461223327513400245030ustar00rootroot00000000000000#ifndef OUTGOINGDATACREATOR_H #define OUTGOINGDATACREATOR_H #include #include #include #include #include #include #include "core/player.h" #include "core/application.h" #include "engines/enginebase.h" #include "engines/engine_fwd.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" #include typedef QList ProviderList; 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 OutgoingDataCreator : public QObject { Q_OBJECT public: OutgoingDataCreator(Application* app); ~OutgoingDataCreator(); static const quint32 kFileChunkSize; void SetClients(QList* clients); 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 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 SendSongs(const pb::remote::RequestDownloadSongs& request, RemoteClient* client); void ResponseSongOffer(RemoteClient* client, bool accepted); void SendLibrary(RemoteClient* client); 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_; QMap > download_queue_; boost::scoped_ptr ultimate_reader_; ProviderList provider_list_; QMap results_; SongInfoFetcher* fetcher_; void SendDataToClients(pb::remote::Message* msg); void SetEngineState(pb::remote::ResponseClementineInfo* msg); void CreateSong( const Song& song, const QImage& art, const int index, pb::remote::SongMetadata* song_metadata); void CheckEnabledProviders(); SongInfoProvider* ProviderByName(const QString& name) const; void SendSingleSong(RemoteClient* client, const Song& song, int song_no, int song_count); void SendAlbum(RemoteClient* client, const Song& song); void SendPlaylist(RemoteClient* client, int playlist_id); void OfferNextSong(RemoteClient* client); }; #endif // OUTGOINGDATACREATOR_H clementine-1.2.0+dfsg/src/networkremote/remoteclient.cpp000066400000000000000000000125301223327513400234510ustar00rootroot00000000000000/* 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) { // 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); } 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.0+dfsg/src/networkremote/remoteclient.h000066400000000000000000000021641223327513400231200ustar00rootroot00000000000000#ifndef REMOTECLIENT_H #define REMOTECLIENT_H #include #include #include #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); 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_; }; #endif // REMOTECLIENT_H clementine-1.2.0+dfsg/src/networkremote/tinysvcmdns.cpp000066400000000000000000000045441223327513400233460ustar00rootroot00000000000000#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(); foreach (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(); foreach (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() { foreach(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", NULL }; foreach(mdnsd* mdnsd, mdnsd_) { mdnsd_register_svc( mdnsd, name.constData(), QString(type + ".local").toUtf8().constData(), port, NULL, txt); } } clementine-1.2.0+dfsg/src/networkremote/tinysvcmdns.h000066400000000000000000000007071223327513400230100ustar00rootroot00000000000000#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.0+dfsg/src/networkremote/zeroconf.cpp000066400000000000000000000023471223327513400226110ustar00rootroot00000000000000#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 = NULL; 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; foreach (QChar c, name) { QByteArray rendered = codec->fromUnicode(&c, 1, NULL); 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.0+dfsg/src/networkremote/zeroconf.h000066400000000000000000000011151223327513400222460ustar00rootroot00000000000000#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.0+dfsg/src/playlist/000077500000000000000000000000001223327513400172065ustar00rootroot00000000000000clementine-1.2.0+dfsg/src/playlist/dynamicplaylistcontrols.cpp000066400000000000000000000023101223327513400247000ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/playlist/dynamicplaylistcontrols.h000066400000000000000000000022021223327513400243450ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); ~DynamicPlaylistControls(); signals: void Expand(); void Repopulate(); void TurnOff(); private: Ui_DynamicPlaylistControls* ui_; }; #endif // DYNAMICPLAYLISTCONTROLS_H clementine-1.2.0+dfsg/src/playlist/dynamicplaylistcontrols.ui000066400000000000000000000042451223327513400245440ustar00rootroot00000000000000 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.0+dfsg/src/playlist/playlist.cpp000066400000000000000000001730371223327513400215660ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "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/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/jamendoplaylistitem.h" #include "internet/jamendoservice.h" #include "internet/magnatuneplaylistitem.h" #include "internet/magnatuneservice.h" #include "internet/internetmimedata.h" #include "internet/internetmodel.h" #include "internet/internetplaylistitem.h" #include "internet/internetsongmimedata.h" #include "internet/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" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef USE_STD_UNORDERED_MAP #include using std::unordered_map; #else #include using std::tr1::unordered_map; #endif using smart_playlists::Generator; using smart_playlists::GeneratorInserter; using smart_playlists::GeneratorPtr; using boost::shared_ptr; 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 int Playlist::kUndoStackSize = 20; const int Playlist::kUndoItemLimit = 500; 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_(NULL), 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; foreach (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_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(); 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 while (i < virtual_items_.count() && !FilterContainsVirtualIndex(i)) ++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 ; jMetadata(); 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)) --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) { 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 { // Did we want to stop after this track? if (stop_after_.isValid() && current_row() == stop_after_.row()) return -1; // 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: 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) { 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()) { 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; // 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 = NULL; 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; foreach (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) { foreach (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_); 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_); 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; foreach (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 ; iRemoveForegroundColor(kDynamicHistoryPriority); items_.insert(i, moved_items[i - start]); } // Update persistent indexes foreach (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; foreach (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; foreach (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; foreach (int dest_row, dest_rows) { items_.insert(dest_row, moved_items[offset]); offset ++; } // Update persistent indexes foreach (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(); foreach (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; foreach(PlaylistItemPtr item, items) { songs << item->Metadata(); } const int song_count = songs.length(); QSet vetoed; foreach(SongInsertVetoListener* listener, veto_listeners_) { foreach(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; foreach (const Song& song, songs) { if (song.id() == -1) items << PlaylistItemPtr(new SongPlaylistItem(song)); else items << PlaylistItemPtr(new LibraryPlaylistItem(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; foreach (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; foreach (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; foreach (const Song& song, songs) songs_list.append(song); for (int i=0; i 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)) { PlaylistItemPtr new_item; if (song.id() == -1) { new_item = PlaylistItemPtr(new SongPlaylistItem(song)); } else { new_item = PlaylistItemPtr(new LibraryPlaylistItem(song)); library_items_by_id_.insertMulti(song.id(), new_item); } items_[i] = new_item; emit dataChanged(index(i, 0), index(i, ColumnCount-1)); // Also update undo actions for (int i=0; icount(); 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 NULL; // 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; foreach (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_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_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"); 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; qStableSort(begin, new_items.end(), boost::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(); // This is a slow and nasty way to keep the persistent indices QMap > old_persistent_mappings; foreach (const QModelIndex& index, persistentIndexList()) { old_persistent_mappings[index.row()] = items_[index.row()]; } items_ = new_items; QMapIterator > it(old_persistent_mappings); while (it.hasNext()) { it.next(); for (int col=0 ; colSavePlaylistAsync(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(); PlaylistBackend::PlaylistItemFuture future = backend_->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().results(); // 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 = NULL; 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 ; itype() == "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 { 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() { const qint64 length = current_item_metadata().length_nanosec(); if (length == 0) { scrobble_point_ = 240ll * kNsecPerSec; // 4 minutes } else { scrobble_point_ = qBound(31ll * kNsecPerSec, length/2, 240ll * kNsecPerSec); } 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()) { 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)) 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)) break; count ++; } RemoveItemsWithoutUndo(start, count); start ++; } } void Playlist::ReloadItems(const QList& rows) { foreach (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::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. if (current_virtual_index_ != -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 ; ishuffle_mode()); } QSortFilterProxyModel* Playlist::proxy() const { return proxy_; } SongList Playlist::GetAllSongs() const { SongList ret; foreach (PlaylistItemPtr item, items_) { ret << item->Metadata(); } return ret; } PlaylistItemList Playlist::GetAllItems() const { return items_; } quint64 Playlist::GetTotalLength() const { quint64 ret = 0; foreach (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() { foreach (const QModelIndex& index, temp_dequeue_change_indexes_) { emit dataChanged(index, index); } temp_dequeue_change_indexes_.clear(); } 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 ; irowCount() ; ++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 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); } 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; } clementine-1.2.0+dfsg/src/playlist/playlist.h000066400000000000000000000335751223327513400212350ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 #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 = 0); ~Playlist(); // 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, 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 }; 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 int kUndoStackSize; static const int kUndoItemLimit; 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; } // 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); // 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); 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 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); private: void SetCurrentIsPaused(bool paused); void UpdateScrobblePoint(); 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.0+dfsg/src/playlist/playlistbackend.cpp000066400000000000000000000317751223327513400231000ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "core/application.h" #include "core/database.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" #include #include #include #include #include #include #include using smart_playlists::GeneratorPtr; using boost::shared_ptr; 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; } QList 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(query, db); q.bindValue(":playlist", playlist); q.exec(); if (db_->CheckErrors(q)) return QList(); QList rows; while (q.next()) { rows << SqlRow(q); } return rows; } QFuture PlaylistBackend::GetPlaylistItems(int playlist) { QMutexLocker l(db_->Mutex()); QList rows = GetPlaylistRows(playlist); // it's probable that we'll have a few songs associated with the // same CUE so we're caching results of parsing CUEs boost::shared_ptr state_ptr(new NewSongFromQueryState()); return QtConcurrent::mapped(rows, boost::bind(&PlaylistBackend::NewPlaylistItemFromQuery, this, _1, state_ptr)); } QFuture PlaylistBackend::GetPlaylistSongs(int playlist) { QMutexLocker l(db_->Mutex()); QList rows = GetPlaylistRows(playlist); // it's probable that we'll have a few songs associated with the // same CUE so we're caching results of parsing CUEs boost::shared_ptr state_ptr(new NewSongFromQueryState()); return QtConcurrent::mapped(rows, boost::bind(&PlaylistBackend::NewSongFromQuery, this, _1, state_ptr)); } PlaylistItemPtr PlaylistBackend::NewPlaylistItemFromQuery(const SqlRow& row, boost::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, boost::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, boost::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]; } } foreach(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()); 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 foreach (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 ; iCheckErrors(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.0+dfsg/src/playlist/playlistbackend.h000066400000000000000000000064431223327513400225370ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 #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 = 0); 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; typedef QFuture PlaylistItemFuture; static const int kSongTableJoins; PlaylistList GetAllPlaylists(); PlaylistList GetAllOpenPlaylists(); PlaylistList GetAllFavoritePlaylists(); PlaylistBackend::Playlist GetPlaylist(int id); PlaylistItemFuture GetPlaylistItems(int playlist); QFuture 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); public slots: void SavePlaylist(int playlist, const PlaylistItemList& items, int last_played, smart_playlists::GeneratorPtr dynamic); private: struct NewSongFromQueryState { QHash cached_cues_; QMutex mutex_; }; QList GetPlaylistRows(int playlist); Song NewSongFromQuery(const SqlRow& row, boost::shared_ptr state); PlaylistItemPtr NewPlaylistItemFromQuery(const SqlRow& row, boost::shared_ptr state); PlaylistItemPtr RestoreCueData(PlaylistItemPtr item, boost::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.0+dfsg/src/playlist/playlistcontainer.cpp000066400000000000000000000343231223327513400234630ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_(NULL), undo_(NULL), redo_(NULL), playlist_(NULL), starting_up_(true), tab_bar_visible_(false), tab_bar_animation_(new QTimeLine(500, this)), no_matches_label_(NULL), 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(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 ; itab_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::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) { 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.0+dfsg/src/playlist/playlistcontainer.h000066400000000000000000000056001223327513400231240ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); ~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 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.0+dfsg/src/playlist/playlistcontainer.ui000066400000000000000000000106711223327513400233160ustar00rootroot00000000000000 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.0+dfsg/src/playlist/playlistdelegates.cpp000066400000000000000000000355751223327513400234500ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "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" #include #include #include #include #include #include #include #include #include #include #include #include #include #include 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.translated(-1, -1), 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"); } } 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); // Draw the pixmap in the middle of the rectangle QRect draw_rect(QPoint(0, 0), option_copy.decorationSize); draw_rect.moveCenter(option_copy.rect.center()); painter->drawPixmap(draw_rect, pixmap); } clementine-1.2.0+dfsg/src/playlist/playlistdelegates.h000066400000000000000000000144321223327513400231020ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/playlist/playlistfilter.cpp000066400000000000000000000056621223327513400227720ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_["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_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.0+dfsg/src/playlist/playlistfilter.h000066400000000000000000000030321223327513400224240ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); ~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.0+dfsg/src/playlist/playlistfilterparser.cpp000066400000000000000000000353651223327513400242120ustar00rootroot00000000000000/* 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 { foreach (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 { foreach (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 { foreach (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 = NULL; 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; foreach (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.0+dfsg/src/playlist/playlistfilterparser.h000066400000000000000000000057531223327513400236550ustar00rootroot00000000000000/* 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.0+dfsg/src/playlist/playlistheader.cpp000066400000000000000000000103721223327513400227270ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 ; ipopup(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.0+dfsg/src/playlist/playlistheader.h000066400000000000000000000032671223327513400224010ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); // 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.0+dfsg/src/playlist/playlistitem.cpp000066400000000000000000000077561223327513400224510ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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/jamendoplaylistitem.h" #include "internet/jamendoservice.h" #include "internet/magnatuneplaylistitem.h" #include "internet/magnatuneservice.h" #include "internet/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 NULL; } 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 NULL; } 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(); } clementine-1.2.0+dfsg/src/playlist/playlistitem.h000066400000000000000000000071201223327513400220770ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 boost::enable_shared_from_this { public: PlaylistItem(const QString& type) : 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; } protected: 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 boost::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.0+dfsg/src/playlist/playlistitemmimedata.h000066400000000000000000000022021223327513400235750ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/playlist/playlistlistcontainer.cpp000066400000000000000000000306041223327513400243550ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_(NULL), ui_(new Ui_PlaylistListContainer), menu_(NULL), 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")); 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_) { 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 ; irowCount() ; ++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. foreach (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; foreach (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 foreach (int id, ids) { app_->playlist_manager()->Favorite(id, false); } // Delete the top-level folders. foreach (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 ; irowCount(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.0+dfsg/src/playlist/playlistlistcontainer.h000066400000000000000000000051441223327513400240230ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); ~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.0+dfsg/src/playlist/playlistlistcontainer.ui000066400000000000000000000073141223327513400242120ustar00rootroot00000000000000 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.0+dfsg/src/playlist/playlistlistmodel.cpp000066400000000000000000000142511223327513400234730ustar00rootroot00000000000000#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; jrowCount(); ++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); foreach (const QString& part, parts) { QStandardItem* matching_child = NULL; const int child_count = parent->rowCount(); for (int i=0 ; ichild(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 class PlaylistListModel : public QStandardItemModel { Q_OBJECT public: PlaylistListModel(QObject* parent = 0); 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.0+dfsg/src/playlist/playlistlistview.cpp000066400000000000000000000026521223327513400233470ustar00rootroot00000000000000/* 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.0+dfsg/src/playlist/playlistlistview.h000066400000000000000000000017361223327513400230160ustar00rootroot00000000000000/* 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 = NULL); ~PlaylistListView() {} protected: // QWidget void paintEvent(QPaintEvent* event); }; clementine-1.2.0+dfsg/src/playlist/playlistmanager.cpp000066400000000000000000000372151223327513400231160ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "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 using smart_playlists::GeneratorPtr; PlaylistManager::PlaylistManager(Application* app, QObject *parent) : PlaylistManagerInterface(app, parent), app_(app), playlist_backend_(NULL), library_backend_(NULL), sequence_(NULL), parser_(NULL), 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())); settings_.beginGroup(Playlist::kSettingsGroup); } PlaylistManager::~PlaylistManager() { foreach (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))); foreach (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; foreach(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) { QUrl url = QUrl::fromLocalFile(filename); SongLoader* loader = new SongLoader(library_backend_, this); connect(loader, SIGNAL(LoadFinished(bool)), SLOT(LoadFinished(bool))); SongLoader::Result result = loader->Load(url); QFileInfo info(filename); if (result == SongLoader::Error || (result == SongLoader::Success && loader->songs().isEmpty())) { app_->AddError(tr("The playlist '%1' was empty or could not be loaded.").arg( info.completeBaseName())); delete loader; return; } if (result == SongLoader::Success) { New(info.baseName(), loader->songs()); delete loader; } } void PlaylistManager::LoadFinished(bool success) { SongLoader* loader = qobject_cast(sender()); loader->deleteLater(); QString localfile = loader->url().toLocalFile(); QFileInfo info(localfile); if (!success || loader->songs().isEmpty()) { app_->AddError(tr("The playlist '%1' was empty or could not be loaded.").arg( info.completeBaseName())); } New(info.baseName(), loader->songs()); } void PlaylistManager::Save(int id, const QString& filename) { if (playlists_.contains(id)) { parser_->Save(playlist(id)->GetAllSongs(), filename); } 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 = playlist_backend_->GetPlaylistSongs(id); QFutureWatcher* watcher = new QFutureWatcher(this); watcher->setFuture(future); NewClosure(watcher, SIGNAL(finished()), this, SLOT(ItemsLoadedForSavePlaylist(QFutureWatcher*, QString)), watcher, filename); } } void PlaylistManager::ItemsLoadedForSavePlaylist( QFutureWatcher* watcher, const QString& filename) { SongList song_list = watcher->future().results(); parser_->Save(song_list, filename); } void PlaylistManager::SaveWithUI(int id, const QString& suggested_filename) { QString filename = settings_.value("last_save_playlist").toString(); // 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( NULL, tr("Save playlist"), filename, parser()->filters(), &default_filter); if (filename.isNull()) return; settings_.setValue("last_save_playlist", filename); Save(id == -1 ? current_id() : id, filename); } 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; foreach (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::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 foreach (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 foreach (const Song& song, songs) { foreach (const Data& data, playlists_) { PlaylistItemList items = data.p->library_items_by_id(song.id()); foreach (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) { foreach(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::RemoveItemsWithoutUndo(int id, const QList &indices) { Q_ASSERT(playlists_.contains(id)); playlists_[id].p->RemoveItemsWithoutUndo(indices); } void PlaylistManager::InvalidateDeletedSongs() { foreach(Playlist* playlist, GetAllPlaylists()) { playlist->InvalidateDeletedSongs(); } } void PlaylistManager::RemoveDeletedSongs() { foreach(Playlist* playlist, GetAllPlaylists()) { playlist->RemoveDeletedSongs(); } } QString PlaylistManager::GetNameForNewPlaylist(const SongList& songs) { if (songs.isEmpty()) { return tr("Playlist"); } QSet artists; QSet albums; foreach(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.0+dfsg/src/playlist/playlistmanager.h000066400000000000000000000216241223327513400225600ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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) = 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 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 = 0); ~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); // 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 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); // 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 LoadFinished(bool success); void ItemsLoadedForSavePlaylist(QFutureWatcher* watcher, const QString& filename); private: Playlist* AddPlaylist(int id, const QString& name, const QString& special_type, const QString& ui_path, bool favorite); private: struct Data { Data(Playlist* _p = NULL, 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_; QSettings settings_; // key = id QMap playlists_; int current_; int active_; }; #endif // PLAYLISTMANAGER_H clementine-1.2.0+dfsg/src/playlist/playlistsequence.cpp000066400000000000000000000153251223327513400233120ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_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; foreach (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; 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; } 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: break; } SetRepeatMode(mode); } clementine-1.2.0+dfsg/src/playlist/playlistsequence.h000066400000000000000000000045531223327513400227600ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "core/settingsprovider.h" #include class QMenu; class Ui_PlaylistSequence; class PlaylistSequence : public QWidget { Q_OBJECT public: PlaylistSequence(QWidget *parent = 0, SettingsProvider* settings = 0); ~PlaylistSequence(); enum RepeatMode { Repeat_Off = 0, Repeat_Track = 1, Repeat_Album = 2, Repeat_Playlist = 3, }; 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_; boost::scoped_ptr settings_; QMenu* repeat_menu_; QMenu* shuffle_menu_; bool loading_; RepeatMode repeat_mode_; ShuffleMode shuffle_mode_; bool dynamic_; }; #endif // PLAYLISTSEQUENCE_H clementine-1.2.0+dfsg/src/playlist/playlistsequence.ui000066400000000000000000000063721223327513400231470ustar00rootroot00000000000000 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 true Don't shuffle true Shuffle tracks in this album true Shuffle all true Shuffle albums clementine-1.2.0+dfsg/src/playlist/playlisttabbar.cpp000066400000000000000000000275101223327513400227340ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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/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_(NULL), menu_(new QMenu(this)), menu_index_(-1), suppress_current_changed_(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))); } 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()) { 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 (currentIndex() == index) emit CurrentIdChanged(id); // Update playlist tab order/visibility TabMoved(); } void PlaylistTabBar::TabMoved() { QList ids; for (int i=0 ; imimeData()->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.0+dfsg/src/playlist/playlisttabbar.h000066400000000000000000000057211223327513400224010ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); 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); 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_; // Editor for inline renaming RenameTabLineEdit* rename_editor_; }; #endif // PLAYLISTTABBAR_H clementine-1.2.0+dfsg/src/playlist/playlistundocommands.cpp000066400000000000000000000071171223327513400241710ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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; iMetadata().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 ; iRemoveItemsWithoutUndo( 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; foreach (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.0+dfsg/src/playlist/playlistundocommands.h000066400000000000000000000057631223327513400236430ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/playlist/playlistview.cpp000066400000000000000000001264331223327513400224570ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_(NULL), style_(new PlaylistProxyStyle(style())), playlist_(NULL), 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_(NULL), 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(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; 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(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_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 ; icount() ; ++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(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.font.setItalic(true); 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 SeekTrack(-1); event->accept(); } else if(event->key() == Qt::Key_Right) { emit SeekTrack(1); 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_A && 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; } // 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); // Store the last selected row, which is the first in the list int last_row = selection.first().bottom(); foreach (const QItemSelectionRange& range, selection) { 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()) { // Update visual selection with the entire row selectionModel()->select(QItemSelection(new_index, model()->index(new_row, model()->columnCount()-1)), QItemSelectionModel::Select); // Update keyboard selected row, if it's not the first row if (new_row != 0) keyPressEvent(new QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier)); } else { // We're removing the last item, select the new last row selectionModel()->select(QItemSelection(model()->index(model()->rowCount()-1, 0), model()->index(model()->rowCount()-1, model()->columnCount()-1)), QItemSelectionModel::Select); } } QList PlaylistView::GetEditableColumns() { QList columns; QHeaderView* h = header(); for (int col=0; colcount(); 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::SelectedClicked)) { 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); foreach (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::SelectedClicked)) { return; } const QModelIndex old_index = rating_delegate_->mouse_over_index(); rating_delegate_->set_mouse_out(); setCursor(QCursor()); update(old_index); foreach (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::SelectedClicked)) { 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 foreach (const QModelIndex& index, selectedIndexes()) { if (index.data(Playlist::Role_CanSetRating).toBool()) { playlist_->RateSong(playlist_->proxy()->mapToSource(index), 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_ = NULL; // 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; } } 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] = (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 ; icount() ; ++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()); } clementine-1.2.0+dfsg/src/playlist/playlistview.h000066400000000000000000000176021223327513400221210ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "playlist.h" #include #include #include #include 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: boost::scoped_ptr cleanlooks_; }; class PlaylistView : public QTreeView { Q_OBJECT public: enum BackgroundImageType { Default, None, Custom, AlbumCover }; PlaylistView(QWidget* parent = 0); 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 SeekTrack(int gap); 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); // 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.0+dfsg/src/playlist/queue.cpp000066400000000000000000000233171223327513400210440ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 ; iindex(row, 0)); if (!proxy_index.isValid()) continue; emit dataChanged(proxy_index, proxy_index); } } void Queue::SourceLayoutChanged() { for (int i=0 ; i& 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; foreach (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 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; foreach (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 = NULL; QList source_rows; QDataStream stream(data->data(Playlist::kRowsMimetype)); stream.readRawData(reinterpret_cast(&playlist), sizeof(playlist)); stream >> source_rows; QModelIndexList source_indexes; foreach (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& proxy_rows) { //order the rows qStableSort(proxy_rows); //reflects immediately changes in the playlist layoutAboutToBeChanged(); int removed_rows = 0; foreach (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.0+dfsg/src/playlist/queue.h000066400000000000000000000050171223327513400205060ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); 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.0+dfsg/src/playlist/queuemanager.cpp000066400000000000000000000117601223327513400223760ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_(NULL), current_playlist_(NULL) { 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; foreach (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; foreach (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_ = NULL; // We'll get another CurrentPlaylistChanged() soon } clementine-1.2.0+dfsg/src/playlist/queuemanager.h000066400000000000000000000025311223327513400220370ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); ~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.0+dfsg/src/playlist/queuemanager.ui000066400000000000000000000117571223327513400222370ustar00rootroot00000000000000 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.0+dfsg/src/playlist/songloaderinserter.cpp000066400000000000000000000125551223327513400236330ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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) : task_manager_(task_manager), destination_(NULL), row_(-1), play_now_(true), enqueue_(false), async_load_id_(0), async_progress_(0), library_(library) { } SongLoaderInserter::~SongLoaderInserter() { qDeleteAll(pending_); qDeleteAll(pending_async_); } 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(EffectiveLoadFinished(const SongList&)), destination, SLOT(UpdateItems(const SongList&))); foreach (const QUrl& url, urls) { SongLoader* loader = new SongLoader(library_, this); // we're connecting this before we're even sure if this is an async load // to avoid race conditions (signal emission before we're listening to it) connect(loader, SIGNAL(LoadFinished(bool)), SLOT(PendingLoadFinished(bool))); SongLoader::Result ret = loader->Load(url); if (ret == SongLoader::WillLoadAsync) { pending_.insert(loader); continue; } if (ret == SongLoader::Success) songs_ << loader->songs(); else emit Error(tr("Error loading %1").arg(url.toString())); delete loader; } if (pending_.isEmpty()) Finished(); else { async_progress_ = 0; async_load_id_ = task_manager_->StartTask(tr("Loading tracks")); task_manager_->SetTaskProgress(async_load_id_, async_progress_, pending_.count()); } } // Load audio CD tracks: // First, we add tracks (without metadata) into the playlist // In the meantine, 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_, this); connect(loader, SIGNAL(LoadFinished(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_ = loader->songs(); PartiallyFinished(); } void SongLoaderInserter::DestinationDestroyed() { destination_ = NULL; } 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::PendingLoadFinished(bool success) { SongLoader* loader = qobject_cast(sender()); if (!loader || !pending_.contains(loader)) return; pending_.remove(loader); pending_async_.insert(loader); if (success) songs_ << loader->songs(); else emit Error(tr("Error loading %1").arg(loader->url().toString())); task_manager_->SetTaskProgress(async_load_id_, ++async_progress_); if (pending_.isEmpty()) { task_manager_->SetTaskFinished(async_load_id_); async_progress_ = 0; async_load_id_ = task_manager_->StartTask(tr("Loading tracks info")); task_manager_->SetTaskProgress(async_load_id_, async_progress_, pending_async_.count()); PartiallyFinished(); QtConcurrent::run(this, &SongLoaderInserter::EffectiveLoad); } } void SongLoaderInserter::PartiallyFinished() { // Insert songs (that haven't been completelly loaded) to allow user to see // and play them while not loaded completely if (destination_) { destination_->InsertSongsOrLibraryItems(songs_, row_, play_now_, enqueue_); } } void SongLoaderInserter::EffectiveLoad() { foreach (SongLoader* loader, pending_async_) { loader->EffectiveSongsLoad(); task_manager_->SetTaskProgress(async_load_id_, ++async_progress_); emit EffectiveLoadFinished(loader->songs()); } task_manager_->SetTaskFinished(async_load_id_); deleteLater(); } void SongLoaderInserter::Finished() { if (destination_) { destination_->InsertSongsOrLibraryItems(songs_, row_, play_now_, enqueue_); } deleteLater(); } clementine-1.2.0+dfsg/src/playlist/songloaderinserter.h000066400000000000000000000036551223327513400233010ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 Playlist; class SongLoader; class TaskManager; class QModelIndex; class SongLoaderInserter : public QObject { Q_OBJECT public: SongLoaderInserter(TaskManager* task_manager, LibraryBackendInterface* library); ~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 EffectiveLoadFinished(const SongList& songs); private slots: void PendingLoadFinished(bool success); void DestinationDestroyed(); void AudioCDTagsLoaded(bool success); private: void PartiallyFinished(); void EffectiveLoad(); void Finished(); private: TaskManager* task_manager_; Playlist* destination_; int row_; bool play_now_; bool enqueue_; SongList songs_; QSet pending_; QSet pending_async_; int async_load_id_; int async_progress_; LibraryBackendInterface* library_; }; #endif // SONGLOADERINSERTER_H clementine-1.2.0+dfsg/src/playlist/songmimedata.h000066400000000000000000000020531223327513400220270ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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(NULL) {} LibraryBackendInterface* backend; SongList songs; }; #endif // SONGMIMEDATA_H clementine-1.2.0+dfsg/src/playlist/songplaylistitem.cpp000066400000000000000000000032521223327513400233230ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/playlist/songplaylistitem.h000066400000000000000000000025641223327513400227750ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/playlistparsers/000077500000000000000000000000001223327513400206065ustar00rootroot00000000000000clementine-1.2.0+dfsg/src/playlistparsers/asxiniparser.cpp000066400000000000000000000034721223327513400240300ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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) const { QTextStream s(device); s << "[Reference]" << endl; int n = 1; foreach (const Song& song, songs) { s << "Ref" << n << "=" << URLOrRelativeFilename(song.url(), dir) << endl; ++n; } } clementine-1.2.0+dfsg/src/playlistparsers/asxiniparser.h000066400000000000000000000024561223327513400234760ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); 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()) const; }; #endif // ASXINIPARSER_H clementine-1.2.0+dfsg/src/playlistparsers/asxparser.cpp000066400000000000000000000104541223327513400233260ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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&) const { QXmlStreamWriter writer(device); writer.setAutoFormatting(true); writer.writeStartDocument(); { StreamElement asx("asx", &writer); writer.writeAttribute("version", "3.0"); foreach (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 = 0); 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()) const; private: Song ParseTrack(QXmlStreamReader* reader, const QDir& dir) const; }; #endif clementine-1.2.0+dfsg/src/playlistparsers/cueparser.cpp000066400000000000000000000246661223327513400233210ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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) 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.0+dfsg/src/playlistparsers/cueparser.h000066400000000000000000000062131223327513400227520ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); 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()) 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.0+dfsg/src/playlistparsers/m3uparser.cpp000066400000000000000000000071611223327513400232400ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 #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) const { device->write("#EXTM3U\n"); foreach (const Song& song, songs) { if (song.url().isEmpty()) { continue; } 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(URLOrRelativeFilename(song.url(), dir).toUtf8()); device->write("\n"); } } bool M3UParser::TryMagic(const QByteArray &data) const { return data.contains("#EXTM3U") || data.contains("#EXTINF"); } clementine-1.2.0+dfsg/src/playlistparsers/m3uparser.h000066400000000000000000000040361223327513400227030ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); 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()) 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.0+dfsg/src/playlistparsers/parserbase.cpp000066400000000000000000000055261223327513400234510ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 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; } } // Convert native separators for Windows paths filename = QDir::fromNativeSeparators(filename); // 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::URLOrRelativeFilename(const QUrl& url, const QDir& dir) const { if (url.scheme() != "file") return url.toString(); const QString filename = url.toLocalFile(); if (QDir::isAbsolutePath(filename)) { const QString relative = dir.relativeFilePath(filename); if (!relative.contains("..")) return relative; } return filename; } clementine-1.2.0+dfsg/src/playlistparsers/parserbase.h000066400000000000000000000055011223327513400231070ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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" class LibraryBackendInterface; class ParserBase : public QObject { Q_OBJECT public: ParserBase(LibraryBackendInterface* library, QObject* parent = 0); 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()) 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 relative to the // directory. Otherwise returns the URL as is. // This function should always be used when saving a playlist. QString URLOrRelativeFilename(const QUrl& url, const QDir& dir) const; private: LibraryBackendInterface* library_; }; #endif // PARSERBASE_H clementine-1.2.0+dfsg/src/playlistparsers/playlistparser.cpp000066400000000000000000000104101223327513400243640ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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; foreach (ParserBase* parser, parsers_) { ret << parser->file_extensions(); } qStableSort(ret); return ret; } QString PlaylistParser::filters() const { QStringList filters; QStringList all_extensions; foreach (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; foreach (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 { foreach (ParserBase* p, parsers_) { if (p->file_extensions().contains(suffix)) return p; } return NULL; } ParserBase* PlaylistParser::ParserForMagic(const QByteArray& data, const QString& mime_type) const { foreach (ParserBase* p, parsers_) { if ((!mime_type.isEmpty() && mime_type == p->mime_type()) || p->TryMagic(data)) return p; } return NULL; } 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) 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()); } clementine-1.2.0+dfsg/src/playlistparsers/playlistparser.h000066400000000000000000000035451223327513400240440ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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" class ParserBase; class LibraryBackendInterface; class PlaylistParser : public QObject { Q_OBJECT public: PlaylistParser(LibraryBackendInterface* library, QObject* parent = 0); 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) const; private: QString FilterForParser(const ParserBase* parser, QStringList* all_extensions = NULL) const; private: QList parsers_; ParserBase* default_parser_; }; #endif // PLAYLISTPARSER_H clementine-1.2.0+dfsg/src/playlistparsers/plsparser.cpp000066400000000000000000000051261223327513400233310ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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) const { QTextStream s(device); s << "[playlist]" << endl; s << "Version=2" << endl; s << "NumberOfEntries=" << songs.count() << endl; int n = 1; foreach (const Song& song, songs) { s << "File" << n << "=" << URLOrRelativeFilename(song.url(), dir) << 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.0+dfsg/src/playlistparsers/plsparser.h000066400000000000000000000024301223327513400227710ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); 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()) const; }; #endif // PLSPARSER_H clementine-1.2.0+dfsg/src/playlistparsers/wplparser.cpp000066400000000000000000000065301223327513400233350ustar00rootroot00000000000000/* 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) const { QXmlStreamWriter writer(device); 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); foreach (const Song& song, songs) { writer.writeStartElement("media"); writer.writeAttribute("src", URLOrRelativeFilename(song.url(), dir)); 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.0+dfsg/src/playlistparsers/wplparser.h000066400000000000000000000030421223327513400227750ustar00rootroot00000000000000/* 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 = 0); 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) 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.0+dfsg/src/playlistparsers/xmlparser.cpp000066400000000000000000000017401223327513400233310ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/playlistparsers/xmlparser.h000066400000000000000000000025161223327513400230000ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 #include class QDomDocument; class QDomNode; class XMLParser : public ParserBase { protected: XMLParser(LibraryBackendInterface* library, QObject* parent); class StreamElement : public boost::noncopyable { public: StreamElement(const QString& name, QXmlStreamWriter* stream) : stream_(stream) { stream->writeStartElement(name); } ~StreamElement() { stream_->writeEndElement(); } private: QXmlStreamWriter* stream_; }; }; #endif clementine-1.2.0+dfsg/src/playlistparsers/xspfparser.cpp000066400000000000000000000106701223327513400235130ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 #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&) const { QXmlStreamWriter writer(device); writer.writeStartDocument(); StreamElement playlist("playlist", &writer); writer.writeAttribute("version", "1"); writer.writeDefaultNamespace("http://xspf.org/ns/0/"); StreamElement tracklist("trackList", &writer); foreach (const Song& song, songs) { StreamElement track("track", &writer); writer.writeTextElement("location", song.url().toString()); 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()) { // Convert local files to URLs. if (!art.contains("://")) { art = QUrl::fromLocalFile(art).toString(); } writer.writeTextElement("image", art); } } 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 = 0); 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()) const; private: Song ParseTrack(QXmlStreamReader* reader, const QDir& dir) const; }; #endif clementine-1.2.0+dfsg/src/podcasts/000077500000000000000000000000001223327513400171655ustar00rootroot00000000000000clementine-1.2.0+dfsg/src/podcasts/addpodcastbyurl.cpp000066400000000000000000000057211223327513400230620ustar00rootroot00000000000000/* 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 "addpodcastbyurl.h" #include "podcastdiscoverymodel.h" #include "podcasturlloader.h" #include "ui_addpodcastbyurl.h" #include "core/closure.h" #include #include #include 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: foreach (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(); if (!ui_->url->text().isEmpty()) { return; } const QClipboard* clipboard = QApplication::clipboard(); foreach (const QString& contents, QStringList() << clipboard->text(QClipboard::Clipboard) << clipboard->text(QClipboard::Selection)) { if (contents.contains("://")) { ui_->url->setText(contents); return; } } } clementine-1.2.0+dfsg/src/podcasts/addpodcastbyurl.h000066400000000000000000000025621223327513400225270ustar00rootroot00000000000000/* 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 ADDPODCASTBYURL_H #define 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: AddPodcastByUrl(Application* app, QWidget* parent = 0); ~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 // ADDPODCASTBYURL_H clementine-1.2.0+dfsg/src/podcasts/addpodcastbyurl.ui000066400000000000000000000031351223327513400227120ustar00rootroot00000000000000 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.0+dfsg/src/podcasts/addpodcastdialog.cpp000066400000000000000000000175651223327513400231750ustar00rootroot00000000000000/* 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 "addpodcastdialog.h" #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" #include #include #include 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.0+dfsg/src/podcasts/addpodcastdialog.h000066400000000000000000000041701223327513400226260ustar00rootroot00000000000000/* 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 ADDPODCASTDIALOG_H #define 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: AddPodcastDialog(Application* app, QWidget* parent = 0); ~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 // ADDPODCASTDIALOG_H clementine-1.2.0+dfsg/src/podcasts/addpodcastdialog.ui000066400000000000000000000161761223327513400230250ustar00rootroot00000000000000 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
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.0+dfsg/src/podcasts/addpodcastpage.cpp000066400000000000000000000020251223327513400226330ustar00rootroot00000000000000/* 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 "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.0+dfsg/src/podcasts/addpodcastpage.h000066400000000000000000000024111223327513400222770ustar00rootroot00000000000000/* 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 ADDPODCASTPAGE_H #define ADDPODCASTPAGE_H #include class Application; class PodcastDiscoveryModel; class AddPodcastPage : public QWidget { Q_OBJECT public: AddPodcastPage(Application* app, QWidget* parent = 0); 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 // ADDPODCASTPAGE_H clementine-1.2.0+dfsg/src/podcasts/fixedopmlpage.cpp000066400000000000000000000042571223327513400225250ustar00rootroot00000000000000/* 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 "fixedopmlpage.h" #include "podcastdiscoverymodel.h" #include "podcasturlloader.h" #include "core/closure.h" #include 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: foreach (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.0+dfsg/src/podcasts/fixedopmlpage.h000066400000000000000000000024751223327513400221720ustar00rootroot00000000000000/* 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 FIXEDOPMLPAGE_H #define 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 = 0); 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 // FIXEDOPMLPAGE_H clementine-1.2.0+dfsg/src/podcasts/gpoddersearchpage.cpp000066400000000000000000000051311223327513400233400ustar00rootroot00000000000000/* 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 "gpoddersearchpage.h" #include "podcast.h" #include "podcastdiscoverymodel.h" #include "ui_gpoddersearchpage.h" #include "core/closure.h" #include "core/network.h" #include 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(); foreach (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( NULL, 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.0+dfsg/src/podcasts/gpoddersearchpage.h000066400000000000000000000025161223327513400230110ustar00rootroot00000000000000/* 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 GPODDERSEARCHPAGE_H #define GPODDERSEARCHPAGE_H #include "addpodcastpage.h" #include class QNetworkAccessManager; class Ui_GPodderSearchPage; class GPodderSearchPage : public AddPodcastPage { Q_OBJECT public: GPodderSearchPage(Application* app, QWidget* parent = 0); ~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 // GPODDERSEARCHPAGE_H clementine-1.2.0+dfsg/src/podcasts/gpoddersearchpage.ui000066400000000000000000000031561223327513400232000ustar00rootroot00000000000000 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.0+dfsg/src/podcasts/gpoddersync.cpp000066400000000000000000000277641223327513400222320ustar00rootroot00000000000000/* 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 "gpoddersync.h" #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" #include #include #include #include #include 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; foreach (mygpo::EpisodePtr episode, reply->updateList()) { episodes_by_podcast[episode->podcastUrl()].append(episode); } foreach (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. foreach (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. foreach (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 foreach (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; foreach (const typename T::value_type& 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 ; isetArrayIndex(i); *container << s->value(item_name).value(); } s->endArray(); } } 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. foreach (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(); foreach (const Podcast& podcast, backend_->GetAllSubscriptions()) { queued_add_subscriptions_.insert(podcast.url()); } SaveQueue(); FlushUpdateQueue(); } clementine-1.2.0+dfsg/src/podcasts/gpoddersync.h000066400000000000000000000064361223327513400216700ustar00rootroot00000000000000/* 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 GPODDERSYNC_H #define 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: GPodderSync(Application* app, QObject* parent = 0); ~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 // GPODDERSYNC_H clementine-1.2.0+dfsg/src/podcasts/gpoddertoptagsmodel.cpp000066400000000000000000000073711223327513400237500ustar00rootroot00000000000000/* 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 "gpoddertoptagsmodel.h" #include "gpoddertoptagspage.h" #include "podcast.h" #include "core/closure.h" #include #include 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); } foreach (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( NULL, 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.0+dfsg/src/podcasts/gpoddertoptagsmodel.h000066400000000000000000000030631223327513400234070ustar00rootroot00000000000000/* 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 GPODDERTOPTAGSMODEL_H #define 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 = 0); 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 // GPODDERTOPTAGSMODEL_H clementine-1.2.0+dfsg/src/podcasts/gpoddertoptagspage.cpp000066400000000000000000000051601223327513400235560ustar00rootroot00000000000000/* 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 "gpoddertoptagsmodel.h" #include "gpoddertoptagspage.h" #include "core/closure.h" #include "core/network.h" #include 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); foreach (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( NULL, 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.0+dfsg/src/podcasts/gpoddertoptagspage.h000066400000000000000000000026351223327513400232270ustar00rootroot00000000000000/* 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 GPODDERTOPTAGSPAGE_H #define GPODDERTOPTAGSPAGE_H #include #include #include "addpodcastpage.h" class QNetworkAccessManager; class GPodderTopTagsPage : public AddPodcastPage { Q_OBJECT public: GPodderTopTagsPage(Application* app, QWidget* parent = 0); ~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 // GPODDERTOPTAGSPAGE_H clementine-1.2.0+dfsg/src/podcasts/itunessearchpage.cpp000066400000000000000000000064451223327513400232340ustar00rootroot00000000000000/* 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 "itunessearchpage.h" #include "podcast.h" #include "podcastdiscoverymodel.h" #include "ui_itunessearchpage.h" #include "core/closure.h" #include "core/network.h" #include #include #include 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; } foreach (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.0+dfsg/src/podcasts/itunessearchpage.h000066400000000000000000000024131223327513400226700ustar00rootroot00000000000000/* 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 ITUNESSEARCHPAGE_H #define 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 // ITUNESSEARCHPAGE_H clementine-1.2.0+dfsg/src/podcasts/itunessearchpage.ui000066400000000000000000000031521223327513400230570ustar00rootroot00000000000000 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.0+dfsg/src/podcasts/opmlcontainer.h000066400000000000000000000020121223327513400222030ustar00rootroot00000000000000/* 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 OPMLCONTAINER_H #define 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 // OPMLCONTAINER_H clementine-1.2.0+dfsg/src/podcasts/podcast.cpp000066400000000000000000000151611223327513400213320ustar00rootroot00000000000000/* 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 "podcast.h" #include "core/utilities.h" #include #include #include 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.0+dfsg/src/podcasts/podcast.h000066400000000000000000000065661223327513400210100ustar00rootroot00000000000000/* 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 PODCAST_H #define 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 // PODCAST_H clementine-1.2.0+dfsg/src/podcasts/podcastbackend.cpp000066400000000000000000000201701223327513400226360ustar00rootroot00000000000000/* 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 "podcastbackend.h" #include "core/application.h" #include "core/database.h" #include "core/logging.h" #include "core/scopedtransaction.h" #include 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 (PodcastEpisodeList::iterator 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 (PodcastEpisodeList::iterator 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); foreach (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", 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; } clementine-1.2.0+dfsg/src/podcasts/podcastbackend.h000066400000000000000000000064651223327513400223160ustar00rootroot00000000000000/* 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 PODCASTBACKEND_H #define PODCASTBACKEND_H #include #include "podcast.h" class Application; class Database; class PodcastBackend : public QObject { Q_OBJECT public: PodcastBackend(Application* app, QObject* parent = 0); // 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); // 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); // 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 QList& episodes); // Emitted when existing episodes are updated. void EpisodesUpdated(const QList& 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 // PODCASTBACKEND_H clementine-1.2.0+dfsg/src/podcasts/podcastdiscoverymodel.cpp000066400000000000000000000066551223327513400243130ustar00rootroot00000000000000/* 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 "opmlcontainer.h" #include "podcast.h" #include "podcastdiscoverymodel.h" #include "core/application.h" #include "ui/iconloader.h" #include "ui/standarditemiconloader.h" #include #include 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) { foreach (const OpmlContainer& child, container.containers) { QStandardItem* child_item = CreateOpmlContainerItem(child); parent->appendRow(child_item); } foreach (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.0+dfsg/src/podcasts/podcastdiscoverymodel.h000066400000000000000000000036351223327513400237530ustar00rootroot00000000000000/* 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 PODCASTDISCOVERYMODEL_H #define PODCASTDISCOVERYMODEL_H #include "covers/albumcoverloaderoptions.h" #include class Application; class OpmlContainer; class OpmlFeed; class Podcast; class StandardItemIconLoader; class PodcastDiscoveryModel : public QStandardItemModel { Q_OBJECT public: PodcastDiscoveryModel(Application* app, QObject* parent = 0); 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 // PODCASTDISCOVERYMODEL_H clementine-1.2.0+dfsg/src/podcasts/podcastdownloader.cpp000066400000000000000000000225061223327513400234120ustar00rootroot00000000000000/* 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 "podcastbackend.h" #include "podcastdownloader.h" #include "core/application.h" #include "core/logging.h" #include "core/network.h" #include "core/timeconstants.h" #include "core/utilities.h" #include "library/librarydirectorymodel.h" #include "library/librarymodel.h" #include #include #include #include #include #include const char* PodcastDownloader::kSettingsGroup = "Podcasts"; const int PodcastDownloader::kAutoDeleteCheckIntervalMsec = 15 * 60 * kMsecPerSec; // 15 minutes struct PodcastDownloader::Task { Task() : file(NULL) {} ~Task() { delete file; } PodcastEpisode episode; QFile* file; }; 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), delete_after_secs_(0), current_task_(NULL), last_progress_signal_(0), auto_delete_timer_(new QTimer(this)) { connect(backend_, SIGNAL(EpisodesAdded(QList)), SLOT(EpisodesAdded(QList))); connect(backend_, SIGNAL(SubscriptionAdded(Podcast)), SLOT(SubscriptionAdded(Podcast))); connect(app_, SIGNAL(SettingsChanged()), SLOT(ReloadSettings())); connect(auto_delete_timer_, SIGNAL(timeout()), SLOT(AutoDelete())); auto_delete_timer_->setInterval(kAutoDeleteCheckIntervalMsec); auto_delete_timer_->start(); 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(); delete_after_secs_ = s.value("delete_after", 0).toInt(); } void PodcastDownloader::DownloadEpisode(const PodcastEpisode& episode) { if (downloading_episode_ids_.contains(episode.database_id())) return; downloading_episode_ids_.insert(episode.database_id()); Task* task = new Task; task->episode = episode; if (current_task_) { // Add it to the queue queued_tasks_.enqueue(task); emit ProgressChanged(episode, Queued, 0); } else { // Start downloading now StartDownloading(task); } } void PodcastDownloader::DeleteEpisode(const PodcastEpisode& episode) { if (!episode.downloaded() || downloading_episode_ids_.contains(episode.database_id())) return; // 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()); backend_->UpdateEpisodes(PodcastEpisodeList() << episode_copy); } void PodcastDownloader::FinishAndDelete(Task* task) { downloading_episode_ids_.remove(task->episode.database_id()); emit ProgressChanged(task->episode, Finished, 0); delete task; NextTask(); } 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::StartDownloading(Task* task) { current_task_ = task; // Need to get the name of the podcast to use in the directory name. Podcast podcast = backend_->GetSubscriptionById(task->episode.podcast_database_id()); if (!podcast.is_valid()) { qLog(Warning) << "The podcast that contains episode" << task->episode.url() << "doesn't exist any more"; FinishAndDelete(task); return; } const QString directory = download_dir_ + "/" + SanitiseFilenameComponent(podcast.title()); const QString filepath = FilenameForEpisode(directory, task->episode); // Open the output file QDir().mkpath(directory); task->file = new QFile(filepath); if (!task->file->open(QIODevice::WriteOnly)) { qLog(Warning) << "Could not open the file" << filepath << "for writing"; FinishAndDelete(task); return; } qLog(Info) << "Downloading" << task->episode.url() << "to" << filepath; // Get the URL QNetworkRequest req(task->episode.url()); RedirectFollower* reply = new RedirectFollower(network_->get(req)); connect(reply, SIGNAL(readyRead()), SLOT(ReplyReadyRead())); connect(reply, SIGNAL(finished()), SLOT(ReplyFinished())); connect(reply, SIGNAL(downloadProgress(qint64,qint64)), SLOT(ReplyDownloadProgress(qint64,qint64))); emit ProgressChanged(task->episode, Downloading, 0); } void PodcastDownloader::NextTask() { current_task_ = NULL; if (!queued_tasks_.isEmpty()) { StartDownloading(queued_tasks_.dequeue()); } } void PodcastDownloader::ReplyReadyRead() { QNetworkReply* reply = qobject_cast(sender())->reply(); if (!reply || !current_task_ || !current_task_->file) return; forever { const qint64 bytes = reply->bytesAvailable(); if (bytes <= 0) break; current_task_->file->write(reply->read(bytes)); } } void PodcastDownloader::ReplyDownloadProgress(qint64 received, qint64 total) { if (!current_task_ || !current_task_->file || total < 1024) return; const time_t current_time = QDateTime::currentDateTime().toTime_t(); if (last_progress_signal_ == current_time) return; last_progress_signal_ = current_time; emit ProgressChanged(current_task_->episode, Downloading, float(received) / total * 100); } void PodcastDownloader::ReplyFinished() { RedirectFollower* reply = qobject_cast(sender()); if (!reply || !current_task_ || !current_task_->file) return; reply->deleteLater(); if (reply->error() != QNetworkReply::NoError) { qLog(Warning) << "Error downloading episode:" << reply->errorString(); // Delete the file current_task_->file->remove(); FinishAndDelete(current_task_); return; } qLog(Info) << "Download of" << current_task_->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 = backend_->GetEpisodeById(current_task_->episode.database_id()); episode.set_downloaded(true); episode.set_local_url(QUrl::fromLocalFile(current_task_->file->fileName())); backend_->UpdateEpisodes(PodcastEpisodeList() << episode); FinishAndDelete(current_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 QList& episodes) { if (auto_download_) { foreach (const PodcastEpisode& episode, episodes) { DownloadEpisode(episode); } } } void PodcastDownloader::AutoDelete() { if (delete_after_secs_ <= 0) { return; } QDateTime max_date = QDateTime::currentDateTime(); max_date.addSecs(-delete_after_secs_); PodcastEpisodeList old_episodes = backend_->GetOldDownloadedEpisodes(max_date); if (old_episodes.isEmpty()) return; qLog(Info) << "Deleting" << old_episodes.count() << "episodes because they were last listened to" << (delete_after_secs_ / kSecsPerDay) << "days ago"; foreach (const PodcastEpisode& episode, old_episodes) { DeleteEpisode(episode); } } clementine-1.2.0+dfsg/src/podcasts/podcastdownloader.h000066400000000000000000000051741223327513400230610ustar00rootroot00000000000000/* 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 PODCASTDOWNLOADER_H #define PODCASTDOWNLOADER_H #include "podcast.h" #include "podcastepisode.h" #include #include #include #include #include class Application; class PodcastBackend; class QNetworkAccessManager; class PodcastDownloader : public QObject { Q_OBJECT public: PodcastDownloader(Application* app, QObject* parent = 0); enum State { NotDownloading, Queued, Downloading, Finished }; static const char* kSettingsGroup; static const int kAutoDeleteCheckIntervalMsec; QString DefaultDownloadDir() const; public slots: // Adds the episode to the download queue void DownloadEpisode(const PodcastEpisode& episode); // Deletes downloaded data for this episode void DeleteEpisode(const PodcastEpisode& episode); signals: void ProgressChanged(const PodcastEpisode& episode, PodcastDownloader::State state, int percent); private slots: void ReloadSettings(); void SubscriptionAdded(const Podcast& podcast); void EpisodesAdded(const QList& episodes); void ReplyReadyRead(); void ReplyFinished(); void ReplyDownloadProgress(qint64 received, qint64 total); void AutoDelete(); private: struct Task; void StartDownloading(Task* task); void NextTask(); void FinishAndDelete(Task* task); 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_; int delete_after_secs_; Task* current_task_; QQueue queued_tasks_; QSet downloading_episode_ids_; time_t last_progress_signal_; QTimer* auto_delete_timer_; }; #endif // PODCASTDOWNLOADER_H clementine-1.2.0+dfsg/src/podcasts/podcastepisode.cpp000066400000000000000000000152121223327513400227000ustar00rootroot00000000000000/* 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 "podcast.h" #include "podcastepisode.h" #include "core/logging.h" #include "core/timeconstants.h" #include "core/utilities.h" #include #include #include #include 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(); 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()); ret.set_artist(author()); ret.set_length_nanosec(kNsecPerSec * duration_secs()); ret.set_year(publication_date().date().year()); ret.set_comment(description()); 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()); ret.set_art_automatic(podcast.ImageUrlLarge().toString()); } return ret; } clementine-1.2.0+dfsg/src/podcasts/podcastepisode.h000066400000000000000000000052271223327513400223520ustar00rootroot00000000000000/* 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 PODCASTEPISODE_H #define 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 // PODCASTEPISODE_H clementine-1.2.0+dfsg/src/podcasts/podcastinfowidget.cpp000066400000000000000000000065471223327513400234220ustar00rootroot00000000000000/* 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 "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_(NULL), 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)); foreach (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 = NULL) { const bool visible = !value.isEmpty(); label->setVisible(visible); if (buddy_label) { buddy_label->setVisible(visible); } if (visible) { label->setText(value); } } } 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.0+dfsg/src/podcasts/podcastinfowidget.h000066400000000000000000000026451223327513400230620ustar00rootroot00000000000000/* 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 PODCASTINFOWIDGET_H #define PODCASTINFOWIDGET_H #include "podcast.h" #include "covers/albumcoverloaderoptions.h" #include class Application; class Ui_PodcastInfoWidget; class QLabel; class PodcastInfoWidget : public QWidget { Q_OBJECT public: PodcastInfoWidget(QWidget* parent = 0); ~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 // PODCASTINFOWIDGET_H clementine-1.2.0+dfsg/src/podcasts/podcastinfowidget.ui000066400000000000000000000130201223327513400232350ustar00rootroot00000000000000 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.0+dfsg/src/podcasts/podcastparser.cpp000066400000000000000000000223611223327513400225470ustar00rootroot00000000000000/* 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 "opmlcontainer.h" #include "podcastparser.h" #include "core/logging.h" #include "core/utilities.h" #include #include 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; } foreach (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(); if (name == "title") { ret->set_title(reader->readElementText()); } else if (name == "link" && reader->namespaceUri().isEmpty()) { ret->set_link(QUrl::fromEncoded(reader->readElementText().toAscii())); } else if (name == "description") { ret->set_description(reader->readElementText()); } else if (name == "owner" && reader->namespaceUri() == kItunesNamespace) { ParseItunesOwner(reader, ret); } else if (name == "image") { ParseImage(reader, ret); } else if (name == "copyright") { ret->set_copyright(reader->readElementText()); } else if (name == "link" && reader->namespaceUri() == 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(); if (name == "title") { episode.set_title(reader->readElementText()); } else if (name == "description") { episode.set_description(reader->readElementText()); } else if (name == "pubDate") { episode.set_publication_date(Utilities::ParseRFC822DateTime(reader->readElementText())); } else if (name == "duration" && reader->namespaceUri() == 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" && reader->namespaceUri() == kItunesNamespace) { episode.set_author(reader->readElementText()); } else { Utilities::ConsumeCurrentElement(reader); } break; } case QXmlStreamReader::EndElement: 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.0+dfsg/src/podcasts/podcastparser.h000066400000000000000000000043241223327513400222130ustar00rootroot00000000000000/* 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 PODCASTPARSER_H #define 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 // PODCASTPARSER_H clementine-1.2.0+dfsg/src/podcasts/podcastservice.cpp000066400000000000000000000467151223327513400227240ustar00rootroot00000000000000/* 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 "addpodcastdialog.h" #include "opmlcontainer.h" #include "podcastbackend.h" #include "podcastdownloader.h" #include "podcastservice.h" #include "podcastservicemodel.h" #include "podcastupdater.h" #include "core/application.h" #include "core/logging.h" #include "core/mergedproxymodel.h" #include "internet/internetmodel.h" #include "library/libraryview.h" #include "ui/iconloader.h" #include "ui/standarditemiconloader.h" #include #include const char* PodcastService::kServiceName = "Podcasts"; const char* PodcastService::kSettingsGroup = "Podcasts"; class PodcastSortProxyModel : public QSortFilterProxyModel { public: PodcastSortProxyModel(QObject* parent = NULL); 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), icon_loader_(new StandardItemIconLoader(app->album_cover_loader(), this)), backend_(app->podcast_backend()), model_(new PodcastServiceModel(this)), proxy_(new PodcastSortProxyModel(this)), context_menu_(NULL), root_(NULL) { 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(QList)), SLOT(EpisodesAdded(QList))); connect(backend_, SIGNAL(EpisodesUpdated(QList)), SLOT(EpisodesUpdated(QList))); connect(app_->playlist_manager(), SIGNAL(CurrentSongChanged(Song)), SLOT(CurrentSongChanged(Song))); } 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::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,PodcastDownloader::State,int)), SLOT(DownloadProgressChanged(PodcastEpisode,PodcastDownloader::State,int))); if (default_icon_.isNull()) { default_icon_ = QIcon(":providers/podcast16.png"); } foreach (const Podcast& podcast, backend_->GetAllSubscriptions()) { parent->appendRow(CreatePodcastItem(podcast)); } } void PodcastService::UpdatePodcastText(QStandardItem* item, int unlistened_count) const { const Podcast podcast = item->data(Role_Podcast).value(); QString title = podcast.title(); 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, PodcastDownloader::State state, int percent) { const PodcastEpisode episode = item->data(Role_Episode).value(); QString title = episode.title(); 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 PodcastDownloader::Queued: if (queued_icon_.isNull()) { queued_icon_ = QIcon(":icons/22x22/user-away.png"); } icon = queued_icon_; tooltip = tr("Download queued"); break; case PodcastDownloader::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 PodcastDownloader::Finished: case PodcastDownloader::NotDownloading: break; } item->setFont(font); item->setText(title); item->setIcon(icon); } QStandardItem* PodcastService::CreatePodcastItem(const Podcast& podcast) { QStandardItem* item = new QStandardItem; // Add the episodes in this podcast and gather aggregate stats. int unlistened_count = 0; foreach (const PodcastEpisode& episode, backend_->GetEpisodes(podcast.database_id())) { if (!episode.listened()) { unlistened_count ++; } item->appendRow(CreatePodcastEpisodeItem(episode)); } 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()); 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())); 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())); } selected_episodes_.clear(); selected_podcasts_.clear(); explicitly_selected_podcasts_.clear(); QSet podcast_ids; foreach (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); 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); } } else { download_selected_action_->setEnabled(episodes); delete_downloaded_action_->setEnabled(episodes); } 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() { foreach (const QModelIndex& index, selected_podcasts_) { app_->podcast_updater()->UpdatePodcastNow( index.data(Role_Podcast).value()); } } void PodcastService::RemoveSelectedPodcast() { foreach (const QModelIndex& index, selected_podcasts_) { backend_->Unsubscribe(index.data(Role_Podcast).value()); } } void PodcastService::ReloadSettings() { QSettings s; s.beginGroup(LibraryView::kSettingsGroup); use_pretty_covers_ = s.value("pretty_covers", true).toBool(); // TODO: reload the podcast icons that are already loaded? } void PodcastService::EnsureAddPodcastDialogCreated() { if (!add_podcast_dialog_) { add_podcast_dialog_.reset(new AddPodcastDialog(app_)); } } void PodcastService::AddPodcast() { EnsureAddPodcastDialogCreated(); add_podcast_dialog_->show(); } 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 ; irowCount() ; ++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 QList& episodes) { QSet seen_podcast_ids; foreach (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; foreach (const PodcastEpisode& episode, backend_->GetEpisodes(database_id)) { if (!episode.listened()) { unlistened_count ++; } } UpdatePodcastText(parent, unlistened_count); seen_podcast_ids.insert(database_id); } } } void PodcastService::EpisodesUpdated(const QList& episodes) { QSet seen_podcast_ids; foreach (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; foreach (const PodcastEpisode& episode, backend_->GetEpisodes(podcast_database_id)) { if (!episode.listened()) { unlistened_count ++; } } UpdatePodcastText(parent, unlistened_count); seen_podcast_ids.insert(podcast_database_id); } } } void PodcastService::DownloadSelectedEpisode() { foreach (const QModelIndex& index, selected_episodes_) { app_->podcast_downloader()->DownloadEpisode( index.data(Role_Episode).value()); } } void PodcastService::DeleteDownloadedData() { foreach (const QModelIndex& index, selected_episodes_) { app_->podcast_downloader()->DeleteEpisode( index.data(Role_Episode).value()); } } void PodcastService::DownloadProgressChanged(const PodcastEpisode& episode, PodcastDownloader::State state, int percent) { QStandardItem* item = episodes_by_database_id_[episode.database_id()]; if (!item) return; UpdateEpisodeText(item, state, percent); } void PodcastService::ShowConfig() { app_->OpenSettingsDialogAtPage(SettingsDialog::Page_Podcasts); } void PodcastService::CurrentSongChanged(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.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() { SetListened(selected_episodes_, explicitly_selected_podcasts_, true); } void PodcastService::SetListened(const QModelIndexList& episode_indexes, const QModelIndexList& podcast_indexes, bool listened) { PodcastEpisodeList episodes; // Get all the episodes from the indexes. foreach (const QModelIndex& index, episode_indexes) { episodes << index.data(Role_Episode).value(); } foreach (const QModelIndex& podcast, podcast_indexes) { for (int i=0 ; irowCount(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 ; iset_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()); } } clementine-1.2.0+dfsg/src/podcasts/podcastservice.h000066400000000000000000000102731223327513400223570ustar00rootroot00000000000000/* 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 PODCASTSERVICE_H #define PODCASTSERVICE_H #include "podcastdownloader.h" #include "internet/internetmodel.h" #include "internet/internetservice.h" #include class AddPodcastDialog; 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); void ShowContextMenu(const QPoint& global_pos); void ReloadSettings(); // 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(); private slots: void UpdateSelectedPodcast(); 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 QList& episodes); void EpisodesUpdated(const QList& episodes); void DownloadProgressChanged(const PodcastEpisode& episode, PodcastDownloader::State state, int percent); void CurrentSongChanged(const Song& metadata); private: void EnsureAddPodcastDialogCreated(); void PopulatePodcastList(QStandardItem* parent); void UpdatePodcastText(QStandardItem* item, int unlistened_count) const; void UpdateEpisodeText(QStandardItem* item, PodcastDownloader::State state = PodcastDownloader::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 LazyLoadRoot(); private: bool use_pretty_covers_; 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_; QStandardItem* root_; QModelIndexList explicitly_selected_podcasts_; QModelIndexList selected_podcasts_; QModelIndexList selected_episodes_; QMap podcasts_by_database_id_; QMap episodes_by_database_id_; QScopedPointer add_podcast_dialog_; }; #endif // PODCASTSERVICE_H clementine-1.2.0+dfsg/src/podcasts/podcastservicemodel.cpp000066400000000000000000000055111223327513400237320ustar00rootroot00000000000000/* 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 "podcastservice.h" #include "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; foreach (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()); Song song = episode.ToSong(podcast); data->songs << song; *urls << song.url(); } } clementine-1.2.0+dfsg/src/podcasts/podcastservicemodel.h000066400000000000000000000024641223327513400234030ustar00rootroot00000000000000/* 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 PODCASTSERVICEMODEL_H #define PODCASTSERVICEMODEL_H #include class SongMimeData; class PodcastServiceModel : public QStandardItemModel { Q_OBJECT public: PodcastServiceModel(QObject* parent = 0); 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 // PODCASTSERVICEMODEL_H clementine-1.2.0+dfsg/src/podcasts/podcastsettingspage.cpp000066400000000000000000000123101223327513400237410ustar00rootroot00000000000000/* 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 "gpoddersync.h" #include "podcastdownloader.h" #include "podcastsettingspage.h" #include "ui_podcastsettingspage.h" #include "core/application.h" #include "core/closure.h" #include "core/timeconstants.h" #include "library/librarydirectorymodel.h" #include "library/librarymodel.h" #include "ui/settingsdialog.h" #include #include #include 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_->delete_after->setValue(s.value("delete_after", 0).toInt() / kSecsPerDay); 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("delete_after", ui_->delete_after->value() * kSecsPerDay); 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.0+dfsg/src/podcasts/podcastsettingspage.h000066400000000000000000000024361223327513400234160ustar00rootroot00000000000000/* 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 PODCASTSETTINGSPAGE_H #define PODCASTSETTINGSPAGE_H #include "ui/settingspage.h" class Ui_PodcastSettingsPage; class QNetworkReply; class PodcastSettingsPage : public SettingsPage { Q_OBJECT public: 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 // PODCASTSETTINGSPAGE_H clementine-1.2.0+dfsg/src/podcasts/podcastsettingspage.ui000066400000000000000000000167301223327513400236060ustar00rootroot00000000000000 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 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.0+dfsg/src/podcasts/podcastupdater.cpp000066400000000000000000000130231223327513400227120ustar00rootroot00000000000000/* 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 "podcastbackend.h" #include "podcastupdater.h" #include "podcasturlloader.h" #include "core/application.h" #include "core/closure.h" #include "core/logging.h" #include "core/qhash_qurl.h" #include "core/timeconstants.h" #include #include 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() { foreach (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; foreach (const PodcastEpisode& episode, app_->podcast_backend()->GetEpisodes(podcast.database_id())) { existing_urls.insert(episode.url()); } // Add any new episodes PodcastEpisodeList new_episodes; foreach (const Podcast& reply_podcast, reply->podcast_results()) { foreach (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.0+dfsg/src/podcasts/podcastupdater.h000066400000000000000000000033651223327513400223670ustar00rootroot00000000000000/* 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 PODCASTUPDATER_H #define 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: PodcastUpdater(Application* app, QObject* parent = 0); 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 // PODCASTUPDATER_H clementine-1.2.0+dfsg/src/podcasts/podcasturlloader.cpp000066400000000000000000000163051223327513400232450ustar00rootroot00000000000000/* 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 "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:", "http://www.youtube.com/rss/user/%1/videos.rss") << QuickPrefix("sc:", "http://soundcloud.com/%1") << QuickPrefix("fm4od:", "http://onapp1.orf.at/webcam/fm4/fod/%1.xspf") << QuickPrefix("ytpl:", "http://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.0+dfsg/src/podcasts/podcasturlloader.h000066400000000000000000000062071223327513400227120ustar00rootroot00000000000000/* 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 PODCASTURLLOADER_H #define 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: PodcastUrlLoader(QObject* parent = 0); ~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 // PODCASTURLLOADER_H clementine-1.2.0+dfsg/src/smartplaylists/000077500000000000000000000000001223327513400204405ustar00rootroot00000000000000clementine-1.2.0+dfsg/src/smartplaylists/generator.cpp000066400000000000000000000026211223327513400231330ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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/jamendodynamicplaylist.h" #include namespace smart_playlists { const int Generator::kDefaultLimit = 20; const int Generator::kDefaultDynamicHistory = 5; const int Generator::kDefaultDynamicFuture = 15; Generator::Generator() : QObject(NULL), backend_(NULL) { } 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.0+dfsg/src/smartplaylists/generator.h000066400000000000000000000053331223327513400226030ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 #include class LibraryBackend; namespace smart_playlists { class Generator : public QObject, public boost::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 boost::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.0+dfsg/src/smartplaylists/generator_fwd.h000066400000000000000000000017231223327513400234420ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 boost::shared_ptr GeneratorPtr; } // namespace #endif // PLAYLISTGENERATOR_FWD_H clementine-1.2.0+dfsg/src/smartplaylists/generatorinserter.cpp000066400000000000000000000047621223327513400247170ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/smartplaylists/generatorinserter.h000066400000000000000000000031421223327513400243530ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/smartplaylists/generatormimedata.h000066400000000000000000000021301223327513400242750ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/smartplaylists/querygenerator.cpp000066400000000000000000000044601223327513400242240ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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; foreach (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.0+dfsg/src/smartplaylists/querygenerator.h000066400000000000000000000030741223327513400236710ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/smartplaylists/querysearchpage.ui000066400000000000000000000072721223327513400241770ustar00rootroot00000000000000 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.0+dfsg/src/smartplaylists/querysortpage.ui000066400000000000000000000061661223327513400237220ustar00rootroot00000000000000 SmartPlaylistQuerySortPage 0 0 723 335 Form 0 Sorting Put songs in a random order true Sort songs by 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.0+dfsg/src/smartplaylists/querywizardplugin.cpp000066400000000000000000000236701223327513400247610ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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; foreach (SearchTermWidget* widget, terms_) { if (!widget->Term().is_valid()) return false; } return true; } QVBoxLayout* layout_; QList terms_; SearchTermWidget* new_term_; SearchPreview* preview_; boost::scoped_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_(NULL), 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 ; ifield_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) { boost::shared_ptr gen = boost::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(); foreach (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 { boost::shared_ptr gen(new QueryGenerator); gen->Load(MakeSearch()); return boost::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 foreach (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.0+dfsg/src/smartplaylists/querywizardplugin.h000066400000000000000000000037221223327513400244220ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "search.h" #include "wizardplugin.h" #include #include 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_; boost::scoped_ptr sort_ui_; int previous_scrollarea_max_; }; } // namespace smart_playlists #endif // QUERYWIZARDPLUGIN_H clementine-1.2.0+dfsg/src/smartplaylists/search.cpp000066400000000000000000000076231223327513400224210ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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; foreach (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; foreach (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.0+dfsg/src/smartplaylists/search.h000066400000000000000000000037611223327513400220650ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/smartplaylists/searchpreview.cpp000066400000000000000000000100171223327513400240120ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "searchpreview.h" #include "ui_searchpreview.h" #include "playlist/playlist.h" #include #include namespace smart_playlists { typedef QFuture Future; typedef QFutureWatcher FutureWatcher; SearchPreview::SearchPreview(QWidget *parent) : QWidget(parent), ui_(new Ui_SmartPlaylistSearchPreview), model_(NULL) { 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(NULL, NULL, 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_); boost::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_ = boost::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.0+dfsg/src/smartplaylists/searchpreview.h000066400000000000000000000031741223327513400234650ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); ~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.0+dfsg/src/smartplaylists/searchpreview.ui000066400000000000000000000047661223327513400236630ustar00rootroot00000000000000 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.0+dfsg/src/smartplaylists/searchterm.cpp000066400000000000000000000315531223327513400233100ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_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_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_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.0+dfsg/src/smartplaylists/searchterm.h000066400000000000000000000065211223327513400227520ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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, 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.0+dfsg/src/smartplaylists/searchtermwidget.cpp000066400000000000000000000313411223327513400245070ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 // 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*); 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_(NULL), 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; ifield->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(); foreach (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 = NULL; 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 = NULL; 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(NULL); } 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 = NULL; 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_ = NULL; 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(); } 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(); } } // namespace clementine-1.2.0+dfsg/src/smartplaylists/searchtermwidget.h000066400000000000000000000040401223327513400241500ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/smartplaylists/searchtermwidget.ui000066400000000000000000000202531223327513400243420ustar00rootroot00000000000000 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.0+dfsg/src/smartplaylists/wizard.cpp000066400000000000000000000113471223327513400224520ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 ; itype() == 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.0+dfsg/src/smartplaylists/wizard.h000066400000000000000000000031661223327513400221170ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/smartplaylists/wizardfinishpage.ui000066400000000000000000000031361223327513400243400ustar00rootroot00000000000000 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.0+dfsg/src/smartplaylists/wizardplugin.cpp000066400000000000000000000021251223327513400236630ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/smartplaylists/wizardplugin.h000066400000000000000000000031501223327513400233270ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/songinfo/000077500000000000000000000000001223327513400171675ustar00rootroot00000000000000clementine-1.2.0+dfsg/src/songinfo/artistinfoview.cpp000066400000000000000000000041551223327513400227550ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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::ResultReady(int id, const SongInfoFetcher::Result& result) { if (id != current_request_id_) return; Clear(); if (!result.images_.isEmpty()) { // Image view goes at the top PrettyImageView* image_view = new PrettyImageView(network_, this); AddWidget(image_view); foreach (const QUrl& url, result.images_) { image_view->AddImage(url); } } foreach (const CollapsibleInfoPane::Data& data, result.info_) { AddSection(new CollapsibleInfoPane(data, this)); } CollapseSections(); } clementine-1.2.0+dfsg/src/songinfo/artistinfoview.h000066400000000000000000000024031223327513400224140ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); ~ArtistInfoView(); protected: 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.0+dfsg/src/songinfo/collapsibleinfoheader.cpp000066400000000000000000000110631223327513400242120ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/songinfo/collapsibleinfoheader.h000066400000000000000000000035401223327513400236600ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); 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.0+dfsg/src/songinfo/collapsibleinfopane.cpp000066400000000000000000000040451223327513400237070ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/songinfo/collapsibleinfopane.h000066400000000000000000000032241223327513400233520ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); 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.0+dfsg/src/songinfo/echonestbiographies.cpp000066400000000000000000000074531223327513400237310ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "songinfotextview.h" #include "core/logging.h" #include #include struct EchoNestBiographies::Request { Request(int id) : id_(id), artist_(new Echonest::Artist) {} int id_; boost::scoped_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) { boost::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; foreach (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; 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. QString copy(bio.text()); copy.replace(" ","

"); editor->SetHtml(copy); } else { editor->SetHtml(bio.text()); } data.contents_ = editor; emit InfoReady(request->id_, data); } emit Finished(request->id_); } clementine-1.2.0+dfsg/src/songinfo/echonestbiographies.h000066400000000000000000000024301223327513400233640ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "songinfoprovider.h" #include 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 boost::shared_ptr RequestPtr; QMap requests_; }; #endif // ECHONESTBIOGRAPHIES_H clementine-1.2.0+dfsg/src/songinfo/echonestimages.cpp000066400000000000000000000035561223327513400227020ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "core/logging.h" #include #include struct EchoNestImages::Request { Request(int id) : id_(id), artist_(new Echonest::Artist) {} int id_; boost::scoped_ptr artist_; }; void EchoNestImages::FetchInfo(int id, const Song& metadata) { boost::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(); } foreach (const Echonest::ArtistImage& image, request->artist_->images()) { emit ImageReady(request->id_, image.url()); } emit Finished(request->id_); } clementine-1.2.0+dfsg/src/songinfo/echonestimages.h000066400000000000000000000022371223327513400223420ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "songinfoprovider.h" #include class QNetworkReply; class EchoNestImages : public SongInfoProvider { Q_OBJECT public: void FetchInfo(int id, const Song& metadata); private slots: void RequestFinished(); private: struct Request; typedef boost::shared_ptr RequestPtr; QMap requests_; }; #endif // ECHONESTIMAGES_H clementine-1.2.0+dfsg/src/songinfo/echonestsimilarartists.cpp000066400000000000000000000045521223327513400245040ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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")); foreach (const Echonest::Artist& artist, artists) { widget->AddTag(artist.name()); if (widget->count() >= 10) break; } emit InfoReady(id, data); } emit Finished(id); } clementine-1.2.0+dfsg/src/songinfo/echonestsimilarartists.h000066400000000000000000000021231223327513400241410ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/songinfo/echonesttags.cpp000066400000000000000000000045141223327513400223660ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "tagwidget.h" #include "core/logging.h" #include #include struct EchoNestTags::Request { Request(int id) : id_(id), artist_(new Echonest::Artist) {} int id_; boost::scoped_ptr artist_; }; void EchoNestTags::FetchInfo(int id, const Song& metadata) { boost::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_); foreach (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.0+dfsg/src/songinfo/echonesttags.h000066400000000000000000000022271223327513400220320ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "songinfoprovider.h" #include class QNetworkReply; class EchoNestTags : public SongInfoProvider { Q_OBJECT public: void FetchInfo(int id, const Song& metadata); private slots: void RequestFinished(); private: struct Request; typedef boost::shared_ptr RequestPtr; QMap requests_; }; #endif // ECHONESTTAGS_H clementine-1.2.0+dfsg/src/songinfo/lastfmtrackinfoprovider.cpp000066400000000000000000000107221223327513400246370ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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/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_); foreach (const lastfm::XmlQuery& e, q["track"]["toptags"].children("tag")) { widget->AddTag(e["name"].text()); } emit InfoReady(id, data); } clementine-1.2.0+dfsg/src/songinfo/lastfmtrackinfoprovider.h000066400000000000000000000024501223327513400243030ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/songinfo/songinfobase.cpp000066400000000000000000000153221223327513400223530ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_(NULL), 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))); } 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 ( ; indexdata() < 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. QTimer::singleShot(0, fader_, SLOT(StartBlur())); } void SongInfoBase::ResultReady(int id, const SongInfoFetcher::Result& result) { foreach (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_; foreach (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(); } } } foreach (CollapsibleInfoPane::Data::Type type, types_.keys()) { if (!has_user_preference_.contains(type)) { // Expand the first one types_.values(type).last()->Expand(); } } foreach (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() { foreach (CollapsibleInfoPane* pane, sections_) { QWidget* contents = pane->data().contents_; if (!contents) continue; QMetaObject::invokeMethod(contents, "ReloadSettings"); } QSettings s; s.beginGroup(kSettingsGroup); fetcher_->set_timeout(s.value("timeout", SongInfoFetcher::kDefaultTimeoutDuration).toInt()); } 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.0+dfsg/src/songinfo/songinfobase.h000066400000000000000000000045361223327513400220250ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); 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 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.0+dfsg/src/songinfo/songinfofetcher.cpp000066400000000000000000000065141223327513400230640ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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))); connect(provider, SIGNAL(InfoReady(int,CollapsibleInfoPane::Data)), SLOT(InfoReady(int,CollapsibleInfoPane::Data))); connect(provider, SIGNAL(Finished(int)), SLOT(ProviderFinished(int))); } 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())); foreach (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; } 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 foreach (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.0+dfsg/src/songinfo/songinfofetcher.h000066400000000000000000000036451223327513400225330ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); struct Result { QList images_; QList info_; }; static const int kDefaultTimeoutDuration = 2500; // msec void set_timeout(int msec) { timeout_duration_ = msec; } void AddProvider(SongInfoProvider* provider); int FetchInfo(const Song& metadata); QList providers() const { return providers_; } signals: 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.0+dfsg/src/songinfo/songinfoprovider.cpp000066400000000000000000000016071223327513400232740ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/songinfo/songinfoprovider.h000066400000000000000000000025701223327513400227410ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/songinfo/songinfosettingspage.cpp000066400000000000000000000107341223327513400241400ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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()); ui_->song_info_timeout->setValue( s.value("timeout", SongInfoFetcher::kDefaultTimeoutDuration).toInt()); s.endGroup(); QList providers = dialog()->song_info_view()->lyric_providers(); ui_->providers->clear(); foreach (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.setValue("timeout", ui_->song_info_timeout->value()); s.endGroup(); s.beginGroup(SongInfoView::kSettingsGroup); QVariantList search_order; for (int i=0 ; iproviders->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.0+dfsg/src/songinfo/songinfosettingspage.h000066400000000000000000000025221223327513400236010ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/songinfo/songinfosettingspage.ui000066400000000000000000000121061223327513400237660ustar00rootroot00000000000000 SongInfoSettingsPage 0 0 625 556 Song Information 0 0 Appearance Font size pt 1 5.000000000000000 50.000000000000000 0.500000000000000 Preview 16777215 100 true Network Timeout ms 1000 60000 2500 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.0+dfsg/src/songinfo/songinfotextview.cpp000066400000000000000000000061401223327513400233160ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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

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.0+dfsg/src/songinfo/ultimatelyricslyric.h000066400000000000000000000020031223327513400234500ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); void SetHtml(const QString& html); }; #endif // ULTIMATELYRICSLYRIC_H clementine-1.2.0+dfsg/src/songinfo/ultimatelyricsprovider.cpp000066400000000000000000000205741223327513400245300ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 #include const int UltimateLyricsProvider::kRedirectLimit = 5; UltimateLyricsProvider::UltimateLyricsProvider() : network_(new NetworkAccessManager(this)), relevance_(0), redirect_count_(0) { } 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) return; int id = requests_.take(reply); reply->deleteLater(); if (reply->error() != QNetworkReply::NoError) { emit Finished(id); return; } // Handle redirects QVariant redirect_target = reply->attribute(QNetworkRequest::RedirectionTargetAttribute); if (redirect_target.isValid()) { if (redirect_count_ >= kRedirectLimit) { 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 foreach (const QString& indicator, invalid_indicators_) { if (original_content.contains(indicator)) { qLog(Debug) << "Found invalid indicator" << indicator; emit Finished(id); return; } } // Apply extract rules foreach (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; ApplyExtractRule(rule_copy, &content); qLog(Debug) << "Extract rule" << rule_copy << "matched" << content.length(); if (!content.isEmpty()) { lyrics = content; break; } } // Apply exclude rules foreach (const Rule& rule, exclude_rules_) { ApplyExcludeRule(rule, &lyrics); } if (!lyrics.isEmpty()) { 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); } emit Finished(id); } void UltimateLyricsProvider::ApplyExtractRule(const Rule& rule, QString* content) const { foreach (const RuleItem& item, rule) { if (item.second.isNull()) { *content = ExtractXmlTag(*content, item.first); } else { *content = Extract(*content, item.first, item.second); } } } 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 { foreach (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); foreach (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; } clementine-1.2.0+dfsg/src/songinfo/ultimatelyricsprovider.h000066400000000000000000000061621223327513400241720ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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: void ApplyExtractRule(const Rule& rule, QString* content) const; void ApplyExcludeRule(const Rule& rule, QString* content) const; 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); 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_; }; #endif // ULTIMATELYRICSPROVIDER_H clementine-1.2.0+dfsg/src/songinfo/ultimatelyricsreader.cpp000066400000000000000000000100361223327513400241300ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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("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.0+dfsg/src/songinfo/ultimatelyricsreader.h000066400000000000000000000026711223327513400236030ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); 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.0+dfsg/src/transcoder/000077500000000000000000000000001223327513400175115ustar00rootroot00000000000000clementine-1.2.0+dfsg/src/transcoder/transcodedialog.cpp000066400000000000000000000173301223327513400233630ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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/mainwindow.h" #include "widgets/fileview.h" #include #include #include #include // winspool.h defines this :( #ifdef AddJob # undef AddJob #endif const char* TranscodeDialog::kSettingsGroup = "Transcoder"; const int TranscodeDialog::kProgressInterval = 500; 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); foreach (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(); QString last_output_format = s.value("last_output_format", "ogg").toString(); for (int i=0 ; iformat->count() ; ++i) { if (last_output_format == ui_->format->itemData(i).value().extension_) { 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_->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(transcoder_, SIGNAL(JobComplete(QString,bool)), SLOT(JobComplete(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 ; irowCount() ; ++i) { QString filename = file_model->index(i, 0).data(Qt::UserRole).toString(); transcoder_->AddJob(filename, preset); } // 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.extension_); } void TranscodeDialog::Cancel() { transcoder_->Cancel(); SetWorking(false); } void TranscodeDialog::JobComplete(const QString& filename, bool success) { (*(success ? &finished_success_ : &finished_failed_)) ++; queued_ --; UpdateStatusText(); UpdateProgress(); } void TranscodeDialog::UpdateProgress() { int progress = (finished_success_ + finished_failed_) * 100; QMap current_jobs = transcoder_->GetProgress(); foreach (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::SetFilenames(const QStringList &filenames) { foreach (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(); } } clementine-1.2.0+dfsg/src/transcoder/transcodedialog.h000066400000000000000000000035441223327513400230320ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 class Transcoder; class Ui_TranscodeDialog; class Ui_TranscodeLogDialog; class TranscodeDialog : public QDialog { Q_OBJECT public: TranscodeDialog(QWidget* parent = 0); ~TranscodeDialog(); static const char* kSettingsGroup; static const int kProgressInterval; void SetFilenames(const QStringList& filenames); protected: void timerEvent(QTimerEvent* e); private slots: void Add(); void Remove(); void Start(); void Cancel(); void JobComplete(const QString& filename, bool success); void LogLine(const QString& message); void AllJobsComplete(); void Options(); private: void SetWorking(bool working); void UpdateStatusText(); void UpdateProgress(); 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_; Transcoder* transcoder_; int queued_; int finished_success_; int finished_failed_; }; #endif // TRANSCODEDIALOG_H clementine-1.2.0+dfsg/src/transcoder/transcodedialog.ui000066400000000000000000000131071223327513400232140ustar00rootroot00000000000000 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 Output options Audio format 0 0 Options... Destination Alongside the originals Progress 0 0 Qt::RichText Details... QDialogButtonBox::Cancel|QDialogButtonBox::Close files add remove format destination button_box clementine-1.2.0+dfsg/src/transcoder/transcodelogdialog.ui000066400000000000000000000025331223327513400237170ustar00rootroot00000000000000 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.0+dfsg/src/transcoder/transcoder.cpp000066400000000000000000000445331223327513400223720ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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" using boost::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 NULL; // 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_default(); 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(factory->details.klass).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_PLUGIN_FEATURE_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 NULL; // 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 NULL; } // Link the elements together gst_element_link_many(lame, xing, id3v2, NULL); // 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) : QObject(parent), max_threads_(QThread::idealThreadCount()) { if (JobFinishedEvent::sEventType == -1) JobFinishedEvent::sEventType = QEvent::registerEventType(); // Initialise some settings for the lamemp3enc element. QSettings s; s.beginGroup("Transcoder/lamemp3enc"); 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, "Flac", "flac", "audio/x-flac"); case Song::Type_Mp4: return TranscoderPreset(type, "M4A AAC", "mp4", "audio/mpeg, mpegversion=(int)4", "audio/mp4"); case Song::Type_Mpeg: return TranscoderPreset(type, "MP3", "mp3", "audio/mpeg, mpegversion=(int)1, layer=(int)3"); case Song::Type_OggVorbis: return TranscoderPreset(type, "Ogg Vorbis", "ogg", "audio/x-vorbis", "application/ogg"); case Song::Type_OggFlac: return TranscoderPreset(type, "Ogg Flac", "ogg", "audio/x-flac", "application/ogg"); case Song::Type_OggSpeex: return TranscoderPreset(type, "Ogg Speex", "spx", "audio/x-speex", "application/ogg"); case Song::Type_OggOpus: return TranscoderPreset(type, "Ogg Opus", "opus", "audio/x-opus", "application/ogg"); case Song::Type_Asf: return TranscoderPreset(type, "Windows Media audio", "wma", "audio/x-wma", "video/x-ms-asf"); case Song::Type_Wav: return TranscoderPreset(type, "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; foreach (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").arg(job.output).arg(i); if (!QFile::exists(new_filename)) { job.output = new_filename; break; } } } 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, false); return FailedToStart; } void Transcoder::NewPadCallback(GstElement*, GstPad* pad, gboolean, 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); } gboolean Transcoder::BusCallback(GstBus*, GstMessage* msg, gpointer data) { JobState* state = reinterpret_cast(data); switch (GST_MESSAGE_TYPE(msg)) { case GST_MESSAGE_ERROR: state->ReportError(msg); state->PostFinished(false); break; default: break; } return GST_BUS_DROP; } 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("decodebin2", 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, NULL); else if (codec) gst_element_link_many(convert, resample, codec, sink, NULL); else if (muxer) gst_element_link_many(convert, resample, muxer, sink, NULL); // Set properties g_object_set(src, "location", job.input.toUtf8().constData(), NULL); g_object_set(sink, "location", job.output.toUtf8().constData(), NULL); // Set callbacks state->convert_element_ = convert; CHECKED_GCONNECT(decode, "new-decoded-pad", &NewPadCallback, state.get()); gst_bus_set_sync_handler(gst_pipeline_get_bus(GST_PIPELINE(state->pipeline_)), BusCallbackSync, state.get()); state->bus_callback_id_ = gst_bus_add_watch(gst_pipeline_get_bus(GST_PIPELINE(state->pipeline_)), BusCallback, state.get()); // 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 filename = (*it)->job_.input; // 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_)), NULL, NULL); g_source_remove(finished_event->state_->bus_callback_id_); // Remove it from the list - this will also destroy the GStreamer pipeline current_jobs_.erase(it); // Emit the finished signal emit JobComplete(filename, 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_)), NULL, NULL); g_source_remove(state->bus_callback_id_); // 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_, NULL, NULL, GST_CLOCK_TIME_NONE); } // Remove the job, this destroys the GStreamer pipeline too it = current_jobs_.erase(it); } } QMap Transcoder::GetProgress() const { QMap ret; foreach (boost::shared_ptr state, current_jobs_) { if (!state->pipeline_) continue; gint64 position = 0; gint64 duration = 0; GstFormat format = GST_FORMAT_TIME; gst_element_query_position(state->pipeline_, &format, &position); gst_element_query_duration(state->pipeline_, &format, &duration); ret[state->job_.input] = float(position) / duration; } return ret; } void Transcoder::SetElementProperties(const QString& name, GObject* object) { QSettings s; s.beginGroup("Transcoder/" + name); guint properties_count = 0; GParamSpec** properties = g_object_class_list_properties( G_OBJECT_GET_CLASS(object), &properties_count); for (int i=0 ; iname); 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(), NULL); break; case G_TYPE_FLOAT: g_object_set(object, property->name, value.toFloat(), NULL); break; case G_TYPE_BOOLEAN: g_object_set(object, property->name, value.toInt(), NULL); break; case G_TYPE_INT: default: g_object_set(object, property->name, value.toInt(), NULL); break; } } g_free(properties); } clementine-1.2.0+dfsg/src/transcoder/transcoder.h000066400000000000000000000102041223327513400220230ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 #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 = 0); 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()); QMap GetProgress() const; int QueuedJobsCount() const { return queued_jobs_.count(); } public slots: void Start(); void Cancel(); signals: void JobComplete(const QString& filename, 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_(NULL), convert_element_(NULL), bus_callback_id_(0) {} ~JobState(); void PostFinished(bool success); void ReportError(GstMessage* msg); Job job_; Transcoder* parent_; GstElement* pipeline_; GstElement* convert_element_; int bus_callback_id_; }; // 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 = NULL, const QString& name = QString()); GstElement* CreateElementForMimeType(const QString& element_type, const QString& mime_type, GstElement* bin = NULL); void SetElementProperties(const QString& name, GObject* element); static void NewPadCallback(GstElement*, GstPad* pad, gboolean, gpointer data); static gboolean BusCallback(GstBus*, GstMessage* msg, gpointer data); static GstBusSyncReply BusCallbackSync(GstBus*, GstMessage* msg, gpointer data); private: typedef QList > JobStateList; int max_threads_; QList queued_jobs_; JobStateList current_jobs_; }; #endif // TRANSCODER_H clementine-1.2.0+dfsg/src/transcoder/transcoderoptionsaac.cpp000066400000000000000000000035561223327513400244530ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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); 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); 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.0+dfsg/src/transcoder/transcoderoptionsaac.h000066400000000000000000000022111223327513400241030ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); ~TranscoderOptionsAAC(); void Load(); void Save(); private: static const char* kSettingsGroup; Ui_TranscoderOptionsAAC* ui_; }; #endif // TRANSCODEROPTIONSAAC_H clementine-1.2.0+dfsg/src/transcoder/transcoderoptionsaac.ui000066400000000000000000000106761223327513400243070ustar00rootroot00000000000000 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.0+dfsg/src/transcoder/transcoderoptionsdialog.cpp000066400000000000000000000046071223327513400251640ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_(NULL) { 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(); } clementine-1.2.0+dfsg/src/transcoder/transcoderoptionsdialog.h000066400000000000000000000024521223327513400246250ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); ~TranscoderOptionsDialog(); bool is_valid() const { return options_; } void accept(); protected: void showEvent(QShowEvent* e); private: Ui_TranscoderOptionsDialog* ui_; TranscoderOptionsInterface* options_; }; #endif // TRANSCODEROPTIONSDIALOG_H clementine-1.2.0+dfsg/src/transcoder/transcoderoptionsdialog.ui000066400000000000000000000027131223327513400250130ustar00rootroot00000000000000 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.0+dfsg/src/transcoder/transcoderoptionsflac.cpp000066400000000000000000000026111223327513400246230ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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); ui_->quality->setValue(s.value("quality", 5).toInt()); } void TranscoderOptionsFlac::Save() { QSettings s; s.beginGroup(kSettingsGroup); s.setValue("quality", ui_->quality->value()); } clementine-1.2.0+dfsg/src/transcoder/transcoderoptionsflac.h000066400000000000000000000022211223327513400242650ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); ~TranscoderOptionsFlac(); void Load(); void Save(); private: static const char* kSettingsGroup; Ui_TranscoderOptionsFlac* ui_; }; #endif // TRANSCODEROPTIONSFLAC_H clementine-1.2.0+dfsg/src/transcoder/transcoderoptionsflac.ui000066400000000000000000000027511223327513400244630ustar00rootroot00000000000000 TranscoderOptionsFlac 0 0 400 102 Form Quality Fast 9 5 Qt::Horizontal QSlider::TicksBelow Best clementine-1.2.0+dfsg/src/transcoder/transcoderoptionsinterface.h000066400000000000000000000021071223327513400253230ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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; }; #endif // TRANSCODEROPTIONSINTERFACE_H clementine-1.2.0+dfsg/src/transcoder/transcoderoptionsmp3.cpp000066400000000000000000000050161223327513400244170ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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);; 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); 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.0+dfsg/src/transcoder/transcoderoptionsmp3.h000066400000000000000000000023711223327513400240650ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); ~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.0+dfsg/src/transcoder/transcoderoptionsmp3.ui000066400000000000000000000170231223327513400242530ustar00rootroot00000000000000 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.0+dfsg/src/transcoder/transcoderoptionsopus.cpp000066400000000000000000000030701223327513400247040ustar00rootroot00000000000000/* 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); ui_->bitrate_slider->setValue(s.value("bitrate", 128000).toInt() / 1000); } void TranscoderOptionsOpus::Save() { QSettings s; s.beginGroup(kSettingsGroup); s.setValue("bitrate", ui_->bitrate_slider->value() * 1000); } clementine-1.2.0+dfsg/src/transcoder/transcoderoptionsopus.h000066400000000000000000000022311223327513400243470ustar00rootroot00000000000000/* 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 = 0); ~TranscoderOptionsOpus(); void Load(); void Save(); private: static const char* kSettingsGroup; Ui_TranscoderOptionsOpus* ui_; }; #endif // TRANSCODEROPTIONSOPUS_H clementine-1.2.0+dfsg/src/transcoder/transcoderoptionsopus.ui000066400000000000000000000042601223327513400245410ustar00rootroot00000000000000 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.0+dfsg/src/transcoder/transcoderoptionsspeex.cpp000066400000000000000000000044211223327513400250430ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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); 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); 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.0+dfsg/src/transcoder/transcoderoptionsspeex.h000066400000000000000000000022311223327513400245050ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); ~TranscoderOptionsSpeex(); void Load(); void Save(); private: static const char* kSettingsGroup; Ui_TranscoderOptionsSpeex* ui_; }; #endif // TRANSCODEROPTIONSSPEEX_H clementine-1.2.0+dfsg/src/transcoder/transcoderoptionsspeex.ui000066400000000000000000000210001223327513400246660ustar00rootroot00000000000000 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.0+dfsg/src/transcoder/transcoderoptionsvorbis.cpp000066400000000000000000000046101223327513400252230ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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); #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); #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.0+dfsg/src/transcoder/transcoderoptionsvorbis.h000066400000000000000000000022411223327513400246660ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); ~TranscoderOptionsVorbis(); void Load(); void Save(); private: static const char* kSettingsGroup; Ui_TranscoderOptionsVorbis* ui_; }; #endif // TRANSCODEROPTIONSVORBIS_H clementine-1.2.0+dfsg/src/transcoder/transcoderoptionsvorbis.ui000066400000000000000000000223061223327513400250600ustar00rootroot00000000000000 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.0+dfsg/src/transcoder/transcoderoptionswma.cpp000066400000000000000000000026441223327513400245100ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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); ui_->bitrate_slider->setValue(s.value("bitrate", 128000).toInt() / 1000); } void TranscoderOptionsWma::Save() { QSettings s; s.beginGroup(kSettingsGroup); s.setValue("bitrate", ui_->bitrate_slider->value() * 1000); } clementine-1.2.0+dfsg/src/transcoder/transcoderoptionswma.h000066400000000000000000000022111223327513400241430ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); ~TranscoderOptionsWma(); void Load(); void Save(); private: static const char* kSettingsGroup; Ui_TranscoderOptionsWma* ui_; }; #endif // TRANSCODEROPTIONSWMA_H clementine-1.2.0+dfsg/src/transcoder/transcoderoptionswma.ui000066400000000000000000000041371223327513400243420ustar00rootroot00000000000000 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.0+dfsg/src/transcoder/transcodersettingspage.cpp000066400000000000000000000031751223327513400250050ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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->Load(); } clementine-1.2.0+dfsg/src/transcoder/transcodersettingspage.h000066400000000000000000000021511223327513400244430ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/transcoder/transcodersettingspage.ui000066400000000000000000000131431223327513400246340ustar00rootroot00000000000000 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.0+dfsg/src/translations/000077500000000000000000000000001223327513400200665ustar00rootroot00000000000000clementine-1.2.0+dfsg/src/translations/af.po000066400000000000000000004520071223327513400210240ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # JP Meijers , 2012 # JP Meijers , 2012 # dolf , 2013 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 20:44+0000\n" "Last-Translator: dolf \n" "Language-Team: Afrikaans (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr "dae" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr "kbps" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr "ms" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr "pte" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr "sekondes" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "liedjies" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 albums" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 dae" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 dae terug" #: podcasts/gpoddersync.cpp:79 #, qt-format msgid "%1 on %2" msgstr "%1 op %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 afspeellys (%2)" #: playlist/playlistmanager.cpp:413 #, qt-format msgid "%1 selected of" msgstr "%1 gekies uit" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 liedjie" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 liedjies" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 liedjies gevind" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 liedjies gevind (%2 word getoon)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 snitte" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 oorgedra" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimotedev module" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, qt-format msgid "%L1 other listeners" msgstr "%L1 ander luisteraars" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 keer afgespeel" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n onsuksesvol" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n voltooi" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "&Eie keuse" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "&Ekstras" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "&Hulp" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "&Steek %1 weg" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "&Steek weg..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Links" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "&Musiek" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Geen" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "&Afspeellys" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Maak toe" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "&Herhaal tipe" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Regs" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "&Skommel tipe" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "&Rek kolomme om in venster te pas" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "&Gereedskap" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(verskillend tussen tale)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "...en almal wat bygedra het tot Amarok" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "0px" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 dag" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 snit" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "127.0.0.1" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "40%" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 willekeurige snitte" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "Gradeer nou op na Premium" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "'n Grooveshark Anywhere-rekening word benodig." #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "'n Spotify Premium-rekening word benodig." #: ../bin/src/ui_networkremotesettingspage.h:189 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:78 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:153 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "'n Liedjie sal ingesluit word in die afspeellys as dit aan hierdie kriteria voldoen." #: smartplaylists/searchterm.cpp:297 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "Alle glorie aan die HYPNOpadda" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "Staak" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "Meer oor %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "Meer oor Clementine..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "Meer oor QT..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Rekening details" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "Rekening details (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Aksie" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Aktiveer/Deaktiveer Wii-afstandsbeheer" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "Voeg potgooi by" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Voeg Stroom by" #: ../bin/src/ui_notificationssettingspage.h:425 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:193 msgid "Add action" msgstr "Voeg aksie by" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Voeg nog 'n stroom by..." #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Voeg gids by..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "Voeg lêer by" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Voeg lêer by..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Voeg lêers by om te transkodeer" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Voeg vouer by" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Voeg vouer by..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Voeg nuwe vouer by..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "Voeg potgooi by" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "Voeg potgooi by..." #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Voeg soekterm by" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "Voeg album-etiket by liedjie" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "Voeg albumkunstenaar-etiket by liedjie" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "Voeg kunstenaar-etiket by liedjie" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "Voeg komponis-etiket by liedjie" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "Voeg plaat-etiket by liedjie" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "Voeg liedjie se lêernaam by" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "Voeg genre-etiket by liedjie" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "Voeg liedjie se lengte as 'n etiket by" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "Voeg aantal keer afgespeel by" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "Voeg aantal keer oorgeslaan by" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "Voeg liedjienaam-etiket by" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "Voeg liedjie se snitnommer as 'n etiket by" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "Voeg liedjie se jaar by as 'n etiket" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Voeg stroom by..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "Voeg toe aan Grooveshark gunstelinge" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "Voeg toe aan Grooveshark afspeellys" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "Voeg by 'n ander afspeellys by" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Voeg by 'n afspeellys by" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "Voeg aan die einde van die tou by" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Voeg wiimotedev-aksie by" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Voeg by.." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Hierdie maand bygevoeg" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Hierdie week bygevoeg" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Hierdie jaar bygevoeg" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Vandag bygevoeg" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Afgelope 3 maande bygevoeg" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "Liedjies word by My Musiek gevoeg" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "Word toegevoeg tot gunstelinge" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Gevorderde groeperings" #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "Na" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "Na kopiëring..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Album (ideale hardheid vir alle snitte)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Albumkunstenaar" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "Album omslag" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Album se inligting op jamendo.com..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Albums met omslagte" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Albums sonder omslagte" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Alle lêers (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "Alle glorie aan die Hypnopadda!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Alle albums" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Alle kunstenaars" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "Alle lêers (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Alle afspeellyste (%1)" #: ui/about.cpp:74 msgid "All the translators" msgstr "Al die vertalers" #: library/library.cpp:84 msgid "All tracks" msgstr "Alle snitte" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "Laat \"mid/side\"-enkodering toe." #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "Naas die oorspronlikes" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Steek altyd die hoofvenster weg" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Wys altyd die hoofvenster" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "Begin altyd dadelik speel" #: internet/spotifyblobdownloader.cpp:60 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:61 msgid "An error occurred loading the iTunes database" msgstr "'n Fout het plaasgevind tydens die laai van die iTunes-databasis" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "'n Fout het plaasgevind tydens die skryf van metadata na '%1'" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "'n Onbekende fout het voorgekom" #: ui/about.cpp:78 msgid "And:" msgstr "En:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "Kwaai" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Voorkoms" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Voeg lêers/URLs by die afspeellys by" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "Voeg by huidige afspeellys by" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "Voeg by afspeellys by" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "Doen kompressie om afkapping te voorkom" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Is jy seker jy wil die \"%1\" opstellingspatroon verwyder?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "Is jy seker jy wil hierdie afspeellys verwyder?" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "Is jy seker jy wil die liedjie se statistieke herstel?" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Kunstenaar" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Kunstenaar" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "Kunstenaarsradio" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "Kunstenaarsetikette" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "Kunstenaar se voorletters" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Oudioformaat" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Aanteken onsuksesvol" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "Outeur" #: ui/about.cpp:65 msgid "Authors" msgstr "Outeurs" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Outomaties" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Outomatiese opdatering" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "Maak outomaties kortspeelalbum-kategorië oop in jou versamelingboom" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "Beskikbaar" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "Gemiddelde bistempo" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "Gemiddelde beeldgrootte" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "BBC potgooi" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "SPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "Agtergrond strome" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Agtergrondkleur" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "Agtergrond prentjie" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Agtergrond deurskynendheid" #: core/database.cpp:734 msgid "Backing up database" msgstr "Databasis word gerugsteun" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Verban" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "Balkanaliseerder" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Eenvoudig Blou" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "Basies oudio tipe" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Gedrag" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "Beste" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "Biografie vanaf %1" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Bistempo" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "Bistempo" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "Blokanaliseerder" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "Blok tipe" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "Liggaam" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "Boem!-analiseerder" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "Boks" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Gaan soek..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "Buffering" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "Maar hierdie bronne is afgeskakel:" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Knoppies" #: core/song.cpp:339 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "Seinlys ondersteuning" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "Kanselleer" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Verander omslag" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Verander lettergrootte" #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "Verander herhalingsmodus" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Verander kortskakel" #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "Verander skommel modus" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Verander die taal" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "Verandering in Mono-afspeel instellings sal eers aktief wees by die afspeel van die volgende snit" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "Soek vir nuwe episodes" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Kyk vir nuwer weergawes..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "Kies 'n naam vir jou slimspeellys" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Kies outomaties" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Kies kleur..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "Kies lettertipe..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Kies uit die lys" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Kies hoe die afspeellys gesorteer word en hoeveel liedjies dit moet bevat." #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "Kies potgooi aflaaigids" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Titel" #: ui/equalizer.cpp:115 msgid "Classical" msgstr "Klassiek" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "Daar word skoongemaak" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Wis" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Wis afspeellys" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Clementine Fout" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Clementine oranje" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Clementine Visualisering" #: ../bin/src/ui_deviceproperties.h:376 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_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine kan jou musiek vanaf Dropbox speel" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine kan musiek speel wat jy op jou Google Drive geplaas het." #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "Clementine kan jou musiek vanaf Ubuntu One speel." #: ../bin/src/ui_notificationssettingspage.h:431 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:250 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:128 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 installeer." #: internet/lastfmsettingspage.cpp:110 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 "Clementine kan nie jou intekening se status aanvra nie aangesien daar probleme met jou verbinding is. Gespeelde snitte sal onthou word en later na Last.fm aangestuur word." #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Clementine prentjiekyker" #: ../bin/src/ui_trackselectiondialog.h:206 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:210 msgid "Clementine will find music in:" msgstr "Clementine sal musiek vind in:" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Kliek hier om musiek by te voeg" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "Kliek hier om te wissel tussen oorblywende en totale tyd" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "Maak snitlys toe" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "Maak visualisasie toe" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "Die aflaai sal stop as hierdie venster toegemaak word." #: ui/albumcovermanager.cpp:216 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:116 msgid "Club" msgstr "Klub" #: ../bin/src/ui_appearancesettingspage.h:272 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:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Kommentaar" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "Voltooi etikette outomaties" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "Voltooi etikette outomaties..." #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Komponis" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "Stel %1 in..." #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "Stel Grooveshark in..." #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Stel Last.fm in..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "Stel Magnatune in..." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Stel snelskakels in" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "Stel Spotify in..." #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "Stel Subsonic op..." #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "Globale soek instellings..." #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "Stel my versameling in..." #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "Stel potgooie op..." #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "Stel in" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "Verbind Wii-afstandbedienings met aktiveer/deaktiveer aksie" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "Verbind toestel" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "Verbind aan Spotify" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "Konstante bistempo" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "Skakel alle musiek om" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "Skakel alle musiek wat die toestel nie kan speel nie om" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "Kopiëer na knipbord" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Kopiëer na die toestel..." #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Kopiëer na my versameling" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "Kopiereg" #: internet/subsonicsettingspage.cpp:81 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:64 #, 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" #: transcoder/transcoder.cpp:432 #, 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:426 #, 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/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "Kan nie die last.fm radiostasie laai nie" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "Kan nie die uittreelêer %1 oopmaak nie" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Omslagbestuurder" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "Omslag van ingeslote beeld" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Omslag outomaties gelaai vanaf %1" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "Omslag per hand onstel" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "Geen omslag" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "Omslag gestel vanaf %1" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "Omslae vanaf %1" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "Skep 'n nuwe Grooveshark afspeellys" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "Pas oorgangsdowing toe wanneer snitte outomaties verander word" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "Pas oorgangsdowing toe wanneer snitte per hand verander word" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Af" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Op" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "Na keuse" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "Ander prentjie:" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "Eie gekose boodskap" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "Eie gekose radio" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Na keuse..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "DBus lêergids" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Dans" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Datum geskep" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Datum verander" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "Dae" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "&Standaard" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "Verlaag die volume met 4%" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "Verlaag die volume met %" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Verlaag die volume" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "Standaars agtergrond prentjie" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "Standaard instellings" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "Wagperiode tussen visualisasies" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "Skrap" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "Verwyder Grooveshark afspeellys" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "Vee afgelaaide data uit" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Skrap lêers" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Skrap van toestel..." #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Skrap van skyf..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "Vee afgespeelde episodes uit" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "Skrap voorafinstelling" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "Skrap slimspeellys" #: ../bin/src/ui_organisedialog.h:194 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:1363 msgid "Dequeue selected tracks" msgstr "Verwyder gekose snitte uit die tou" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "Verwyder snit uit die tou" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Bestemming" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Details..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Toestel" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Toestelseienskappe" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Toestelsnaam" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Toestelseienskappe..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Toestelle" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Het jy bedoel" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "Digitally Imported wagwoord" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "Digitally Imported gebruikersnaam" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "Direkte internetverbinding" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Gids" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "Steek tydsduur weg" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "Skakel berekening van die 'moodbar' af" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Steek weg" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Skyf" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "Uitsending met onderbrekings" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "Vertoon keuses" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Toon skermbeeld" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "Gaan my hele versameling weer na" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "Moenie enige musiek omskakel nie" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Moenie herhaal nie" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "Moenie onder verskeie kunstenaars wys nie" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "Moenie skommel nie" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "Moenie stop nie!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "Maak 'n skenking" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Dubbelkliek om oop te maak" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "Dubbelkliek op 'n liedjie sal..." #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "Laai %n episodes af" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "Laai gids af" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "Laai episodes af na" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "Laai lidmaatskap af" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "Laai nuwe episodes outomaties af" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "Aflaai tou" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Laai hierdie album af" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Laai hierdie album af..." #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "Laai hierdie episode af" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "Laai af..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "Besig met aflaai (%1%)..." #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "Laai icecast gids af" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "Laai jamendo katalogus af" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "Laai Magnatune katalogus af" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "Laai Spotify uitbreiding af" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "Laai metadata af" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "Sleep om te skuif" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "Dropbox" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "Tans in dinamiese modus" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "Dinamiese skommeling" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "Verander slimspeellys" #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Verander etiket \"%1\"..." #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "Verander etiket" #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "Verander etikette" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Verander snit se inligting" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "Verander snit se inligting" #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Verander snitte se inligting" #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Verander..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "Skakel Wii-afstansbeheer ondersteuning aan" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "Skakel grafiese effenaar aan" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "Laat kortskakels slegs toe wanneer Clementine in fokus is" #: ../bin/src/ui_globalsearchsettingspage.h:147 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:62 msgid "Enable/disable Last.fm scrobbling" msgstr "Skakel die opteken van geluisterde musiek op Last.fm aan/af" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "Enkoderingskompleksiteit" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "Enkoderingsenjin kwaliteit" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "Enkoderingsmodus" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "Tik 'n URL in" #: ../bin/src/ui_coverfromurldialog.h:103 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:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "Kies 'n nuwe naam vir hierdie afspeellys" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Kies 'n kunstenaar of etiket om te begin luister na radio Last.fm." #: ../bin/src/ui_globalsearchview.h:209 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:77 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:77 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:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "Tik soekterme hier in" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "Tik die URL van 'n internet-radiostroom in:" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "Voer die gidsnaam in" #: ../bin/src/ui_networkremotesettingspage.h:198 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:87 msgid "Entire collection" msgstr "Hele versameling" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Fout" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Fout tydens verbinding aan MTP-toestel" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "Fout tydens kopiëring van liedjies" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "Fout tydens verwydering van liedjies" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "Fout tydens aflaai van die Spotify uitbreiding" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "Fout tydens laai van %1" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Fout tydens laai van di.fm afspeellys" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "Fout tydens verwerking van %1:%2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "Fout tydens laai van musiek CD" #: library/library.cpp:63 msgid "Ever played" msgstr "Ooit gespeel" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "Elke 10 minute" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "Elke 12 ure" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "Elke 2 dae" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "Elke 20 minute" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "Elke 30 minute" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "Elke 6 ure" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "Uurliks" #: ../bin/src/ui_playbacksettingspage.h:303 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:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "Meer..." #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "Verval op %1" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "Doof klank uit as snit gestop word" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "Uitdowing" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "Duur van uitdowing" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "Gids kon nie gehaal word nie" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "Kan nie die potgooi gaan haal nie" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "Die potgooi kan nie gelaai word nie" #: podcasts/podcasturlloader.cpp:167 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:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "Vinnig" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "Gunstelinge" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "Gunsteling snitte" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "Gaan haal uitstaande omslae" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "Gaan haal outomaties" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "Klaar met haal" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "Laai die Subsonic-biblioteek" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Fout met haal van omslae" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "Lêeruitsbreiding" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "Lêer formate" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Lêernaam" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "Lêernaam (sonder pad)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Lêergrootte" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Lêertipe" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Lêernaam" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Lêers" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "Lêers om te transkodeer" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "Vind liedjies in jou versameling wat aan hierdie eise voldoen." #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "Bereken liedjie se vingerafdruk" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "Maak klaar" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "Eerste vlak" #: core/song.cpp:328 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Teks grootte" #: ../bin/src/ui_spotifysettingspage.h:213 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:204 msgid "Force mono encoding" msgstr "Dwing mono-enkodering" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "Vergeet van toestel" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Vorm" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "Formaat" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Beeldduur" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "Beelde per buffer" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Vriende" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "Bevrore" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Volle bas" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "Volle bas + hoëtoon" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "Volle hoëtoon" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "GStreamer oudioenjin" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "Algemeen" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Algemene instellings" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Genre" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "Verkry die URL om hierdie Grooveshark afspeellys te deel" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "Verkry die URL om hierdie Grooveshark liedjie te deel" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "Grooveshark populêre liedjies word verkry" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "Kanale word verkry" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "Strome word verkry" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "Gee dit 'n naam:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "Gaan" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "Gaan na volgende afspeellys oortjie" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "Gaan na vorige afspeellys oortjie" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, 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:206 msgid "Grey out non existent songs in my playlists" msgstr "Maak onbestaande liedjies in my afspeellys grys" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "Grooveshark aantekenfout" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "Grooveshark afspeellys URL" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "Grooveshark radio" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "Grooveshark liedjie se URL" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "Groeppeer versameling volgens..." #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "Groeppeer volgens" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "Groeppeer volgens Album" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "Groeppeer volgens Kunstenaar" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "Groeppeer volgens Kunstenaar/Album" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "Groeppeer volgens Kunstenaar/Jaar - Album" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "Groeppeer volgens Genre/Album" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "Groeppeer volgens Genre/Kunstenaar/Album" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "HTML bladsy bevat nie enige RSS voer nie" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "HTTP instaanbediener" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "Gelukkig" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "Hardeware inligting" #: ../bin/src/ui_deviceproperties.h:372 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:202 msgid "High" msgstr "Hoog" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "Hoog (%1 fps)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "Hoog (1024x1024)" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "Ure" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "Hypnopadda" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "Ek het nie 'n Magnatune rekening nie" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Ikoon" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "Ikone bo" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "Liedjies word geïdentifiseer" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 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:77 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:204 msgid "Ignore \"The\" in artist names" msgstr "Ignoreer \"The\" in kunstenaars se name" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Beelde (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "Oor %1 dae" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "Oor %1 weke" #: ../bin/src/ui_wizardfinishpage.h:86 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 afspeellys elke keer as 'n liedjie klaarmaak." #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "Posbus" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "Sluit omslag in die kennisgewing in" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "Sluit alle liedjies in" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "Verhoog die volume met 4%" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "Verhoog die volume met %" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Verhoog die volume" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "%1 word geïndeks" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "Inligting" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "Voeg in..." #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Geïnstalleer" #: core/database.cpp:673 msgid "Integrity check" msgstr "Integriteitstoets" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "Insternet verskaffers" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "Ongeldige API sleutel" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Ongeldige formaat" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "Ongeldige metode" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "Ongeldige parameters" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "Ongeldige bron gespesifiseer" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "Ongeldige diens" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "Ongeldige sessiesleutel" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "Ongeldige gebruikersnaam en/of wagwoord" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "Mees geluisterde Jamendo snitte" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "Jamendo top snitte" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "Jamendo se top snitte vir die maand" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "Jamendo se top snitte vir die week" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "Jamendo databasis" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "Spring na die snit wat tans speel" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Hou knoppies vir %1 sekonde vas" #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Hou knoppies vir %1 sekondes vas" #: ../bin/src/ui_behavioursettingspage.h:193 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:193 msgid "Keep the original files" msgstr "Hou die oorspronklike lêers" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "Katjies" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Taal" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "Laptop/Oorfone" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Groot saal" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "Groot album omslag" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "Groot kantlyn-kieslys" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "Laaste afgespeel" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "Last.fm eie gekose radio: %1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Last.fm versameling - %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "Last.fm radiomengsel - %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Last.fm buurradio - %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Last.fm radiostasie - %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Last.fm kunstenaars soortgelyke aan %1" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Last.fm etiket radio: %1" #: internet/lastfmservice.cpp:437 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:154 msgid "Last.fm password" msgstr "Last.fm wagwoord" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "Last.fm tellings" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Last.fm etikette" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Last.fm gebruikersnaam" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Last.fm wiki" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "Mins gunsteling snitte" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "Laat leeg vir standaardwaarde. Voorbeelde: \"/dev/dsp\", \"front\", ens." #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Lengte" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Versameling" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "Gevorderde groeppering van versameling" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "Versameling hernagaan kennisgewing" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "Soek deur my versameling" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Limiete" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "Luister na Grooveshark liedjies soortgelyk aan wat jy al voorheen geluister het" #: ui/equalizer.cpp:123 msgid "Live" msgstr "Regstreeks" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Laai" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "Verkry omslag van URL" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "Verkry omslag van URL..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "Laai omslag vanaf skyf" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "Verkry omslag van skyf..." #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "Laai afspeellys" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "Laai afspeellys..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Last.fm radio word gelaai" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "MTP toestel word gelaai" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "iPod databasis word gelaai" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "Slimspeellys word gelaai" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "Liedjies word gelaai" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "Stroom word gelaai" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "Snitte word gelaai" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "Snitinligting word gelaai" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "Besig om te laai..." #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "Laai lêers/URLs en vervang huidige afspeellys" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Teken aan" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "Aanteken onsuksesvol" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "Langtermyn voorspellingsmodel (LTP)" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "Luister graag" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Laag (%1 fps)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "Laag (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "Lae kompleksitietsprofiel (LC)" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "Lirieke" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "Lirieke vanaf %1" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Magnatune aflaai" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Klaar afgelaai vanaf Magnatune" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "Hoofprofiel (MAIN)" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "Maak dit so!" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "Maak afspeellys aflyn beskikbaar" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "Misvormde antwoord" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "Stel instaanbediener per hand in" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "Handmatig" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "Vervaardiger" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "Merk as geluister" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "Merk as nuut" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "Voldoen aan alle soekterme (AND)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "Voldoen aan een of meer soekterme (OR)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "Maksimum bistempo" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "Medium (%1 fps)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "Medium (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "Lidmaatskapstipe" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "Minimum bistempo" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "projectM voorinstellings word vermis" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "Model" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "Hou my versameling dop vir veranderings" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "Speel in Mono af" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "Maande" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "Stemming" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "Stemmingsbalk styl" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "Stemmingsbalk" #: library/library.cpp:74 msgid "Most played" msgstr "Meeste gespeel" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "Monteringsadres" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "Monteringsadresse" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "Skuid af" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "Skuif na my versameling..." #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "Skuid op" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "Musiek" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Musiekversameling" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "Maak stil" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "My Last.fm versameling" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "My Last.fm radio mengsel" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "My Last.fm buurt" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "My Last.fm aanbevole radio" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "My radio mengsel" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "My Musiek" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "My buurt" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "My radiostasie" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "Aanbevelings" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Naam" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "Benamingsopsies" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "Nouband (NB)" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "Bure" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "Netwerk" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "Instaanbediener" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "Netwerk-afstandbeheer" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "Nooit" #: library/library.cpp:67 msgid "Never played" msgstr "Nooit deurgespeel" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "Nooit begin afspeel" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "Nuwe gids" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "Nuwe afspeellys" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "Nuwe slimspeellys" #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "Nuwe liedjies" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "Nuwe snitte sal outomaties toegevoeg word." #: library/library.cpp:80 msgid "Newest tracks" msgstr "Nuutste snitte" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "Volgende" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Volgende snit" #: core/utilities.cpp:147 msgid "Next week" msgstr "Volgende week" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "Geen analiseerder" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "Geen agtergrond prentjie" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "Geen lang blokke" #: playlist/playlistcontainer.cpp:366 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Geen gevind. Vee soekveld uit om hele afspeellys te toon." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "Geen kort blokke" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "Geen" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 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:155 msgid "Normal" msgstr "Normaal" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "Normale blok tipe" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "Onbeskikbaar in slimspeellyste" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "Nie verbind" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "Nie genoeg inhoud" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "Nie genoeg ondersteuners nie" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "Nie genoeg lidmate nie" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "Nie genoeg bure nie" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Nie geïnstalleer" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "Nie aangeteken nie" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "Nie gemonteer - dubbelkliek om te monteer" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "Kennisgewing tipe" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Kennisgewings" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Aan die speel" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "Skermbeeld voorskou" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 msgid "Only allow connections from the local network" msgstr "" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Toon slegs die eerste" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "Opacity" msgstr "Ondeursigtigheid" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "Maak %1 in webblaaier oop" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "Maak &oudio CD oop..." #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "Maak OPML lêer oop" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "Maak OPML lêer oop..." #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "Open device" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "Lêer..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "Maak oop in Google Drive." #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "Maak in nuwe afspeellys oop" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Maak oop..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "Aksie gestop" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "Fokus op bistempo" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "Fokus op kwaliteit" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "Keuses..." #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "Sorteer Lêers" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "Sorteer Lêers..." #: core/organise.cpp:65 msgid "Organising files" msgstr "Lêers word gesorteer" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "Oorspronklike etikette" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Ander keuses" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "Uittree keuses" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "Oorskryf bestaande lêers" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "Eienaar" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "Verwerk Jamendo katalogus" #: ui/equalizer.cpp:124 msgid "Party" msgstr "Partytjie" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "Wagwoord" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Pause" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "Afspeel is gepauseer" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Gepauseerd" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "Gewone sykieslys" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Speel" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "Speel kunstenaar of etiket" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "Speel kunstenaar radio..." #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "Afspeeltelling" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "Speel ander radio..." #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "Speel indien gepauseerd, pauseer indien speel" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "Speel as daar niks anders tans speel nie" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "Speel etiket radio..." #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "Speel die de snit in die afspeellys" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "Speel/Pause" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Afspeel" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Afspeler keuses" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "Afspeellys" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "Afspeellys deurgewerk" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "Afspeellys keuses" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "Afspeellys tipe" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "Afspeellys" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "Kies jou webblaaier en kom dan terug na Clementine." #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "Uitbreiding toestand:" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "Potgooie" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Pop" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "Populêre liedjies" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "Populêre liedjies van die maand" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "Populêre liedjies van vandag" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "Duur van opspringkennisgewing" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "Poort" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "Voorversterker" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "Instellings" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "Instellings..." #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "Voorkeur album omslag lêername (skei met 'n komma)" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "Voorkeur oudioformaat" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "Voorkeur bistempo" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "Voorkeur formaat" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "Premium oudio tipe" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "Voorinstelling:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "Druk 'n sleutelsamestelling om te gebruik vir" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "Druk 'n knoppie" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Druk 'n sleutelsametelling om te gebruik vir %1..." #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "Mooi skermbeeld keuses" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "Voorskou" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "Vorige" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "Vorige snit" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Toon weergawe inligting" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "Profiel" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "Vordering" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 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:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "Kwaliteit" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "Toestel word ondervra..." #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "Tou bestuurder" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "Plaas geselekteerde snitte in die tou" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "Plaas snit in die tou" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "Radio (selfde hardheid vir alle snitte)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "Radio's" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "Rëen" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "Willekeurige visualisasie" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "Gee die huidige liedjie 0 sterre" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "Gee die huidige liedjie 1 ster" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "Gee die huidige liedjie 2 sterre" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "Gee die huidige liedjie 3 sterre" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "Gee die huidige liedjie 4 sterre" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "Gee die huidige liedjie 5 sterre" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "Aantal sterre" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "Wil jy rêrig opgee?" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "Verfris" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "Verfris katalogus" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "Verfris kanale" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "Verfris lys van vriende" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "Verfris lys van stasies" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "Verfris strome" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Reggae" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "Onthou die Wii-afstandsbeheer se swaai" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "Herinner vorige keer s'n" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Verwyder" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "Verwyder aksie" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "Verwyder duplikate vanuit die afspeellys" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "Verwyder vouer" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "Verwyder vanuit My Musiek" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "Verwyder van gunstelinge" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "Verwyder vanuit afspeellys" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "Liedjies word uit My Musiek verwyder" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "Liedjies word uit gunstelinge verwyder" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "Herbenoem \"%1\" afspeellys" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "Herbenoem Grooveshark afspeellys" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "Herbenoem afspeellys" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "Herbenoem afspeellys..." #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "Hernommer snitte in hierdie volgorde..." #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Herhaal" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "Herhaal album" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "Herhaal afspeellys" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "Herhaal snit" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Vervang huidige afspeellys" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "Vervang die afspeellys" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "Vervang spasies met onderstrepe" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "Afspeel wins" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "Verfris" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "Herstel" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" msgstr "Herstel afspeeltelling" #: 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:206 msgid "Restrict to ASCII characters" msgstr "Beperk tot ASCII karakters" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "Grooveshark se My Musiek-liedjies word gehaal" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "Grooveshark gunsteling liedjies word verkry" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "Grooveshark afspeellys word verkry" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "Gaan terug na Clementine." #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "Laat loop" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "SOCKS instaanbediener" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "Veilige verwydering van toestel" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "Verwyder toestel veilig na kopiëring" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "Monstertempo" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "Monstertempo" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "Stoor .mood-lêers in jou musiekversameling" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "Stoor albumomslag" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "Stoor omslag op skyf" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "Stoor beeld" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "Stoor afspeellys" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "Stoor afspeellys" #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "Stoor voorinstelling" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "Stoor hierdie stroom in die internet oortjie" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "Snitte word gestoor" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "Skaleerbare monstertempo profiel (SSR)" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "Telling" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "Noteer snitte wat ek na luister op" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "Soek" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "Soek deur Icecast stasies" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "Soek deur Jamendo" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Soek deur Magnatune" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "Soek deur Subsonic" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "Soek vir album omslae..." #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "Soek vir enigiets" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "Soek op gpodder.net" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "Soek deur iTunes" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "Soek modus" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "Soek instellings" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "Soekresultate" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "Soekterme" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "Grooveshark word deursoek" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "Tweede vlak" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "Streef terugwaarts" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "Streef vorentoe" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "Streef 'n relatiewe hoeveelheid deur die huidige snit" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "Streef na 'n spesifieke posisie in die huidige snit" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "Kies Almal" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "Kies geen" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "Kies agtergrond kleur:" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "Kies 'n agtergrond prentjie" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "Kies een wat beste voldoen" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "Kies voorgrond kleur:" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "Kies visualisasie" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "Kies visualisasie..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "Reeksnommer" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "URL van Bediener" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "Bedienerbesonderhede" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "Diens aflyn" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Stel %1 na \"%2\"..." #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "Stel die volume na persent" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "Stel waarde vir alle geselekteerde snitte" #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Kortskakel" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "Kortskakel vir %1" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Kortskakel vir %1 bestaan reeds" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Wys" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "Wys skermbeeld" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "Maak die huidige snit gloei" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "Wys 'n stemmingsbalk in die snit se vorderingsbalk" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "Gebruik die sisteem se eie kennisgewings" #: ../bin/src/ui_notificationssettingspage.h:442 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:441 msgid "Show a notification when I change the volume" msgstr "Wys 'n kennisgewing as ek die volume verander" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "Wys 'n opwipkennisgewing vanaf die stelselbalk" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "Wys 'n mooi skermbeeld" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "Wys bo toestandsbalk" #: ui/mainwindow.cpp:460 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:209 msgid "Show cover art in library" msgstr "Wys omslae in die versameling" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "Wys verdelers" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "Wys volgrootte..." #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "Wys in lêerblaaier..." #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "Wys tussen verkeie kunstenaars" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "Wys stemmingsbalk" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "Wys slegs duplikate" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "Wys slegs sonder etikette" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "Wys aanbevole soektogte" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "Wys die \"hou van\" en \"verbied\" knoppies" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "Wys die noteer knoppie in die hoofvenster" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "Wys in stelselbalk" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "Wys watter bronne is aan- en afgeskakel" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "Wys/Steek weg" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Skommel" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "Skommel albums" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "Skommel alles" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "Skommel speellys" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "Skommel snitte in hierdie album" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "Teken aan" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "Teken uit" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "Aan die aanteken..." #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "Soortgelyke kunstenaars" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "Spring terugwaarts in afspeellys" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "Aantal keer oorgeslaan" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "Spring voorentoe in afspeellys" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "Klein omslag" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "Klein kantbalk" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "Slimspeellys" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "Slimspeellyste" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Sag" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "Sagte Rock" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "Liedjie Inligting" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "Liedjie" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "Sonogram" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "Jammer" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "Sorteer volgens genre (alfabeties)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "Sorteer volgens genre (populariteit)" #: ../bin/src/ui_icecastfilterwidget.h:77 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" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "Bron" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "Bronne" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "Spotify aantekenfout" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "Spotify uitbreiding" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "Spotify uitbreiding is nie geïnstalleer nie" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "Standaard" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "Gegradeer" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "Begin die huidige afspeellys speel" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "Begin transkodering" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 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:405 #, qt-format msgid "Starting %1" msgstr "%1 word begin" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "In aanvang..." #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "Stasies" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Stop" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "Stop na" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "Stop na hierdie snit" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Hou op met afspeel" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "Hou op afspeel na die huidige snit" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "Afspeel is gestop" #: core/song.cpp:341 msgid "Stream" msgstr "Stroom" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "Stroomlidmaatskap" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "Ingetekende afspeellyste" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "Teken in" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "Sukses!" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "%1 suksesvol geskryf" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "Voorgestelde etikette" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "Opsomming" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "Siper hoog (%1 fps)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "Super hoog (2048x2048)" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "Ondersteunde formate" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "Spotify inbox word gesinkroniseer" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "Spotify afspeellys word gesinkroniseer" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "Gegradeerde Spotify snitte word gesinkroniseer" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "Standaard kleure" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "Oortjies bo" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Etiket" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "Etiketsoeker" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "Etiketteer radio" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "Teiken bistempo" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "Teksinstellings" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Dank aan" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Die \"%1\" bevel kan nie begin word nie." #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "Die album omslag van die huidige liedjie" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "Die gids %1 is nie geldig nie" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "Die afspeellys '%1' was leeg of kan nie gelaai word nie." #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "Die blad wat hy aangevra het is nie 'n beeld nie!" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "Daar is ander liedjies in hierdie album" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "Fout tydens kommunikasie met gpodder.net" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Daar was 'n probleem met die haal van metadata vanaf Magnatune" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Fout tydens analisering van iTunes winkel se antwoord" #: ui/organiseerrordialog.cpp:56 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:389 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:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 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:174 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:151 msgid "Third level" msgstr "Derde vlak" #: internet/jamendoservice.cpp:171 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/magnatunedownloaddialog.cpp:175 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_deviceproperties.h:381 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:375 msgid "This device supports the following file formats:" msgstr "Die toestel ondersteun die volgende lêer formate:" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Hierdie toestel sal nie goed werk nie" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "Hierdie stroom is slegs vir betalende lede." #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "Hierdie tipe toestel word nie ondersteun nie: %1" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "Te veel tyd het verloop" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Titel" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "Om Grooveshark radio te begin moet jy eers na 'n paar ander Grooveshark liedjies luister" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "Vandag" #: core/globalshortcuts.cpp:59 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:1369 msgid "Toggle queue status" msgstr "Skakel tou-status aan/af" #: ../bin/src/ui_mainwindow.h:718 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:143 msgid "Tomorrow" msgstr "Môre" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "Te veel aansture" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "Top snitte" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "Totale aantal grepe oorgedra" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "Totale aantal versoeke oor die netwerk gemaak" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Snit" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "Transkodeer musiek" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "Transkodeerder log" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "Besig met transkodering" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Lêer %1 word met %2 prosesse getranskodeer" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "Transkodering instellings" #: core/song.cpp:338 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "Turbine" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "Skakel af" #: devices/giolister.cpp:161 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "URL(s)" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "Ultra wyeband (UWB)" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Kan nie %1 aflaai nie (%2)" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Onbekend" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "Onbekende inhoudtipe" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Onbekende fout" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "Verwyder omslag" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "Teken uit" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "Komende opvoerings" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "Dateer Grooveshark afspeellys op" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "Dateer alle potgooie op" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "Gaan versameling na vir veranderinge" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "Gaan die versameling vir veranderings na elke keer as Clementine oopgemaak word" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "Dateer hierdie potgooi op" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "Dateer op..." #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "%1 word opgedateer" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "%1% word opgedateer..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Jou versameling word nagegaan" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "Gebruik" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "Gebruik Albumkunstenaar etiket as dit beskikbaar is" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "Gebruik Gnome se kortskakel knoppies" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "Gebruik afspeel-aanwins metadata as dit beskikbaar is" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "Gebruik Wii Afstandsbeheer" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "Gebruik 'n ander kleurskema" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "Gebruik 'n eie gekose boodskap vir kennisgewings" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "Teken aan" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "Gebruik bistempo beheerstelsel" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "Gebruik dinamiese modus" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "Gebruik kennisgewings om die Wii-afstandsbeheer se status te toon" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "Gebruik tydgebasseerde ruis vervorming" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "Gebruik die stelsel se standaard waarde" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "Gebruik die standaard kleurskema" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "Gebruik die stelsel se instaanbediener instellings" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "Gebruik volume normalisering" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "Reeds gebruik" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "Gebruiker %1 het nie Grooveshark Anywhere lidmaatskap nie" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "Gebruikerskoppelvlak" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Gebruikersnaam" #: ../bin/src/ui_behavioursettingspage.h:207 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:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "Wisselende bistempo" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "Verskeie kunstenaars" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "Weergawe %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "Bekyk" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "Visualisasie modus" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "Visualisasies" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "Visualisasie instellings" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "Stem deteksie" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "Volume %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "Webtuiste" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "Weke" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "Wanneer Clementine oopgemaak word" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "Wanneer die lys leeg is..." #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "Probeer ook..." #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "Wyeband (WB)" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii afstandsbeheer %1: aktief" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii afstandsbeheer %1: verbind" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii afstandsbeheer %1: battery krities laag (%2%)" #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii afstandsbeheer %1: deaktiveer" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii afstandsbeheer %1: ontkoppel" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii afstandsbeheer %1: lae battery (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "Windows Media oudio" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:530 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:2088 msgid "Would you like to run a full rescan right now?" msgstr "Wil jy alles van voor af deursoek?" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "Jaar" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "Jaar -Album" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "Jare" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "Gister" #: ../bin/src/ui_magnatunedownloaddialog.h:132 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:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "Jy is nie aangeteken nie." #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "Jy is aangeteken as %1." #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "Jy is aangeteken." #: ../bin/src/ui_groupbydialog.h:123 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/digitallyimportedsettingspage.cpp:46 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/magnatunesettingspage.cpp:53 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:57 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." #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "Jy kan gratis jou belusiterde liedjies log, maar slegs betalende lede kan Last.fm radio vanuit Clementine luister." #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "Jy het nie Grooveshark Anywhere lidmaatskap nie." #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Jy het nie Spotify Premium lidmaatskap nie." #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "Jy het nie 'n aktiewe lidmaatskap nie" #: internet/spotifyservice.cpp:170 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/spotifysettingspage.cpp:158 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:87 msgid "You love this track" msgstr "Jy hou van hierdie snit." #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "Jy moet toegang vir hulp toestelle aanskakel in jou stelsel se instellings sodat globale kortskakels sal werk." #: ../bin/src/ui_behavioursettingspage.h:200 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." #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "Jy sal nie Last.fm radio kan luister nie aangesien jy nie lidmaatskap het nie." #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "Jou IP-adres:" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Jou Last.fm aanteken details was verkeerd" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "Jou Magnatune aanteken details was verkeerd" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "Jou versameling is leeg!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "Jou radiostasies" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "Jou aanlyn logs: %1" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Jou rekenaar het nie OpenGL ondersteuning nie. Visualiserings is dus onbeskikbaar." #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "Jou gebruikersnaam of wagwoord was verkeerd." #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Zero" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "voeg %n liedjies by" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "na" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "gelede" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "en" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "outomaties" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "voor" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "tussen" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "grootste eerste" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "bevat" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "skakel af" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "skyf %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "bevat nie" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "eindig met" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "gelyk aan" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "gpodder.net" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "gpodder.net gids" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "groter as" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "in die laaste" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "minder as" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "langste eerste" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "skuif %n liedjies" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "nuutste eerste" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "nie gelyk aan" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "nie in die laaste" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "nie volgens" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "oudste eerste" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "volgens" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "instellings" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "druk Enter" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "verwyder %n liedjies" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "korste eerste" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "meng liedjies" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "kleinste eerste" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "sorteer liedjies" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "begin met" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "stop" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "snit %1" clementine-1.2.0+dfsg/src/translations/ar.po000066400000000000000000003702611223327513400210410ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # ahameed , 2012 # FIRST AUTHOR , 2010 # khire aldin kajjan , 2012 # newstyle20 , 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:07+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Arabic (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " pt" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr "ثواني" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "المقاطع" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 ألبومات" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 أيام" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 مند أيام" #: podcasts/gpoddersync.cpp:79 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 قوائم التشغيل (%2)" #: playlist/playlistmanager.cpp:413 #, qt-format msgid "%1 selected of" msgstr "" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 مقطع" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 مقاطع" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 العثور على مقاطع" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 songs found (showing %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 المسارات" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 منقولة" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimotedev module" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n فشل" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n إنتهى" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "&تخصيص" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "&مساعدة" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "أخفِ %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "إخفاء..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&يسار" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&لا شيئ" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&خروج" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&يمين" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "&تمديد الأعمدة لتتناسب مع الناقدة" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "&أدوات" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(مختلفة عبر أغنيات متعددة)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "...وكل المساهمين في أماروك" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 يوم" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 مقطع" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 مقطع عشوائي" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "رقي إلى بريميوم الأن" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr " Grooveshark يجب التوفر على حساب في " #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "ضروريSpotify حساب في" #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:78 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:153 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "سيتم إدراج المقطع في قائمة التشغيل إذا كان يتطابق مع هذه الشروط." #: smartplaylists/searchterm.cpp:297 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "HYPNOTOADكل المجد ل" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "حول %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "حولَ كليمنتاين..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "حولَ QT..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "معلومات الحساب" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "تفاصيل الحساب(المدفوع)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "عمل" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "تفعيل\\إلغاء تفعيل الWiiremote" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "إضافة Stream" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "إضافة سطر جديد إن كان مدعوم من قبل نوعية التنبيه" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "إضافة عمل" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "إضافة Stream أخر" #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "أضف مجلد..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "أضافة ملف..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "إضافة ملفات للتحويل" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "إضافة مجلد" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "إضافة مجلد..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "أضف مجلد جديد..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "إضافة تعبير للبحث" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "إضافة علامة الألبوم للأغنية" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "إضافة علامة مؤلف الألبوم للأغنية" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "إضافة مؤلف الأغنية" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "" #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "إضافة لقائمة التشغيل" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "أُضيفَ هذا الشهر" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "أُضيفَ هذا الأسبوع" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "أُضيفَ هذه السنة" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "أُضيفَ اليوم" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "أُضيفَ خلال ثلاثة أشهر" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "" #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "الألبوم" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "فنان الألبوم" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "" #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "" #: ui/about.cpp:74 msgid "All the translators" msgstr "" #: library/library.cpp:84 msgid "All tracks" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "" #: internet/spotifyblobdownloader.cpp:60 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:61 msgid "An error occurred loading the iTunes database" msgstr "" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:78 msgid "And:" msgstr "" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "الفنان" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "" #: ui/about.cpp:65 msgid "Authors" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "" #: core/database.cpp:734 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "معدل البت" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "" #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "" #: core/song.cpp:339 msgid "CDDA" msgstr "" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "" #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "" #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "" #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "" #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "" #: ui/equalizer.cpp:115 msgid "Classical" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: internet/lastfmsettingspage.cpp:110 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 "" #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "اضغط هنا لإضافة بعض الموسيقى" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "" #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:116 msgid "Club" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "" #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "الملحّن" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "" #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "" #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "" #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "" #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "" #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "" #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "" #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:64 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: transcoder/transcoder.cpp:432 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "" #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "تاريخ الإنشاء" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "حُرِرَ بِتاريخ" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "اخفض الصوت 4%" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "" #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "" #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "" #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "قرص مدمج" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "لا تكرر" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "" #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "" #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "" #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "" #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "" #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "" #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "ادخل كلمات البحث هنا" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "كامل المجموعة" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:63 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "اسم الملف" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "اسم الملف (من دون المسار)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "حجم الملف" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "نوع الملف" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "المستوى الأول" #: core/song.cpp:328 msgid "Flac" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "النموذج" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "الأصدقاء" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "النوع" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:43 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "ارفع الصوت 4%" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "" #: core/database.cpp:673 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "صيغة غير متاحة" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "طريقة غير متاحة" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "خدمة غير متاحة" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "" #: internet/lastfmservice.cpp:437 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:154 msgid "Last.fm password" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "المدة" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "" #: ui/equalizer.cpp:123 msgid "Live" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "" #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "" #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "" #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "" #: core/song.cpp:330 msgid "MPC" msgstr "" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "" #: library/library.cpp:74 msgid "Most played" msgstr "" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "مكتبة الصوتيات" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "جيراني" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "الجيران" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "" #: library/library.cpp:67 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:80 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "" #: core/utilities.cpp:147 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:366 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "لا شيء" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "لا يوجد محتوى كافي" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "" #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "" #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "" #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "فشلت العملية" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "" #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "" #: core/organise.cpp:65 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "خيارات اخرى" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:124 msgid "Party" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "ألبِث التشغيل" #: widgets/osd.cpp:156 msgid "Paused" msgstr "" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "" #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "" #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "شغل إذا توقف، توقف مؤقتا إذا اشتغل" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "خيارات المشغل" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "خيارات قائمة التشغيل" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "أزل الملف" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "كرر الألبون" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "كرر المقطوعة" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" 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:206 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "" #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "المستوى الثاني" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "" #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "اجعل درجة الصوت بنسبة " #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "عرض" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:460 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "" #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "" #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "تجاهل السابق في قائمة التشغيل" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "تجاهل اللاحق في قائمة التشغيل" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 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 "" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "ابدأ قئمة التشغيل اللتي تعمل حالياً" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "" #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "أوقف التشغيل" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "" #: core/song.cpp:341 msgid "Stream" msgstr "المجرى" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "" #: ui/about.cpp:70 msgid "Thanks to" msgstr "" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "" #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:56 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:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "These folders will be scanned for music to make up your library" msgstr "سيتم فحص الملفات الصوتية الموجودة في هذه الملفات لإضافتها لمكتبتك" #: ../bin/src/ui_transcodersettingspage.h:174 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:151 msgid "Third level" msgstr "المستوى الثالث" #: internet/jamendoservice.cpp:171 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "العنوان" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "المقطوعة" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "" #: core/song.cpp:338 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "" #: devices/giolister.cpp:161 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "رابط(روابط)" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "مجهول" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "خطأ مجهول" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "الإستخدام" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "السنة" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "سنة - البوم" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "" #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "" #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "" #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "مكتبتك فارغة!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "أضِف %n أغاني\\أغنية" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "الخيارات" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "أزِل %n أغاني\\أغنية" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "" clementine-1.2.0+dfsg/src/translations/be.po000066400000000000000000005336111223327513400210250ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Fiodar Maroźka , 2012-2013 # FIRST AUTHOR , 2010 # Fiodar Maroźka , 2012 # Валерий Третьяк , 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:07+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Belarusian (http://www.transifex.com/projects/p/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<10 || n%100>=20) ? 1 : 2);\n" #: playlist/playlistlistview.cpp:39 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:246 msgid " days" msgstr "дзён" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " Кбіт/c" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " мс" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " пунктаў" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " с" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "кампазыцыі" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 альбом(аў)" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 дзён" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 дзён таму" #: podcasts/gpoddersync.cpp:79 #, 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:413 #, qt-format msgid "%1 selected of" msgstr "%1 абрана з" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 кампазыцыя" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 кампазыцый" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 кампазыцый знойдзена" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 кампазыцый знойдзена (паказана %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 трэкаў" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 перададзены" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: модуль Wiimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n з памылкай" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n завершана" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "&Іншы" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "Пашырэньні" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "&Даведка" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "&Схаваць %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "&Схаваць..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Зьлева" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "Музыка" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Няма" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "Плэйліст" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Выйсьці" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "Рэжым паўтору" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Справа" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "Рэжым мяшаньня" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "&Выраўнаць слупкі па памеры вакна" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "&Iнструмэнты" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(розны праз некалькі кампазыцый)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "...і ўсім стваральнікам Amarok" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "0px" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 дзень" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 кампазыцыя" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "127.0.0.1" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128к MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "40%" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 выпадковых трэкаў" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "Абнавіць да вэрсіі Premium" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "Патрабуецца акаўнт Grooveshark Anywhere." #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "Патрабуецца акаўнт Spotify Premium." #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "Кліент можа падключыцца толькі калі быў уведзены правільны код." #: smartplaylists/wizard.cpp:78 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:153 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Кампазыцыя будзе дададзеная ў плэйліст, калі адпавядае гэтым умовам." #: smartplaylists/searchterm.cpp:297 msgid "A-Z" msgstr "A-Z (А-Я)" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "УСЯ СЛАВА ГІПНАЖАБЕ!" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "Адмена" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "Пра %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "Пра праграму Clementine..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "Пра Qt..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Дэталі акаўнта" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "Дэталі акаўнта (вэрсія Premium)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Дзеяньне" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Актываваць/дэактываваць Wiiremote" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "Дадаць Подкаст" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Дадаць струменевае вяшчанне" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "Дадаць новы радок, калі падтрымліваецца тыпам апавяшчэння" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "Дадаць дзеяньне" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Дадаць іншае струменевае вяшчанне" #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Дадаць каталёг" #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "Дадаць файл" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Дадаць файл..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Дадаць файлы для перакадаваньня" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Дадаць каталёг" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Дадаць каталёг..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Дадаць новы каталёг..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "Дадаць подкаст" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "Дадаць подкаст..." #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Дадаць умову пошуку" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "Дадаць тэг \"Альбом\"" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "Дадаць тэг \"Выканаўца альбома\"" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "Дадаць тэг \"Выканаўца\"" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "Дадаць аўтападлік песень" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "Дадаць тэг \"Кампазытар\"" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "Дадаць тэг \"Дыск\"" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "Дадаць імя файлу з кампазыцыяй" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "Дадаць тэг \"Жанр\"" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "Дадаць тэг \"Працягласьць\"" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "Дадаць колькасць прайграваньняў" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "Дадаць ацэнку песьні" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "Дадаць колькасьць пропускаў" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "Дадаць тэг \"Назва\"" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "Дадаць тэг \"Нумар трэку\"" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "Дадаць тэг \"Год\"" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Дадаць струмень..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "Дадаць у абранае Grooveshark" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "Дадаць у плэйлісты Grooveshark" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "Дадаць у іншы плэйліст" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Дадаць у плэйліст" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "Дадаць у чаргу" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Дадаць дзеяньне wiimotedev" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Дадаць..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Дададзена за месяц" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Дададзена за тыдзень" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Дададзена за год" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Дададзена сёньня" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Дададзена за тры месяцы" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "Даданьне кампазыцыі ў Маю Музыку" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "Дадаем песьню ў абраныя" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Пашыраная сартоўка" #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "Пасьля" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "Пасьля капіяваньня..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Альбом" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Альбом (ідэальная гучнасьць для ўсіх трэкаў)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Выканаўца альбому" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "Вокладка альбому" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Інфармацыя аб альбоме на jamendo.com..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Альбомы з вокладкамі" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Альбомы бяз вокладак" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Усе файлы (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "Уся слава Гіпнажабе!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Усе альбомы" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Усе выканаўцы" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "Усе файлы (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Усе спісы прайгравання (%1)" #: ui/about.cpp:74 msgid "All the translators" msgstr "Усе перакладчыкі" #: library/library.cpp:84 msgid "All tracks" msgstr "Усе кампазіцыі" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "Дазволіць mid/side кадаваньне" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "Разам з арыгіналамі" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Заўсёды хаваць галоўнае акно" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Заўсёды паказваць галоўнае акно" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "Заўсёды пачынаць прайграваньне" #: internet/spotifyblobdownloader.cpp:60 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:61 msgid "An error occurred loading the iTunes database" msgstr "Адбылася памылка пры загрузке дадзеных iTunes" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Адбылася памылка пры запісе мэта-дадзеных в '%1'" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "Адбылася невядомая памылка" #: ui/about.cpp:78 msgid "And:" msgstr "І:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "Злы" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Зьнешні выгляд" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Дадаць файлы/URLs ў плэйліст" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "Дадаць у бягучы плэйліст" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "Дадаць у плэйліст" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "Ужыць кампрэсію для прадухіленьня скажэнняў" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Вы сапраўды жадаеце выдаліць прэсэт \"%1\"?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "Вы сапраўды жадаеце выдаліць гэты плэйліст?" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "Вы сапраўды жадаеце ачысьціць статыстыку гэтых песень?" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Выканаўца" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Пра Артыста" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "Радыё выканаўцы" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "Тэгі выканаўцы" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "Ініцыялы выканаўцы" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Фармат аўдыё" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Памылка аўтэнтыфікацыі" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "Аутар" #: ui/about.cpp:65 msgid "Authors" msgstr "Аўтары" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Аўта" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Аўтаматычнае абнаўленьне" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "Аўтаматычна адкрываць адзіночныя катэгорыі ў дрэве калекцыі" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "Даступна" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "Сярэдні бітрэйт" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "Прыкладны памер выявы" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "Подкасты BBC" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "Фонавыя гукі" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Колер фону" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "Фонавая выява" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Празрыстасьць фону" #: core/database.cpp:734 msgid "Backing up database" msgstr "Рэзэрвнае капіяваньне базы дадзеных" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "Балянс" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Забараніць" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "Аналізатар палосамі" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Стандартны блакітны" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "Фармат аўдыёзапісаў" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Паводзіны" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "Найлепшая" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "Біяграфія з %1" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Бітрэйт" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "Бітрэйт" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "Аналізатар блёкамі" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "Тып блёка" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "Ступень размыцьця" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "Зьмесьціва" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "Пад'ём аналізатару" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Агляд..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "Працяжнасьць буфэру" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "Буфэрызацыя" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "Гэтыя крыніцы адключаныя:" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Клявішы" #: core/song.cpp:339 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "Падтрымка CUE" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "Адмена" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Абярыце вокладку" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Зьмяніць памер шрыфту..." #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "Зьмяніць рэжым паўтарэньня" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Зьмяніць камбінацыю клявішаў..." #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "Зьмяніць рэжым мяшаньня" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Зьмяніць мову" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "Зьмяненьне наладаў прайграваньня мона падзейнічае з наступных кампазыцыяў" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "Праверыць новыя выпускі" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Праверыць абнаўленьні..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "Пазначце імя для смарт-плэйліста" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Выбраць аўтаматычна" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Абраць колер..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "Абраць шрыфт" #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Выбар са сьпісу" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Выбраць, як плэйліст адсартаваны і колькі ў ім будзе песень." #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "Абраць каталёг для загрузкі подкастаў" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Выберыце сайт, які Clementine будзе выкарыстоўваць для пошуку тэкстаў песень." #: ui/equalizer.cpp:115 msgid "Classical" msgstr "Клясычная" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "Ачыстка" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Ачысьціць" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Ачысьціць плэйліст" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Памылка Clementine" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Памаранчовы Clementine" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Візуалізацыя Clementine" #: ../bin/src/ui_deviceproperties.h:376 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine можа аўтаматычна канвэртаваць музыку, якую капіруеце на гэтую прыладу ў фармат, які яна падтрымлівае." #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine можа прайграваць музыку, загружаную на " #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine можа прайграваць музыку, якую вы загрузілі на Dropbox" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine можа граць музыку на вашым Google Drive" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "Clementine можа прайграваць музыку, якую вы загрузілі на Ubuntu One" #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "Clementine можа паказваць паведамленьні пры зьмене дарожкі." #: ../bin/src/ui_podcastsettingspage.h:250 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:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine ня можа загрузіць якою-небудзь візуалізацыю projectM. Праверце, што ўсталявалі Clementine правільна." #: internet/lastfmsettingspage.cpp:110 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 "Clementine ня змог атрымаць статус вашай падпіскі з-за праблем са злучэньнем. Прайграныя трэкі будуць кэшаваныя і адпраўленыя на Last.fm пазьней." #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Прагляд малюнкаў у Clementine" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "Clementine ня змог знайсьці вынікі па запыце для гэтака файлу" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "Clementine будзе шукаць тут:" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Націсьніце тут, каб дадаць музыку" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "Націсьніце для пераключэньня паміж часам, які застаецца і поўнай працягласьцю" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "Зачыніць плэйліст" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "Зачыніць візуалізацыю" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "Закрыцьцё гэтага вакна адменіць загрузку." #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "Закрыцьцё гэтага вакна спыніць пошук вокладак альбомаў." #: ui/equalizer.cpp:116 msgid "Club" msgstr "Клюбны" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Colors" msgstr "Колеры" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Падзелены коскамі сьпіс \"кляс:узровень\", дзе ўзровень ад 0 да 3" #: playlist/playlist.cpp:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Камэнтар" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "Аўтаматычна запоўніць тэгі" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "Аўтаматычна запоўніць тэгі..." #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Кампазытар" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "Наладзіць %1" #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "Наладзіць Grooveshark..." #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Наладзіць Last.fm..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "Наладзіць Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Камбінацыі клявішаў" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "Наладзіць Spotify..." #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "Наладзіць Subsonic..." #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "Наладзіць глябальны пошук..." #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "Наладзіць калекцыю..." #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "Наладзіць подкасты..." #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "Наладзіць..." #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "Падключыць пульт Wii, выкарыстоўваючы актывацыю/дэактывацыю" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "Падлучыць прыладу" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "Падключэньне да Spotify" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "Кансоль" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "Пастаянны бітрэйт" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "Канвэртаваць ўсю музыку" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "Канвэртаваць ўсю музыку, якую можа прайграваць прылада." #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "Скапіяваць у буфэр" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Капіяваць на прыладу..." #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Капіяваць у калекцыю..." #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "Копірайт" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Немагчыма злучыцца з Subsonic, праверце URL. Прыклад: http://localhost:4040/" #: transcoder/transcoder.cpp:64 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Немагчыма стварыць элемент GStreamer \"%1\" - пераканайцеся, што ў вас усталяваныя ўсе неабходныя плагіны GStreamer" #: transcoder/transcoder.cpp:432 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "Немагчыма знайсці мультыплексар для %1. Пераканайцеся, што ў вас усталяваныя неабходныя плагіны GStreamer." #: transcoder/transcoder.cpp:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Немагчыма знайсці кадавальнік для %1, праверце, што ўсталяваныя ўсе неабходныя плагіны GStreamer" #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "Немагчыма загрузіць радыёстанцыю last.fm" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "Немагчыма адкрыць выходны файл %1" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Мэнэджэр вокладак" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "Вокладка са ўбудаванай выявы" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Вокладка загружаная аўтаматычна з %1" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "Вокладка самастойна адключаная" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "Вокладка не заданая" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "Вокладка заданая з %1" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "Вокладкі з %1" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "Стварыць новы плэйліст Grooveshark" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "Кросфэйд пры аўтаматычнай зьмене трэку" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "Кросфэйд пры ручной змене трэку" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "Карыстальніцкі" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "Карыстальніцкая выява:" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "Налады паведамленьня" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "Карыстальніцкае радыё" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Карыстальніцкі..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "DBus path" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Танцавальны" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Дата стварэньня" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Дата зьмены" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "Дзень (дня, дзён)" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "Па &змоўчаньні" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "Паменьшыць гучнасьць на 4%" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "Памяншаць гучнасьць на адсоткаў" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Паменьшыць гучнасьць" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "Карыстальніцкая выява па-змоўчаньні:" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "Па змоўчаньні" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "Затрымка паміж візуалізацыямі" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "Выдаліць" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "Выдаліць плэйліст Grooveshark" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "Выдаліць спампаваныя дадзеныя" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Выдаліць файлы" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Выдаліць з прылады" #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Выдаліць з дыску..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "Выдаліць праслуханыя выпускі" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "Выдаліць прэсэт" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "Выдаліць смарт-плэйліст" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "Выдаліць арыгінальныя файлы" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Выдаленьне файлаў" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "Прыбраць з чаргі абраныя трэкі" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "Прыбраць трэк з чаргі " #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Назначэньне" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Падрабязнасьці..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Прылада" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Уласьцівасьці прылады" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Імя прылады" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Уласьцівасьці прылады..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Прылады" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Магчыма, вы мелі на ўвазе" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "Пароль" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "Імя карыстальніка" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "Прамое злучэньне з Інтэрнэтам" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Каталёг" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "Адключыць працягласьць" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "Выключыць генэрацыю панэлі настрою" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Выключана" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Дыск" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "Бесперапынная перадача" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "Налады адлюстраваньня" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Паказваць экраннае апавяшчэньне" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "Перасканаваць бібліятэку" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "Не канвэртаваць ніякую музыку" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "Не перазапісваць" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Не паўтараць" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "Не паказваць у \"Розных выканаўцах\"" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "Ня зьмешваць" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "Не спыняць!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "Ахвяраваць" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Двайная пстрычка для адкрыцьця" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "Двайны клік на песьні" #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "Спампаваць %n сэрыяў" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "Каталёг загрузак" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "Спампаваць сэрыі ў" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "\"Download\" падпіска" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "Пампаваць новыя выпускі аўтаматычна" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "Запампоўка даданая ў чаргу" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Загрузіць гэты альбом" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Спампаваць гэты альбом..." #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "Спампаваць гэтую сэрыю" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "Спампаваць..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "Пампаваньне (%1%)..." #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "Запампоўка дырэкторыі lcecast" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "Запампоўка каталёга Jamendo" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "Спампаваць каталог Magnatune" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "Запампоўка плагіна Spotify" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "Запампоўка мэтададзеных" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "Цягнеце для перамяшчэння" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "Dropbox" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "Дынамічны рэжым уключаны" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "Выпадковы дынамічны мікс" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "Рэдагаваць смарт-плэйліст" #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Рэдагаваць тэг \"%1\"..." #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "Рэдагаваць тэг..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "Рэдагаваць тэгі" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Рэдагаваньне інфарамацыі аб кампазыцыі" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "Рэдагаваць інфармацыю аб кампазыцыі..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Рэдагаваць інфармацыю аб кампазыцыях..." #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Рэдагаваць..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "Уключыць падтрымку Wii Remote" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "Задзейнічаць эквалайзэр" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "Задзейнічаць камбінацыі толькі ў вакне праграмы" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Уключыць пералічаныя ніжэй крыніцы, каб уключыць іх у вынікі пошуку. Вынікі будуць адлюстраваныя ў гэтым парадку." #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "Уключыць/выключыць скроблінг Last.fm" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "Складанасьць кадаваньня" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "Якасьць кадаваньня" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "Рэжым кадаваньня" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "Уведзьце URL" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "Уведзьце URL для пампаваньня вокладки з Інтэрнэту" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "Уведзьце імя файла для экспартаванае вокладкі (без пашырэньня)" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "Уведзьце новае імя для гэтага плэйлісту" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Уведзьце выканаўцу ці тэг каб слухаць радыё Last.fm." #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Уведзьце ключавыя словы для пошуку музыкі на кампутары і ў інтэрнэце" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Уведзьце ключавыя словы для пошуку ў iTunes Store" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Уведзьце ключавыя словы для пошуку ў gpodder.net" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "Пошук..." #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "Уведзьце адрас радыёпатоку:" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "Уведзьце імя тэчкі" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "Уведзьце гэты IP у Прыкладаньні для падлучэньня да Clementine." #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "Уся калекцыя" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Памылка" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Памылка падлучэньня да прылады MTP" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "Памылка капіяваньня песень" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "Памылка выдаленьня песень" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "Памылка запампоўкі плагіна Spotify" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "Памылка загрузкі %1" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Памылка пры загрузке плэйлісту di.fm" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "Памылка пры апрацоўке %1: %2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "Памылка пры загрузке Аўдыё CD" #: library/library.cpp:63 msgid "Ever played" msgstr "Прайграных хоць калі" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "Кожныя 10 хвілінаў" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "Кожныя 12 гадзін" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "Кожныя 2 гадзіны" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "Кожныя 20 хвілінаў" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "Кожныя 30 хвілінаў" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "Кожныя 6 гадзінаў" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "Кожную гадзіну" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Акрамя трэкаў з аднаго й таго ж альбому ці CUE-файлу" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "Існыя вокладкі" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "Разгарнуць" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "Тэрмін дзеяньня мінае %1" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "Экспартаваць Вокладкі" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "Экспартаваць вокладкі" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "Экспартаваць спампаваныя вокладкі" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "Экспартаваньне скончана" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "Экспартавана %1 вокладак(кі) з %2 (%3 прапушчана)" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "Плаўная паўза / працяг" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "Згасаць пры спыненьні прайграваньня" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "Згасаньне" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "Працягласьць згасаньня" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "Памылка атрыманьне каталёгу" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "Памылка атрыманьня подкастаў" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "Памылка загрузкі подкастаў" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "Памылка разбору XML у дадзенай RSS падпісцы" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "Хутка" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "Улюбёныя" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "Улюбёныя трэкі" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "Запоўнiць пустыя вокладкi" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "Выбіраць аўтаматычна" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "Дадзеныя атрыманыя" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "Складаньне бібліятэкі Subsonic" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Памылка пошуку вокладкі" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "Пашырэньне файлу" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "Фарматы файлаў" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Імя файла" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "Імя файла (без указаньня шляху)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Памер файлу" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Тып файлу" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Имя файлу" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Файлы" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "Файлы для перакадаваньня" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "Знайсьці песьні ў вашай бібліятэцы, якія адпавядаюць пазначаным" #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "Дактыласкапаваньне песьні" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "Гатова" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "Першы ўзровень" #: core/song.cpp:328 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Памер шрыфту" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Праз ліцэнзыйныя згаджэньні падтрымка Spotify рэалізаваная ў выглядзе асобнага плагіну" #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "Прымусовае кадаваньне ў мона" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "Забыць прыладу" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Форма" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "Фармат" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Чашчыня кадраў" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "Фрэймаў на буфэр" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Сябры" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "Зьмерзлы" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Full Bass" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "Full Bass + Treble" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "Full Treble" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "Рухавічок аўдыё GStreamer" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "Агульныя" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Агульныя налады" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Жанр" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "Атрымаць URL на гэты плэйліст Grooveshark." #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "Атрымаць URL на гэтую песьню ў Grooveshark." #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "Атрыманьне папулярных песень на Grooveshark" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "Атрыманьне каналаў" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "Атрыманьне струменяў" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "Даць імя:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "Перайсьці" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "Перайсьці да наступнага сьпісу прайграваньня" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "Перайсьці да папярэдняга сьпісу прайграваньня" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "Атрымана %1 вокладак з %2 (%3 атрымаць не ўдалося)" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "Адзначаць шэрым няісныя песьні ў плэйлістах" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "Памылка пры ўваходзе на сэрвіс Grooveshark" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "Спасылкі на плэйліст Grooveshark" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "Радыё Grooveshark" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "Спасылка песьні на Grooveshark" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "Сартаваць Бібліятэку па..." #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "Згрупаваць па" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "Сартаваць па Альбом" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "Сартаваць па Выканаўца" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "Сартаваць па Выканаўца/Альбом" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "Сартаваць па Выканаўца/Год - Альбом" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "Сартаваць па Жанр/Альбом" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "Сартаваць па Жанр/Выканаўца/Альбом" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "Групаваньне" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "HTML-старонка не зьмяшчае RSS-падпісак" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "HTTP проксі" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "Шчасьлівы" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "Інфармацыя пра абсталяваньне." #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "Інфармацыя пра абсталяваньне даступная толькі калі прылада падключаная" #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "Высокі" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "Высокі (%1 fps)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "Высокая (1024x1024)" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "Гадзін(ы)" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "Гіпнажаба" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "У мяне няма акаўнту Magnatune" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Іконка" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "Іконкі ўверсе" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "Вызначэньне песьні" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "Калі працягваць, то прылада будзе працаваць павольна й капіяваньне кампазыцый на яго можа не працаваць" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Калі вы ведаеце URL подкасту, уведзьце яго сюды і націсьніце Go." #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "Ігнараваць \"The\" ў імені выканаўцы" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Выявы (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "Праз %1 дзён (дні)" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "Праз %1 тыдняў (тыдні)" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "У дынамічнам рэжыме новыя трэкі выбіраюцца й дадаюцца ў сьпіс прайграваньня кожны раз, калі зьвяршаецца чарговая песьня." #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "Уваходныя" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "Уключыць вокладку ў апавяшчэньні" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "Уключыць усе песьні" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Несумяшчальная вэрсія пратаколу Subsonic REST. Трэба абнавіць кліент." #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Несумяшчальная вэрсія пратаколу Subsonic REST. Трэба абнавіць сэрвэр." #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "Павялічыць гучнасьць на 4%" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "Павялічваць гучнасьць на адсоткаў" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Павялічыць гучнасьць" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "Індэксуем %1" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "Сьведкі" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "Устаўка" #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Усталявана" #: core/database.cpp:673 msgid "Integrity check" msgstr "Праверка цельнасьці" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Інтэрнэт" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "Інтрэрнэт правайдэры" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "Нявправільны ключ API" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Няверны фармат" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "Няправільны мэтад" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "Няверныя парамэтры" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "Няправільна ўказаная крыніца" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "Няправільная служба" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "Няправільны ключ сэсіі" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "Няверныя імя карыстальніка і/ці пароль" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "Найчасьцей праслуханыя трэкі на Jamendo" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "Самыя папулярныя трэкі на Jamendo" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "Лепшыя трэкі месяца на Jamendo" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "Самыя папулярныя трэкі тыдня на Jamendo" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "База Jamendo" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "Перайсьці да бягучага трэку" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Адлюстроўваць кнопкі на працягу %1 сэкунд..." #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Адлюстроўваць кнопкі на працягу %1 сэкунды..." #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "Працягваць працу ў фонавым рэжыме, калі вакно зачыненае" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "Захаваць арыгінальныя файлы" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "Кацяняты" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Мова" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "Ноўтбук/навушнікі" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Вялікі карыдор" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "Вялікая вокладка альбому" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "Шырокая бакавая панэль" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "Апошняе праслуханае" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "Карыстальніцкае радыё Last.fm: %1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Бібліятэка Last.fm - %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "Радыё Мікс Last.fm - %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Радыё суседзяў Last.fm - %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Радыёстанцыя Last.fm - %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Падобныя выканаўцы Last.fm на %1" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Радыё тэгаў Last.fm: %1" #: internet/lastfmservice.cpp:437 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm у дадзены момант заняты, паспрабуйце праз некаторы час" #: ../bin/src/ui_lastfmsettingspage.h:154 msgid "Last.fm password" msgstr "Пароль Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "Колькасьць праслухоўваньняў на Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Last.fm тэгі" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Логін Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Last.fm wiki" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "Найменш улюбёныя трэкі" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "Пакіньце пустым для змоўчаньня. Напрыклад: \"/dev/dsp\", \"front\", і г.д." #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "Левы" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Працягласьць" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Бібліятэка" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "Пашыраная сартоўка калекцыі" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "Апавяшчэньне сканіраваньня бібліятэкі" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "Пошук па бібліятэцы" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Абмежаваньні" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "Слухаць музыку на сэрвісе Grooveshark, базуючыся на праслуханых раней песьнях." #: ui/equalizer.cpp:123 msgid "Live" msgstr "Live" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Загрузіць" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "Загрузка вокладкі па спасылцы" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "Загрузіць вокладку з URL..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "Загрузіць вокладку з дыску" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "Загрузіць вокладку з дыску..." #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "Загрузіць плэйліст" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "Загрузіць плэйліст..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Загрузка радыё Last.fm" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Загрузка прылады MTP" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "Загрузка базы дадзеных iPod" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "Загрузка смарт-плэйлісту" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "Загрузка песень" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "Загрузка струменю" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "Загрузка трэкаў" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "Загрузка інфармацыі пра трэк" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "Загрузка..." #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "Загрузіць файлы/URLs, замяняючы бягучы плэйліст" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Уваход" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "Памылка ўваходу" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "Профіль Long term prediction (LTP)" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "Упадабаць" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Нізкі (%1 fps)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "Нізкая (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "Профіль нізкай складанасьці (LC)" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "Тэксты песень" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "Тэкст песьні з %1" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Загрузка Magnatune" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Загрузка Magnatune скончаная" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "Асноўны профіль (MAIN)" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "Да будзе так!" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "Зрабіць плэйліст даступным офлайн" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "Няправільны адказ" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "Ручная наладка проксі" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "Самастойна" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "Вытворца" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "Пазначыць як праслуханае" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "Пазначыць як новае" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "Супадае з кожнай умовай пошуку (І)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "Супадае з адным ці некалькімі ўмовамі (ЦІ)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "Максымальны бітрэйт" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "Сярэдні (%1 fps)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "Сярэдняе (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "Тып падпіскі" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "Мінімальны бітрэйт" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "Прапушчаныя ўсталёўкі projectM" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "Мадэль" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "Сачыць за зьменамі бібліятэкі" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "Прайграваньне мона" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "Месяцаў" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "Настрой" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "Стыль панэлі настрою" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "Панэлі Настрою" #: library/library.cpp:74 msgid "Most played" msgstr "Найчасьцей праслуханае" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "Пункт мантаваньня" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "Пункты мантаваньня" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "Перамясьціць долу" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "Перамясьціць у бібліятэку" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "Перамясьціць вышэй" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "Музыка" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Музычная Бібліятэка" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "Бязгучна" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "Мая Бібліятэка Last.fm" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "Маё Last.fm мікс радыё" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "Мае суседзі па Last.fm" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "Маё радыё рэкамэндацый на Last.fm" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "Радыё Мой Мікс" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "Мая Музыка" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "Мае Суседзі" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "Мая Радыёстанцыя" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "Мае Рэкамэндацыі" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Імя" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "Налады называньня" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "Вузкая паласа прапусканьня (NB)" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "Суседзі" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "Сеціва" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "Сеціўная проксі-служба" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "Сеткавае кіраваньне" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "Ніколі" #: library/library.cpp:67 msgid "Never played" msgstr "Ніколі не праслухоўвалася" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "Ніколі не пачынаць прайграваць" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "Новая тэчка" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "Новы плэйліст" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "Новы смарт-плэйліст..." #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "Новыя песьні" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "Новыя трэкі будуць даданыя аўтаматычна" #: library/library.cpp:80 msgid "Newest tracks" msgstr "Новыя трэкі" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "Далей" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Наступны трэк" #: core/utilities.cpp:147 msgid "Next week" msgstr "На наступным тыдні" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "Без аналізатару" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "Няма фонавай выявы" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "Няма вокладак для экспартаваньня." #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "Бяз доўгіх блёкаў" #: playlist/playlistcontainer.cpp:366 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Супадзеньняў ня знойдзена. Ачысьціце радок пошуку, каб зноў убачыць плэйліст." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "Без кароткіх блёкаў" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "Нічога" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "Ніводная з абраных песень ня будзе скапіяваная на прыладу" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "Звычайны" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "Нармальны тып блёкаў" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "Не даступныя пры выкарыстаньні дынамічных плэйлістоў" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "Не падключана" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "Нестае зьместу" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "Нестае фанаў" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "Нестае ўдзельнікаў" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "Нестае суседзяў" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Не ўсталявана" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "Ня быў выкананы логін" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "Не падключана. Зрабіце двайны пстрык мышшу для падключэньня." #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "Тып апавяшчэньня" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Апавяшчэньні" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Зараз грае" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "Перадагляд OSD" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "Непразрыстасьць" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "Адчыніць %1 у браўзэры" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "Адкрыць аўдыё CD..." #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "Адкрыць файл OPML" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "Адкрыць файл OPML..." #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "Адкрыць прыладу" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "Адкрыць файл..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "Адчыніць у Google Drive" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "Адкрыць у новым плэйлісьце" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Адкрыць" #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "Апэрацыя не ўдалася" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "Аптымізаваць па бітрэйце" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "Аптымізаваць па якасьці" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "Опцыі..." #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "Упарадкаваць файлы" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "Упарадкаваць файлы..." #: core/organise.cpp:65 msgid "Organising files" msgstr "Арганізацыя файлаў" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "Першапачатковыя тэгі" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Іншыя налады" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "Вывадная прылада" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "Опцыі вываду" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "Плагін вываду" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "Перазапісаць усё" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "Перазапісаць існыя файлы" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "Перазапісаць толькі меньшыя:" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "Уладальнік" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "Аналіз каталога Jamendo" #: ui/equalizer.cpp:124 msgid "Party" msgstr "Party" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "Пароль" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Прыпыніць" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "Прыпыніць прайграваньне" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Прыпынены" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "Нармальная бакавая панэль" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Прайграць" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "Прайграць выканаўцу ці тэг" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "Прайграць радыё артыста..." #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "Колькасць прайграваньняў" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "Слухаць карыстальніцкае радыё..." #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "Прайграць калі спынена, прыпыніць калі прайграваецца" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "Прайграць, калі яшчэ нічога не прайграваецца" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "Прайграць радыё тэга..." #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "Прайграць кампазыцыю ў плэйлісьце" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "Граць/Прыпыніць" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Прайграваньне" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Налады плэеру" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "Плэйліст" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "Плэйліст скончыўся" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "Налады плэйлісту" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "Тып плэйлісту" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "Плэйлісты" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "Зачыніце браўзэр і вяпніцеся ў Clementine." #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "Статус плагіну:" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "Подкасты" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Pop" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "Папулярныя песьні" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "Найпапулярнейшыя песьні за месяц" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "Найпапулярнейшыя песьні сёньня" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "Працягласьць усплываючага паведамленьня" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "Порт" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "Прадузмацненьне" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "Налады" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "Налады..." #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "Пераважныя імёны файлаў вокладак (раздзеленыя коскамі)" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "Пераважны аўдыё фармат" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "Пераважны бітрэйт" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "Пераважны фармат" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "Прэміум аўдыё" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "Профіль:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "Націсьніце камбінацыю клявішаў" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "Націсьніце клявішу" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Нажміце камбінацыю клявішаў для %1..." #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "Парамэтры OSD" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "Перадагляд" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "Папярэдні" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "Папярэдні трэк" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Вывесьці інфармацыю аб вэрсіі" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "Профіль" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "Прагрэс" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 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:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "Якасьць" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "Апытваньне прылады..." #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "Мэнэджэр Чаргі" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "Дадаць абраныя трэкі ў чаргу" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "Дадаць у чаргу" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "Радыё (аднолькавая гучнасьць для ўсіх трэкаў)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "Радыё" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "Дождж" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "Выпадковая візуалізацыя" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "Ацаніць бягучую кампазыцыю ў 0 зорак" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "Ацаніць бягучую кампазыцыю ў 1 зорку" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "Ацаніць бягучую кампазыцыю ў 2 зоркі" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "Ацаніць бягучую кампазыцыю ў 3 зоркі" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "Ацаніць бягучую кампазыцыю ў 4 зоркі" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "Ацаніць бягучую кампазыцыю ў 5 зорак" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "Рэйтынг" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "Ці сапраўды адмяніць?" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "Абнавіць" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "Абнавіць каталёг" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "Абнавіць каналы" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "Абнавіць сьпіс сяброў" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "Абнавіць сьпіс станцый" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "Абнавіць струмені" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Reggae" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "Запомніць рух пульта Wii" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "Запомніць апошняе" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Выдаліць" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "Выдаліць дзеяньне" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "Прыбраць паўторы з плэйлісту" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "Прыбраць каталёг" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "Прыбраць з Маёй Музыкі" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "Прыбраць з абраных" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "Прыбраць з плэйлісту" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "Выдаліць плэйлісты" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "Прыбраньне кампазыцыі з Маёй Музыкі" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "Прыбраньне кампазыцыі са ўлюбёных" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "Пераназваць плэйліст \\\"%1\\\"" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "Пераназваць плэйліст Grooveshark" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "Пераназваць плэйліст" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "Пераназваць плэйліст..." #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "Перанумараваць трэкі ў такім парадку..." #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Паўтараць" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "Паўтараць альбом" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "Паўтараць плэйліст" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "Паўтараць трэк" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Замяніць бягучы плэйліст" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "Замяніць плэйліст" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "Замяняць прагалы падкрэсьліваньнем" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "Replay Gain" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "Рэжым Replay Gain" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "Перазапоўніць" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "Ськід" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" 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:206 msgid "Restrict to ASCII characters" msgstr "Абмежаваць толькі сымбалямі ASCII" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "Працягваць прайграваньне пры запуску" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "Загружаем сьпіс Маёй Музыкі з Grooveshark" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "Загрузка сьпісу абраных песень з Grooveshark" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "Загрузка плэйлістоў Grooveshark" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "Вярнуцца ў Clementine." #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "Правы" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "Запусьцiць" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "SOCKS проксі" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "Бясьпечна выняць прыладу" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "Бясьпечна выняць прыладу пасьля капіяваньня" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "Чашчыня" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "Чашчыня дыскрэтызацыі" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "Захаваць файлы .mood у музычную бібліятэку" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "Такая ж вокладка альбому" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "Захаваць вокладку на дыск..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "Захаваць выяву" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "Захаваць плэйліст" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "Захаваць плэйліст..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "Захаваць профіль" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "Захоўваць ацэнкі ў тэгах файлаў, калі магчыма" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "Захоўваць статыстыку ў тэгах файлаў, калі магчыма" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "Захаваць гэты струмень ў закладцы Інтэрнэт" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "Захаваньне статыстыкі песень у файлы" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "Захоўваньне трэкаў" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "Профіль Scalable sampling rate (SSR)" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "Лік" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "Скробліць трэкі, якія я слухаю" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "Пошук" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "Шукаць станцыі Icecast" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "Шукаць у Jamendo" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Шукаць на Magnatune" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "Пошук " #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "Шукаць вокладкі альбомаў..." #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "Пошук усяго" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "Шукаць на gpodder.net" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "Пошук у iTunes" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "Рэжым пошуку" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "Парамэтры пошуку" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "Вынікі пошуку" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "Умовы пошуку" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "Пошук на Grooveshark" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "Другі ўзровень" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "Перамотка назад" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "Перамотка наперад" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "Крыху пераматаць быгучы трэк" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "Пераматаць бягучы трэк на абсалютную пазыцыю" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "Абраць усё" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "Адмяніць выбар" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "Абярыце колер фону:" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "Абрацт фонавую выяву" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "Выбраць самыя пасуючыя вынікі" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "Абярыце колер:" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "Выбраць візуалізацыі" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "Выбраць візуалізацыі..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "Сэрыйны нумар" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "URL Сэрвэру" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "Дэталі сэрвэру" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "Служба не працуе" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Усталяваць %1 у \"%2\"..." #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "Усталяваць гучнасьць у адсоткаў" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "Усталяваць значэньне для вызначаных трэкаў..." #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Камбінацыя клявішаў" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "Камбінацыя клявішаў для %1" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Камбінацыя клявішаў для %1 ужо існуе" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Паказаць" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "Паказваць OSD" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "Падсьвечваць бягучы трэк" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "Паказваць панэль настрою ў радку прагрэсу" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "Паказваць сыстэмныя апавяшчэньні" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Паказваць апавяшчэньне пры зьмене рэжыму паўтору/мяшаньня" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "Паказваць апавяшчэньне пры зьмене гучнасьці" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "Паказваць усплываючыя паведамленьні" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "Паказваць OSD" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "Паказаць над радком стану" #: ui/mainwindow.cpp:460 msgid "Show all songs" msgstr "Паказаць усе кампазыцыі" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Паказаць усе песьні" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show cover art in library" msgstr "Паказваць вокладкі ў бібліятэцы" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "Паказваць падзяляльнікі" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "Паказаць поўны памер..." #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "Паказаць ў аглядчыку файлаў" #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "Паказаць ў \"Розных выканаўцах\"" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "Паказаць панэль настрою" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "Паказваць толькі дубляваныя" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "Паказваць толькі бяз тэгаў" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "Паказаць пошукавыя падказкі" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "Паказваць кнопкі \"Ўлюбёнае\" й \"Забараніць\"" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "Паказваць кнопку скроблінгу ў галоўным вакне" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "Паказаць значок у латку" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "Паказаць якія крыніцы ўключаны і адключаны" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "Паказаць/Схаваць" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Перамяшаць" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "Перамяшаць альбомы" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "Перамяшаць усё" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "Перамяшаць плэйліст" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "Перамяшаць трэкі ў гэтым альбоме" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "Уваход" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "Выйсьці" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "Адбываецца ўваход..." #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "Падобныя выканаўцы" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "Памер" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "Памер:" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "Перамясьціць назад у плэйлісьце" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "Прапусьціць падлік" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "Перамясьціць наперад ў плэйлісьце" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "Маленькая вокладка альбому" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "Вузкая бакавая панэль" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "Смарт-плэйліст" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "Смарт-плэйлісты" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "Інфармацыя аб кампазыцыі" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "Пра Песьню" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "Санаграма" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "Прабачце" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "Сартаваць па жанры (ў альфабэтным парадку)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "Сартаваць па стылю (па папулярнасьці)" #: ../bin/src/ui_icecastfilterwidget.h:77 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 "Сартаваць" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "Крыніца" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "Крыніцы" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "Памылка логіну Spotify" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "Плагін Spotify" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "Плагін Spotify не ўсталяваны" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "Стандартны" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "Ацэненыя" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "Запусьціць бягучы плэйліст" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "Пачаць перакадаваньне" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Пачніце друкаваць штосьці ў пошукавым радку" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "Запуск %1" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "Запуск..." #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "Станцыі" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Спыніць" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "Спыніць пасьля" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "Спыніць пасьля гэтага трэку" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Спыніць прайграваньне" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "Спыніць прайграваньне пасьля бягучага трэку" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "Спынена" #: core/song.cpp:341 msgid "Stream" msgstr "Струмень" #: internet/subsonicsettingspage.cpp:30 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:160 msgid "Streaming membership" msgstr "\"Streaming\" падпіска" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "Плэйлісты, на якія вы падпісаныя" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "Падпісанты" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "Пасьпяхова!" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "Пасьпяхова запісанае %1" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "Прапанаваныя тэгі" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "Зводка" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "Звышвысокі (%1 fps)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "Вельмі высокая (2048x2048)" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "Падтрыманыя фарматы" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "Сынхранізацыя ўваходных Spotify" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "Сынхранізацыя плэйлістоў Spotify" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "Сынхранізацыя рэйтынгавых трэкаў Spotify" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "Сыстэмныя колеры" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "Укладкі ўверсе" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Тэг" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "Зьбіральнік тэгаў" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "Радыё тэга" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "Мэтавы бітрэйт" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "Уласьцівасьці тэксту" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Дзякуй" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Каманда \"%1\" ня можа быць выкананая." #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "Вокладка альбому бягучае кампазыцыі" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "Каталёг %1 няправільны" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "Плэйліст '%1' пусты ці ня можа быць загружаны." #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "Запытаная вамі спасылка не зьяўляецца выявай!" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "У альбоме прысутнічаюць іншыя песьні" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "Праблема сувязі з gpodder.net" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Праблема атрыманьня мэтададзеных з Magnatune" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Праблема разбору адказу ад iTunes Store" #: ui/organiseerrordialog.cpp:56 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:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Гэтыя файлы будуць выдаленыя з прылады, вы дакладна жадаеце працягнуць?" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "These folders will be scanned for music to make up your library" msgstr "Гэтыя каталёгі будуць прасканіраваныя, каб пабудаваць вашую бібліятэку." #: ../bin/src/ui_transcodersettingspage.h:174 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:151 msgid "Third level" msgstr "Трэці ўзровень" #: internet/jamendoservice.cpp:171 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/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "Гэты альбом не даступны ў патрабаваным фармаце" #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Прылада павінна быць падключаная і адчыненая перад тым, як Clementine вызначыць, які фармат яна падтрымлівае." #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "Гэтая прылада падтрымлівае наступныя фарматы:" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Гэтая прылада ня будзе працаваць правільна" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "Гэты струмень толькі для платных падпісантаў" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "Гэты тып прылады не падтрымліваецца: %1" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "Таймаўт" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Назва" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "Каб уключыць радыё Grooveshark, трэба спачатку праслухаць некалькі іншых песень на гэтым сэрвісе" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "Сёньня" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "Уключыць" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Укл/Выкл поўнаэкранны рэжым" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "Пераключыць стан чаргі" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "Укл/Выкл скроблінг" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Паказаць/Скрыць экраннае апавяшчэньне" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "Заўтра" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "Занадта шмат перанакіраваньняў" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "Самыя папулярныя" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "Перадана байтаў увогуле" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "Выканана сеткавых запытаў увогуле" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Трэк" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "Перакадаваньне Музыкі" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "Лог Перакадоўшчыку" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "Перакадоўка" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Перакадавана %1 файлаў, выкарыстоўваючы %2 тэм" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "Парамэтры перакадоўкі" #: core/song.cpp:338 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "Турбіна" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "Выключыць" #: devices/giolister.cpp:161 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "URI(s)" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "Ультрашырокая паласа прапусканьня (UWB)" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Немагчыма спампаваць %1 (%2)" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Невядомы" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "Невядомы тып кантэнту" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Невядомая памылка" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "Выдаліць вокладку" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "Адпісацца" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "Канцэрты, якія маюць адбыцца" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "Абнавіць плэйліст Grooveshark" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "Абнавіць усе подкасты" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "Абнавіць зьмененыя тэчкі бібліятэкі" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "Абнаўляць бібліятэку пры старце Clementine" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "Абнавіць гэты подкаст" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "Абнаўленьне" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Абнаўленьне %1" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "Абнаўленьне %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Абнаўленьне бібліятэкі" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "Выкарыстаньне" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "Выкарыстоўваць тэг Выканаўца Альбому калі магчыма" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "Выкарыстоуваць камбінацыі клявішаў Gnome" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "Выкарыстоўваць мэтададзеныя Replay Gain, калі гэта магчыма" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "Выкарыстоўваць пульт Wii" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "Выкарыстоўваць карыстальніцкія колеры" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "Выкарыстоўваць уласнае апавяшчэньне" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "Выкарыстоўваць аўтэнтыфікацыю" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "Выкарыстоўваць рухавічок кіраваньня бітрэйтам" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "Выкарыстоўваць дынамічны рэжым" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "Паказваць апавяшчэньні аб статусе пульту Wii" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "Выкарыстоўваць часавое зглажваньне шумоў" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "Выкарыстоўваць сыстэмныя змоўчаньні" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "Выкарыстоўвауць сыстэмныя колеры" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "Выкарыстоўваць сыстэмныя налады проксі" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "Выкарыстоўваць выраўнаваньне гучнасьці" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "Скарыстана" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "Карыстальнік %1 ня мае акаўнту Grooveshark Anywhere" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "Інтэрфэйс" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Імя карыстальніку" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "Выкарыстаньне мэню для даданьня песьні..." #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "Пераменны бітрэйт" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "Розныя выканаўцы" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "Вэрсія %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "Прагляд" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "Рэжым візуалізацыі" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "Візуалізацыі" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "Налады візуалізацыі" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "Вызначэньне голасу" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "Гучнасьць %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "Вэб-сайт" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "Тыдняў" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "Падчас запуску Clementine" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "Калі сьпіс пусты..." #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "Чаму б не паспрабаваць..." #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "Шырокая паласа прапусканьня (WB)" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii Remote %1: актываваны" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "Пульт Wii Remote %1: злучаны" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Пульт Wii Remote %1: крытычны ўзровень зарада батарэі (%2%)" #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Пульт Wii Remote %1: дэактываваны" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Пульт Wii Remote %1: адлучаны" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Пульт Wii Remote %1: нізкі зарад батарэі (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "Windows Media audio" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "Бяз вокладкі:" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Перасунуць іншыя песьні з гэтага альбому ў Розныя Выканаўцы?" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "Ці жадаеце запусьціць паўторнае сканіраваньне?" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "Запісваць усю статыстыку песень ў іх файлы" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "Няправільнае імя ці пароль." #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "Год" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "Год - Альбом" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "Годы" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "Учора" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "Вы зьбіраецеся спампаваць наступныя альбомы" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "Вы не ўвайшлі." #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "Вы ўвайшлі як %1." #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "Вы ўвайшлі ў сыстэму." #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "Вы можаце абраць спосаб сартоўкі кампазыцый ў бібліятэцы." #: internet/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "Вы можаце свабодна слухаць музыку без рэгістрацыі, але чальцы Premium акаўнтаў могуць слухаць струмені ў лепшай якасьці без рэклямы." #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "Вы можаце слухаць фонавыя гукі адначасова з іншай музыкай." #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "Вы можаце скробліць трэкі свабодна, але толькі платныя падпісанты могуць слухаць радыё Last.fm з Clementine." #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "Вы ня маеце акаунту Grooveshark Anywhere" #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Вы ня маеце акаунту Spotify Premium" #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "Вы ня маеце актыўнае падпіскі" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Падлучэньне да сэрвісу Spotify было разарванае, уведзьце ваш пароль яшчэ раз у дыялёге Налады." #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Падлучэньне да сэрвісу Spotify было разарванае, уведзьце ваш пароль яшчэ раз." #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "Вы ўпадабалі гэты трэк" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "Запусьціце Наладку Сыстэмы (System Preferences) і ўключыце функцыю \"Дазволіць доступ для дадатковых прылад\" для выкарыстаньня глябальных камбінацый клявішаў ў Clementine." #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "Пасьля зьмены мовы патрабуецца перазапуск Clementine." #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "Вы ня можаце слухаць радыёстанцыю Last.fm, так як не зьяўляецеся яе падпісантам." #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "Вашая IP адрэса:" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Вашыя дадзеныя Last.fm некарэктныя" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "Вашыя дадзеныя Magnatune некарэктныя" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "Вашая бібліятэка пустая!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "Вашыя струмені радыё" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "Вашыя скроблінгі: %1" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Адсутнічае падтрымка OpenGL у сыстэме, візуалізацыі недаступныя." #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "Імя карыстальніка ці пароль няправільныя." #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Z-A(Я-А)" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Па-змоўчаньні" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "дадаць %n кампазыцыяў" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "пасьля" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "таму" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "і" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "аўтаматычна" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "да" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "паміж" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "спачатку найбольшыя" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "зьмяшчае" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "адключаны" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "дыск %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "не зьмяшчае" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "завяршаецца на" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "раўняецца" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "gpodder.net" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "Каталёг gpodder.net" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "болей за" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "у апошнія" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "кбіт/с" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "менш за" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "спачатку найдаўжэйшыя" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "перасунуць %n кампазыцый" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "спачатку найноўшыя" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "ня роўна" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "не ў апошнія" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "выключана" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "спачатку найстарэйшыя" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "на" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "налады" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "націсьніце \"enter\"" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "выдаліць %n кампазыцый" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "спачатку найкарацейшыя" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "Перамяшаць кампазыцыі" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "спачатку найменьшыя" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "сартаваць кампазыцыі" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "пачынаецца на" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "Спыніць" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "трэк %1" clementine-1.2.0+dfsg/src/translations/bg.po000066400000000000000000005304621223327513400210300ustar00rootroot00000000000000# 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 # cybercop , 2013 # svetlisashkov , 2012 # mandarinki , 2011 # Valentin Laskov , 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:07+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Bulgarian (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr " дни" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " кбита/сек" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " точки" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " секунди" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " песни" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 албума" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 дни" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "Преди %1 дни" #: podcasts/gpoddersync.cpp:79 #, 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:413 #, qt-format msgid "%1 selected of" msgstr "%1 избрани от" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 песен" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 песни" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 намерени песни" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 намерени песни (%2 показани)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 песни" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 прехвърлени" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1:Wiimotedev модул" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n неуспешно" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n завършено" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "&Потребителски" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "Допълнения" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "Помо&щ" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "&Скриване на %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "&Скриване..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Ляво" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "Музика" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Никакъв" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "Списък с песни" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Изход" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "Режим „Повторение“" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Дясно" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "Режим „Случаен ред“" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "&Разтегли колоните да се вместят в прозореца" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "&Инструменти" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(различен по време на множество песни)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "... и всички сътрудници от Amarok" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 ден" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 песен" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 случайни песни" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "Надградете към Premium сега" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "Необходим е Grooveshark Anywhere акаунт." #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "Необходим е Spotify Premium акаунт." #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:78 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:153 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Една песен ще бъде включена в списъка с песни, ако отговаря на тези критерии." #: smartplaylists/searchterm.cpp:297 msgid "A-Z" msgstr "А-Я" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "Славният хипножабок!" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "Относно %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "Относно Clementine..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "Относно QT..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Данни за акаунта" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "Информация за акаунта (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Действие" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Активно/неактивно WIIremote" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "Добави подкаст" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Добавяне на поток" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "Добавяне на нов ред ако се поддържа от типа известяване" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "Добавяне на действие" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Добавяне на друг поток..." #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Добавяне на папка..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "Добавяне на файл" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Добавяне на файл..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Добавяне на файлове за прекодиране" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Добавяне на папка" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Добавяне на папка..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Добавяне на нова папка..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "Добавя движещ се текст" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "Добавяне на подкаст..." #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Добавяне на аргумент за търсене" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "Добавяне на етикет име на албум за песен" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "Добавяне на етикет за изпълнител (албум) на песен" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "Добавяне на етикет за изпълнител на песен" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "Добавяне на етикет за композитор на песен" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "Добавяне на етикет за диск на песен" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "Добави името на файла на песента" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "Добавяне на етикет за жанр на песен" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "Добавяне на етикет за продължителност на песен" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "Добавяне на брой слушания" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "Добавяне брой пропускания на песента" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "Добавяне на етикет за име на песен" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "Добавяне на етикет за номер на песен" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "Добавяне на етикет за година на песен" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Добавяне на поток..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "Добавяне към Grooveshark любими" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "Добавяне към Grooveshark списък с песни" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "Добави в друг списък с песни" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Добавяне към списъка с песни" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "Добави към опашката" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Добави Wiiremote действие" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Добавяне..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Добавени този месец" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Добавени тази седмица" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Добавени тази година" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Добавени днес" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Добавени през последните три месеца" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "Добавяне на песен към Моята музика" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "Добавяне на песен в любими" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Разширено групиране..." #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "След " #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "След копиране..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Албум" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Албум (идеална сила на звука за всички песни)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Изпълнител на албума" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "Обложка на албума" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Информация за албума на jamendo.com..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Албуми с обложки" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Албуми без обложки" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Всички файлове (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "Славният хипножабок!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Всички албуми" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Всички изпълнители" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "Всички файлове (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Всички списъци с песни (%1)" #: ui/about.cpp:74 msgid "All the translators" msgstr "Всички преводачи" #: library/library.cpp:84 msgid "All tracks" msgstr "Всички песни" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "Позволи mid/side кодиране" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "Заедно с оригиналите" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Винаги скриване на основния прозорец" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Винаги показвай основния прозорец" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "Винаги започвай възпроизвеждането" #: internet/spotifyblobdownloader.cpp:60 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:61 msgid "An error occurred loading the iTunes database" msgstr "Възникна грешка при зареждането на базата данни на iTunes" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Получи се грешка при запис метаданните на '%1'" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:78 msgid "And:" msgstr "И:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "Ядосан" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Облик" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Добавяне на файлове/URL адреси към списъка с песни" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "Добавяне към текущия списък с песни" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "Добавяне към списъка с песни" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "Прилагане на компресия за да се предотврати орязване" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Сигурни ли сте, че искате да изтриете \"%1\" настройката?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "Сигурни ли сте, че искате да изтриете този списък с песни?" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "Сигурни ли сте, че искате да нулирате статистиката за тази песен?" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Изпълнител" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Информация за изпълнителя" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "Радио на изпълнител" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "Етикети за изпълнителя" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "Инициали на изпълнителя" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Аудио формат" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Неуспешна идентификация" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "Автор" #: ui/about.cpp:65 msgid "Authors" msgstr "Автори" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Автоматично" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Автоматично обновяване" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "Отвори автоматично единични категории от библиотечното дърво" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "Налични" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "Среден битов поток" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "Среден размер на изображение" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "BBC подкасти" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "Темпо" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "Фонови потоци" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Цвят на фона" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "Фоново изображение" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Прозрачност на фона" #: core/database.cpp:734 msgid "Backing up database" msgstr "Архивиране на базата данни" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Забрана" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "Колонков анализатор" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Основно синьо" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "Обикновен тип на звука" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Поведение" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "Най-добро" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "Биография от %1" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Поток в битове" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "Поток в битове" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "Блоков анализатор" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "Тип блок" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "Тяло" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "Бум анализатор" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Избор…" #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "Буфериране" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "Но тези източници са забранени:" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Бутони" #: core/song.cpp:339 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "Поддръжка на CUE листове" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "Отказ" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Смени обложката" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Смени размера на щрифта" #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "Смени режим повторение" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Промяна на бърз клавиш..." #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "Смени режим разбъркване" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Промяна на езика" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "Провери за нови епизоди" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Проверка за обновления..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "Изберете име за вашият умен списък с песни" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Автоматичен избор" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Избиране на цвят..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "Избор на шрифт..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Избор от списъка" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Изберете как ще е сортиран списъка и колко песни ще съдържа." #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "Избор на директория за сваляне на подкасти" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Изберете уебсайтовете, които искате Clementine да използва за търсене на текстовете на песните." #: ui/equalizer.cpp:115 msgid "Classical" msgstr "Класически" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "Почистване" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Изчистване" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Изчистване на списъка с песни" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Грешка в Clementine" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Портокал Clementine" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Clementine Визуализация" #: ../bin/src/ui_deviceproperties.h:376 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine може автоматично да конвертира музиката, която копирате в това устройство във формата, в който то може да я изпълнява." #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine може да възпроизвежда музикални файлове, които сте качили в Dropbox" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine може да възпроизвежда музикални файлове, които сте качили в Google Drive" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "Clementine може да възпроизвежда музикални файлове, които сте качили в Ubuntu One" #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "Clementine може да показва съобщение, когато се сменя песента" #: ../bin/src/ui_podcastsettingspage.h:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine може да синхронизира Вашите списък с абонаменти и приложения за движещи се текстове между компютрите Ви. Създаване на акаунт." #: visualisations/projectmvisualisation.cpp:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine не можа да зареди никаква projectM визуализация. Проверете дали сте инсталирали Clementine правилно." #: internet/lastfmsettingspage.cpp:110 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 "Clementine не можа да получи състоянието на Вашата регистрация, тъй като има проблем с връзката. Слушаните песни ще бъдат кеширани и изпратени по-късно към Last.fm." #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Clementine мениджър на изображения" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "Clementine не намери резултати за този файл" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "Clementine ще намери музика в:" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Цъкнете тук за да добавите музика" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "Цъкнете за да превключите между оставащо и пълно време" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "Затвори плейлиста" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "Затваря визуализацията" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "Затварянето на този прозорец ще прекрати свалянето" #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "Затварянето на този прозорец ще прекрати търсенето на обложки." #: ui/equalizer.cpp:116 msgid "Club" msgstr "Клуб" #: ../bin/src/ui_appearancesettingspage.h:272 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:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Коментар" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "Автоматично довършване на етикетите" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "Автоматично довършване на етикетите..." #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Композитор" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "" #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "Настройване на Grooveshark..." #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Настройване на Last.fm..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "Настройване на Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Настройване на бързите клавиши" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "Настройване на Spotify..." #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "Конфигурирай глобално търсене" #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "Настройване на библиотека..." #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "Конфигуриране на подкасти..." #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "Настройване..." #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "Свържете Wii дистанционни чрез действието активиране/деактивиране" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "Свързване на устройство" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "Свързване към Spotify" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "Постоянен битов поток" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "Конвертирай цялата музика" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "Конвертиране само музиката, която това устройство не може да възпроизвежда" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "Копиране в буфера" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Копирай в устройство..." #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Копиране в библиотека..." #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "Copyright" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:64 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Не мога да създам GStreamer елемент \"%1\" - уверете се, че всички необходими приставки на GStreamer са инсталирани" #: transcoder/transcoder.cpp:432 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "Не мога да намеря миксер за %1, проверете дали имате инсталирани правилните GStreamer плъгини." #: transcoder/transcoder.cpp:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Не мога да намеря кодер за %1, проверете дали имате инсталирани правилните GSteamer плъгини." #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "Не мога да заредя last.fm радио станция" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "Не мога да отворя изходен файл %1" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Мениджър за обложки" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "Обложка от изображение" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Обложката е заредена автоматично от %1" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "Обложката е ръчно премахната" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "Обложката не е зададена" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "Обложката е зададена от %1" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "Обложки от %1" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "Направа на нов Grooveshark списък с песни" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "Плавен преход при автоматична смяна на песни" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "Плавен преход при ръчна смяна на песни" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "По избор" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "Потребителско изображение:" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "Настройки на потребителското съобщение" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "Потребителско радио" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Потребителски..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "Път то DBus" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Денс" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Дата на създаване" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Дата на променяне" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "Дни" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "&По подразбиране" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "Намаляване на звука с 4%" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Намаляване на звука" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "Фоново изображение по подразбиране" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "Стандартни настройки" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "Забавяне между визуализации" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "Изтрий" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "Изтриване на Grooveshark списък с песни" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "Изтрий свалените данни" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Изтриване на файлове" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Изтриване от устройство" #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Изтриване от диска..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "Изтрий показаните епизоди" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "Изтриване на фиксираната настройка" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "Изтриване на умен списък с песни" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "Изтрий оригиналните файлове" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Изтриване на файлове" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "Махни от опашката избраните парчета" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "Махни от опашката парчето" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Местоположение" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Подробности..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Устройство" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Свойства на устройство" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Име на устройство" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Свойства на устройство..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Устройства" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Може би имахте предвид" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "Парола за Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "Потребителско име за Digitally Imported" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "Директна връзка към Интернет" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Папка" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "Изключване на продължитеност" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Изключено" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Диск" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "Непрекъснато излъчване" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "Настройки на показването" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Показване на екранно уведомление" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "Пусни пълно повторно сканиране на библиотеката" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "Не конвертирай никаква музика" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Без повторение" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "Да не се показва в различни изпълнители" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "Не разбърквай" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "Не спирай!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Двойно цъкване за отваряне" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "Двойното цъкване върху песен ще..." #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "Сваля %n епизода" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "Папка за сваляне" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "Свали епизодите в" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "Членство за сваляне" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "Сваляй автоматично новите епизоди" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "Опашка на свалянето" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Сваляне на този албум" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Сваляне на този албум..." #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "Свали този епизод" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "Изтегляне..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "Сваляне (%1%)..." #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "Сваляне на icecast директорията" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "Сваляне на jamendo каталог" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "Сваляне на каталог Magnatune" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "Изтегляне на приставка за Spotify" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "Сваляне на метаданни" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "Влачете за позициониране" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "Dropbox" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "Динамичния режим е включен" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "Динамичен случаен микс" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "Редактиране умен списък с песни..." #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Редактиране на етикет \"%1\"..." #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "Редактиране на етикет..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "Редактиране на етикети" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Редактиране на информацията за песента" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "Редактиране на информацията за песента..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Редактиране на информация за песните..." #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Редактиране..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "Разреши подръжката на Wii Remote" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "Разреши еквалазйзера" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "Разреши бързите клавиши, само когато Clementine е активен прозорец" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "Включване/изключване на Last.fm скроблинг" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "Сложност на кодирането" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "Качество на енджина на кодирането" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "Режим на кодирането" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "Въведете URL" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "Въведете URL за да свалите обложката от Internet:" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "Въведете ново име за този списък с песни" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Въведете изпълнител или етикет за да започнете да слушате Last.fm радио" #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Въведете по-долу термини за търсене в подкастите на iTunes Store" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Въведете по-долу термини за търсене в подкастите на gpodder.net" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "Въведете критерий за търсене" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "Въведете URL адрес на Интернет радио поток" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "Въведете името на новата папка" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "Цялата колекция" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Грешка" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Грешка при свързването на MTP устройство" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "Грешка при копиране на песни" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "Грешка при изтриване на песни" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "Грешка при изтеглянето на приставка за Spotify" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "Грешка при зареждане на %1" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Грешка при зареждане на di.fm списък с песни" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "Грешка при обработване на %1: %2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "Грешка при зареждането на аудио CD" #: library/library.cpp:63 msgid "Ever played" msgstr "Някога пускана" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "Всеки 10 минути" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "Всеки 12 часа" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "Всеки 2 часа" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "Всеки 20 минути" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "Всеки 30 минути" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "Всеки 6 часа" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "Всеки час" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Освен между песните в един и същи албум или в един и същи CUE лист" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "Разширяване" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "Изтича на %1" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "Заглушаване при спиране на песен" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "Заглушаване" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "Продължителност на заглушаване" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "Неуспех при извличане на директория" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "Не успях да извлека подкасти" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "Не успях да заредя подкаст" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "Неуспешен разбор на XML за тази RSS хранилка" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "Бързо" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "Любими" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "Любими парчета" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "Сваляне на липсващите обложки" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "Автоматично изтегляне" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "Изтеглянето завърши" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Грешка по време на свалянето на обложката" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "Файлово разширение" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "Файлови формати" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Име на файл" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "Име на файл (без път)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Размер на файла" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Тип на файла" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Име на файл" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Файлове" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "Файлове за прекодиране" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "Намери песни в библиотеката, които спазват вашият критерия" #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "Подпечатване на песента" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "Край" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "Първо ниво" #: core/song.cpp:328 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Размер на шрифта" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Поради причини, свързани с лицензирането, поддръжката на Spotify е като отделна приставка." #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "Принудително кодиране в моно" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "Забравяне на устройство" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Форма" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "Формат" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Скорост" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "Кадри за буфер" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Приятели" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "Заледен" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Пълен бас" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "Пълен бас + Високи" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "Пълни високи" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "GStreamer аудио двигател" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "Общи" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Общи настройки" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Жанр" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "Вземете линк за споделяне на този плейлист в Grooveshark" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "Вземете линк за споделяне на тази песен в Grooveshark" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "Извличане на Grooveshark популярни песни" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "Получаване на канали" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "Извличане на потоците" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "Въведете име:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "Давай" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "Отиване към подпрозореца със следващия списък с песни" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "Отиване към подпрозореца с предишния списък с песни" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "Успешно изтегляне на %1 от общо %2 обложки (неуспешно на %3)" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "Посивяване на песните, които не съществуват в моят списък с песни" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "Грешка при логин в Grooveshark" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "URL на плейлист в Grooveshark" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "Grooveshark радио" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "Линк към песента в Grooveshark" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "Групиране на Библиотеката по..." #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "Групиране по" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "Групиране по Албум" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "Групиране по Изпълнител" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "Групиране по Изпълнител/Албум" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "Групиране по Изпълнител/Година - Албум" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "Групиране по Жанр/Албум" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "Групиране по Жанр/Изпълнител/Албум" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "HTML страницата не съдържа никакви RSS хранилки" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "HTTP сървър-посредник" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "Щастлив" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "Хардуерна информация" #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "Хардуерна информация е налична единствено когато устройството е свързано." #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "Високо" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "Високо (%1 fps)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "Високо (1024x1024)" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "Часа" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "Хипножабok" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "Нямам регистрация в Magnatune" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Икона" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "Иконите отгоре" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "Идентифициране на песента" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "Ако продължите това устройство ще работи бавно и песните копирани в него може да не работят." #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Ако знаете URL-а на подкаст, въведете го по-долу и цъкнете върху Давай." #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "Игнориране на \"The\" в имена на изпълнители" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Изображения (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "В динамичен режим новите песни ще бъдат избирани и добавяни към списъка с песни всеки път, когато свърши песента." #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "Входящи" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "Включване на обложката в известяването" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "Включване на всички песни" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "Увеличаване на звука с 4%" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Увеличаване на звука" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "Индексиране %1" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "Информация" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "Вмъкване..." #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Инсталирани" #: core/database.cpp:673 msgid "Integrity check" msgstr "Проверка на интегритета" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Интернет" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "Интернет доставчици" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "Невалиден API ключ" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Невалиден формат" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "Невалиден метод" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "Невалидни параметри" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "Невалиден ресурс" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "Невалидна услуга" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "Невалиден ключ за сесия" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "Невалидно потебителско име и/или парола" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "Най-слушаните парчета в Jamendo" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "Най-високо класираните парчета в Jamendo" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "Най-високо класираните парчета в Jamendo този месец" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "Най-високо класираните парчета в Jamendo тази седмица" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "Jamendo база от данни" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "Отиване до песента, изпълнявана в момента" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Пази бутоните за %1 секундa..." #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Пази бутоните за %1 секунди..." #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "Продължи ипзълнението и във фонов режим, дори когато прозореца е затворен" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "Запази оригиналните файлове" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "Котенца" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Език" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "Лаптоп/Слушалки" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Голяма зала" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "Голяма обложка" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "Голяма странична лента" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "Последно изпълнение" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "Last.fm потребителско радио: %1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Last.fm Библиотека - %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "Last.fm радио микс - %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Last.fm Съседско Радио - %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Last.fm Радио Станция - %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Last.fm Изпълнители Подобни на %1" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Last.fm отбелязване на радио: %1" #: internet/lastfmservice.cpp:437 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm е претоварен в момента, моля, опитайте след няколко минути" #: ../bin/src/ui_lastfmsettingspage.h:154 msgid "Last.fm password" msgstr "Last.fm парола" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "Брой пускания в Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Last.fm етикети" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Last.fm потребителско име" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Last.fm уики" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "Най-малко любими песни" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "Оставете празно за данни по подразбиране. Примери: \"/dev/dsp\", \"front\" и т.н." #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Дължина" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Библиотека" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "Разширено групиране на Библиотеката" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "Известие за повторно сканиране на библиотеката" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "Търсене в библиотеката" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Ограничения" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "Слушане на Grooveshark песни на базата на изслушаното от Вас" #: ui/equalizer.cpp:123 msgid "Live" msgstr "На живо" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Зареди" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "Зареди обложка от URL" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "Зареди обложка от URL..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "Зареждане на обложка от диск" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "Зареждане на обложката от диска..." #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "Зареждане на списък с песни" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "Зареждане на списък с песни..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Зареждане на Last.fm радио" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Зареждане на MTP устройство" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "Зареждане на iPod база данни" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "Зареждане на умен списък с песни" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "Зареждане на песни" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "Зареждане на поток..." #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "Зареждане на песни" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "Зареждане на информация за песните" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "Зареждане…" #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "Зареждане на файлове/URL адреси, замествайки настоящият списък с песни" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Влизане" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "Влизането не успя" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "Long term prediction profile (LTP)" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "Любима" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Ниско (%1 fps)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "Ниско (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "Low complexity profile (LC)" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "Текстове на песни" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "Текстове на песни от %1" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Изтегляне от Magnatune" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Изтеглянето от Magnatune завършено" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "Main profile (MAIN)" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "Направи го така!" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "Списъкът с песни да е наличен в режим извън мрежа" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "Грешка при отговора" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "Ръчна настройка на сървъра-посредник" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "Ръчно" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "Производител" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "Маркирай като чута" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "Маркирай като нова" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "Съвпадане всеки термин за търсене (И)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "Съвпадане на един или повече терминала за търсене (ИЛИ)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "Максимален битов поток" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "Средно (%1 fps)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "Средно (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "Тип членство" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "Минимален битов поток" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "Липсват готови настройки за проектМ" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "Модел" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "Следи за промени в библиотеката" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "Месеца" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "Статус" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "" #: library/library.cpp:74 msgid "Most played" msgstr "Най-пускани" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "Точка на монтиране" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "Точки за монтиране" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "Преместване надолу" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "Преместване в библиотека..." #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "Преместване нагоре" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "Музика" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Музикална Библиотека" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "Без звук" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "Моята Last.fm Библиотека" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "Моето Last.fm Mix Радио" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "Моят Last.fm Квартал" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "Моето Last.fm Препоръчително Радио" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "Мое радио микс" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "Моята музика" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "Моят Квартал" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "Моята Радио Станция" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "Моите Препоръки" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Име" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "Опции за именуване" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "Narrow band (NB)" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "Съседи" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "Мрежа" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "Мрежов сървър-посредник" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "Дистанционно управление" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "Никога" #: library/library.cpp:67 msgid "Never played" msgstr "Никога пускани" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "Никога да не се пуска възпроизвеждането" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "Нова папка" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "Нов списък с песни" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "Нов умен списък с песни..." #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "Нови песни" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "Нови парчета ще бъдат добавяни автоматично." #: library/library.cpp:80 msgid "Newest tracks" msgstr "Най-нови парчета" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "Следваща" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Следваща песен" #: core/utilities.cpp:147 msgid "Next week" msgstr "Следващата седмица" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "Без анализатор" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "Няма фоново изображение" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "No long blocks" #: playlist/playlistcontainer.cpp:366 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Няма намерени съвпадения. Изтрийте текста, за да видите отново цялото съдържание." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "No short blocks" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "Никаква" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "Никоя от избраните песни бяха сподобни да бъдат копирани на устройството" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "Нормално" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "Normal block type" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "Не е налично при използването на динамичен списък с песни" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "Не е свързан" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "Недостатъчно съдържание" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "Недостатъчно почитатели" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "Недостатъчно членове" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "Недостатъчно съседи" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Не е инсталиран" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "Не сте вписан" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "Не е монтиран - двоен клик за монтиране" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "Тип на известяване" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Известия" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "В момента се изпълнява" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "OSD Изглед" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "Отвори %1 в браузъра" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "Отваряне на &аудио CD..." #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "Отворено устройство" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "Отваряне на файл..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "Отвори в Google Drive" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "Отворяне в нов списък с песни" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Отваряне..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "Неуспешна операция" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "Оптимизиране на битов поток" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "Оптимизиране за качество" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "Настройки…" #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "Организиране на Файлове" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "Организиране на файлове..." #: core/organise.cpp:65 msgid "Organising files" msgstr "Файловете се организират" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "Оригинални етикети" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Други настройки" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "Изходни настройки" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "Презапис на съществуващите файлове" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "Собственик" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "Претърсване на Jamendo каталога" #: ui/equalizer.cpp:124 msgid "Party" msgstr "Парти" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "Парола" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Пауза" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "На пауза" #: widgets/osd.cpp:156 msgid "Paused" msgstr "На пауза" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "Стандартна странична лента" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Възпроизвеждане" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "Възпроизвеждане на изпълнител или етикет" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "Възпроизвеждане радиото на изпълнителя" #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "Брой изпълнения" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "Възпроизвеждане на потребителско радио..." #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "Продължаване ако е спряно и обратно" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "Възпроизвеждане, ако има песен, която вече се изпълнява" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "Възпроизвеждане на отбелязано радио..." #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "Възпроизвеждане на тата песен от списъка с песни" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "Възпроизвеждане/Пауза" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Възпроизвеждане" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Настройки на плеър" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "Списък с песни" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "Списъка с песни е завършен" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "Настройки на списъка с песни" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "Тип на списъка с песни" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "Списъци с песни" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "Моля изберете вашия браузър и се върнете към Clementine" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "Състояние на приставката:" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "Подкасти" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Поп" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "Популярни песни" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "Популярните песни на месеца" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "Популярните песни днес" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "Врементраене на балончето" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "Порт" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "Предусилвател" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "Настройки" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "Настройки..." #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "Предпочитани файлови разширения за обложките, разделени със запетайки." #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "Предпочитан аудио формат" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "Предпочитан битов поток" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "Предпочитан формат" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "Premium тип на звука" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "Предварително зададени:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "Натиснете клавишна комбинация, която да използвате за" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "Натиснете клавиш" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Натиснете клавишна комбинация, която да използвате за %1..." #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "Настройки на красиво OSD" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "Преглед" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "Предишна" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "Предишна песен" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Показване на информация за версията" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "Профил" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "Напредък" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 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:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "Качество" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "Заявящо устойство..." #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "Мениджър на опашката" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "Пратете избраните песни на опашката" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "Прати избрана песен на опашката" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "Радио (еднаква сила на звука за всички песни)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "Радиа" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "Дъжд" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "Произволна визуализация" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "Задай рейтинг на текущата песен 0 звезди" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "Задай рейтинг на текущата песен 1 звезда" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "Задай рейтинг на текущата песен 2 звезди" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "Задай рейтинг на текущата песен 3 звезди" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "Задай рейтинг на текущата песен 4 звезди" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "Задай рейтинг на текущата песен 5 звезди" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "Рейтинг" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "Наистина ли искаш да затвориш?" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "Опресняване" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "Презареди каталога" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "Презареди каналите" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "Опресни списъка с приятели" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "Презареди листа със станциите" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "Обновяване на потоците" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Реге" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "Запомни Wiiremote суинг" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "Помни от предния път" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Премахване" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "Премахване на действието" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "Премахни дублиранията от плейлиста" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "Премахване на папката" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "Премахни от Моята музика" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "Премахване от любими" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "Премахване от списъка с песни" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "Премахване на песни от Моята музика" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "Премахване на песни от любими" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "Преименуване на \"%1\" списък с песни" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "Преименуване на Grooveshark списък с песни" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "Преименуване на списъка с песни" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "Преименуване на списъка с песни..." #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "Преномерирай песните в този ред..." #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Повтаряне" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "Повтаряне на албума" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "Повтаряне на списъка с песни" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "Повтаряне на песента" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Заместване на текущия списък с песни" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "Заместване на списъка с песни" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "Заменя интервалите със символи" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "Изравняване на усилването" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "Ново попълване" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "Възстановяване" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" 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:206 msgid "Restrict to ASCII characters" msgstr "Само ASCII символи" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "Извличане на Grooveshark любими песни" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "Извличане на Grooveshark списъци с песни" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "Назад към Clementine" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Рок" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "SOCKS сървър-посредник" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "Безопасно премахване на устройството" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "Безопасно премахване на устройството след приключване на копирането" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "Дискретизация" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "Дискретизация" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "Запази обложката на албума" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "Запази обложката на диска..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "Запазване на изображение" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "Запазване на списъка с песни" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "Запазване на списъка с песни..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "Запис на фиксирани настройки" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "Запази този поток в интернет таб" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "Запазване на песните" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "Scalable sampling rate profile (SSR)" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "Резултат" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "Запази песните, които слушам" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "Търсене" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "Търси Icecast станции" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "Търси в jamendo" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Търси в Magnatune" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "Търси за обложки" #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "Търсене из всички" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "Търси в gpodder.net" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "Търси в iTunes" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "Режим \"Търсене\"" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "Опции при търсене" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "Резултати от търсенето" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "Термини за търсене" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "Търсене в Grooveshark" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "Второ ниво" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "Придвижване назад" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "Придвижване напред" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "Следене на текущата песен с относително количество" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "Следене на текущата песен с абсолютно позиция" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "Избиране на всички" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "Изчистване на избора" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "Изберете цвета на фона:" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "Избор на фоново изображение" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "Избери най-доброто съвпадение" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "Изберете цвета на обекта:" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "Избери визуализации" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "Избери визуализации..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "Сериен номер" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "Услугата е недостъпна" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Задай %1 да е %2\"..." #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "Ниво на звука - процента" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "Избери стойност за всички песни" #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Бърз клавиш" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "Бърз клавиш за %1" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Бързият клавиш за %1 вече съществува" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Показване" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "Показване на OSD" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "Показва светеща анимация на текущата песен" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "Показване подразбиращо се за системата известяване" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Показване на известяване при превключване между режим разбъркано/случайно" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "Показване на известяване при промяна силата на звука" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "Покажи изкачащо прозорче в областа за уведомяване" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "Показване на красиво OSD" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "Покажи над status bar-а" #: ui/mainwindow.cpp:460 msgid "Show all songs" msgstr "Показвай всички песни" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Покажи всичките песни" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show cover art in library" msgstr "Показвай обложки в библиотеката" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "Покажи разделители" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "Покажи в пълен размер..." #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "Покажи във файловия мениджър..." #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "Показване в смесени изпълнители" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "Показвай само дубликати" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "Показване само на неотбелязани" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "Покажи подсказвания при търсене" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "Показване на бутоните \"харесвам\" и \"бан\"" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "Показване на бутона скроблинг в главния прозорец" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "Показване на икона в областта за уведомяване" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "Покажи кои източници са разрешени и кои забранени" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "Показване/скриване" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Случаен ред на изпълнение" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "Случаен ред на албуми" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "Случаен ред на изпълнение на всички" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "Разбъркване на списъка с песни" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "Случаен ред на песните в този алубм" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "Записване" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "Изход" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "Вписване..." #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "Подобни изпълнители" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ска" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "Прескачане назад в списъка с песни" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "Презключи броя" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "Прескачане напред в списъка с песни" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "Малки обложки" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "Малка странична лента" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "Умен списък с песни" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "Умни списъци с песни" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Лек" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "Лек рок" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "Информация за песен" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "Информация за песен" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "Сонограма" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "Съжалявам" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "Сортиране по жанр(азбучно)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "Сортиране по жанр(по популярност)" #: ../bin/src/ui_icecastfilterwidget.h:77 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 "Сортиране" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "Източник" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "Източници" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "Грешка в вписване в Spotify" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "Приставка за Spotify" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "Приставката за Spotify не е инсталирана" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "Стандартно" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "Със звезда" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "Стартиране на текущо възпроизвеждания списък с песни" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "Начало на прекодирането" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "Стартиране на %1" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "Стартиране..." #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "Станции" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Спиране" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "Спиране след" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "Спри след тази песен" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Спиране на възпроизвеждането" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "Спиране на възпроизвеждането след текущата песен" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "Спрян" #: core/song.cpp:341 msgid "Stream" msgstr "Поток" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "Членство за слушане" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "Абонирани списъци с песни" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "Абонати" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "Успешно!" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "Успешно записан %1" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "Предложени етикети" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "Резюме" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "Много високо (%1 fps)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "Супер високо (2048x2048)" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "Поддържани формати" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "Синхронизиране на входящата кутия на Spotify" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "Синхронизиране на списъка с песни от Spotify" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "Синхронизиране на оценените песни от Spotify" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "Системни цветове" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "Табовете отгоре" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Етикет" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "Получаване на етикети" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "Отбелязване на радио" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "Отбелязан битов поток" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Техно" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "Настройки на текста" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Благодарности на" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Командата \"%1\" не може да бъде стартирана" #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "Обложката на албума на текущо звучащата песен" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "Директорията \"%1\" не е валидна" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "Списъкът с песни '%1' беше празен или не можа да бъде зареден" #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "Сайта, който предоставихте не е изображение!" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "В този албум има други песни" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "Имаше проблем в комуникацията с gpodder.net" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Имаше проблем с изтеглянето на метаданните от Magnatune" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Имаше проблем в разбора на отговора от iTunes Store" #: ui/organiseerrordialog.cpp:56 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:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Тези файлове ще бъдат изтрити от устройството,сигурни ли сте че искате да продължите?" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "These folders will be scanned for music to make up your library" msgstr "Тези папки ще бъдат сканирани за музика за да направят вашата библиотека" #: ../bin/src/ui_transcodersettingspage.h:174 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:151 msgid "Third level" msgstr "Трето ниво" #: internet/jamendoservice.cpp:171 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/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "Този албум не е наличен в избраният формат" #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Това устройство трябва да бъде свързано и отоворено преди Clementine да маоже да види какви файлови формати подържа." #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "Това устройство подържа следните формати:" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Това устройство няма да работи както трябва." #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "Този поток е само за платени регистрации." #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "Този тип устройство не е подържано:%1" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "Изтичане на времето" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Заглавие" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "За да пуснете Grooveshark радио първо трябва да изслушане няколко песни в Grooveshark" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "Днес" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "Вкл./Изкл. на красиво екранно меню" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Превключване на пълен екран" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "Покажи статус на опашката" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "Включаване на скроблинга" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Превключване видимостта на красиво екранно меню" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "Утре" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "Твърде много пренасочвания" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "Топ песни" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "Общо прехвърлени байта" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "Общ брой направени мрежови заявки" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Песен" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "Прекодирай музиката" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "Журнал на прекодирането" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "Прекодиране" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Прекодиране на %1 файлове чрез %2 начина" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "Настройки на прекодиране" #: core/song.cpp:338 msgid "TrueAudio" msgstr "Инстинско Аудио" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "Турбина" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "Изключване" #: devices/giolister.cpp:161 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "URL-и" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Неуспешно сваляне %1 (%2)" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Непознат" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "Неизвестен тип съдържание" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Неизвестна грешка" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "Махни обложката" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "Премахване абонамент" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "Обновяване на Grooveshark списъците с песни" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "Обнови всички подкасти" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "Обнови папките с промени в библиотеката" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "Обновяване на библиотеката при стартиране на Clementine" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "Обнови този подкаст" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "Обновяване" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Обновяване %1" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "Обновяване %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Обновяване на библиотеката" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "Използване" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "Използване на клавишните комбинации на Гном" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "Ако е възможно да се използват мета данни на Изравняване на усилването" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "Използване на Wii дистанционно" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "Използване на потребителски цветове" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "Използване на потребителско съобщение за известията" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "Използване на удостоверяване" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "Използвай динамичен режим" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "Използвай известия за докладване на статуса на Wii Remote" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "Използвай подразбиращия се за систмета" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "Използване на подразбиращите се за системата цветове" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "Използване на системните настройки за сървър-посредник" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "Използване на нормализация на звука" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "Използван" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "Потребител %1 няма Grooveshark Anywhere акаунт." #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "Потребителски интерфейс" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Потребителско име" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "Използването на менюто за добавяне на песен ще..." #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "Променлив битов поток" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "Сборни формации" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "Версия %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "Изглед" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "Режим \"Визуализация\"" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "Визуализации" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "Настройки на визуализациите" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "Засичане на глас" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "Сила на звука %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "Уебсайт" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "Седмици" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "При стартиране на Clementine" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "Когато списъка е празен" #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "Защо не опиташ..." #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii Remote %1: активирано" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii Remote %1: свързано" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii Remote %1: критично ниво на батериите (%2%) " #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii Remote %1: деактивирано" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii Remote %1: несвързано" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Remote %1: ниско ниво на батерията (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "Аудио — Windows Media" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Искате ли да преместим другите песни от този албум в Различни изпълнители?" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "Искате ли да изпълните пълно повторно сканиране сега?" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "Година" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "Година - Албум" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "Години" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "Вчера" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "На път сте да свалите следните албуми" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "Не сте вписан." #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "Вписани сте като %1." #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "Вписани сте." #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "Можете да промените начина, по-който песните в библиотеката са организирани." #: internet/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "Можете да слушате безплатно без регистрация, но с Premium регистрация можете да слушате потоци с по-високо качество и без реклами." #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "Можете да слушате фонови потоци по същото време, когато слушате и музика." #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "Можете да слушате песни безплатно, но само хора с платени регистрации могат да слушат Last.fm радио от Clementine." #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "Нямате Grooveshark Anywhere акаунт." #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Нямате Spotify Premium акаунт." #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Отписан сте от Spotify, моля въведете отново паролата си в Настройки." #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Изписан сте от Spotify, моля въведете паролата си отново" #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "Харесвате тази песен" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "Трябва да влезете в Системните Настройки и да включите \"Разрешаване на достъп на асистиращи устройства\" за да изпозлвате глобалните клавишни комбинации в Clementine." #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "Трябва да рестартирате Clementine, ако смените езика." #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "Няма да можете да слушате радио станции от Last.fm, защото нямате регистрация там." #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Вашите Last.fm данни са грешни" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "Вашите данни за достъп за Magnatune бяха грешни" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "Вашата библиотека е празна!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "Вашите радио потоци" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "Вашите слушания: %1" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "В системата Ви липсва OpenGL поддръжка, визуализациите са недостъпни." #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "Вашето потребителско име или парола не съвпада." #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Я-А" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Нула" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "добавете %n песни" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "след" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "преди" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "и" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "автоматично" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "преди" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "между" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "Пъво най-големите" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "удари в минута" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "съдържа" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "изключено" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "диск %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "не съдържа" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "свършва с" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "равно" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "gpodder.net директория" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "по-голям от" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "в последните" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "килобита/сек" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "по-малко от" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "първо най-дългите" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "премести %n песни" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "първо най-новите" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "различно" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "не e в последните" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "не е на" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "първо най-старите" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "вкл." #: core/commandlineoptions.cpp:150 msgid "options" msgstr "опции" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "натиснете enter" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "премахване на %n песни" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "първо най-късите" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "първо най-малките" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "сортирай песните" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "започва с" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "Стоп" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "песен %1" clementine-1.2.0+dfsg/src/translations/bn.po000066400000000000000000004020451223327513400210320ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # emnoor , 2013 # FIRST AUTHOR , 2011 # minhazr , 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:08+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Bengali (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " কেবিপিএস" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " মিলিসেকেন্ড" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " পয়েন্ট" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " সেকেন্ড" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " গান" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 অ্যালবামস" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 দিন" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 দিন পুরানো" #: podcasts/gpoddersync.cpp:79 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 প্লে লিস্ট (%2)" #: playlist/playlistmanager.cpp:413 #, qt-format msgid "%1 selected of" msgstr "%1 সিলেক্ট অফ" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 গান" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 গান" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 গান পাওয়া গেছে" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 গান পাওয়া গেছে ( দৃশ্যমান %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 ট্রাকস" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 ট্রানসফারড" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1 উইমটে ডেভ মডউল" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n অসফল" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n সমাপ্ত" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "&কাস্টম" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "&অতিরিক্ত" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "&সহায়িকা" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "&গোপন %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "&গোপন" #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "বাঁদিকে (&ব)" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "কিছু &নয়" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "প্রস্থান করো" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "ডানদিকে (&ড)" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "& সামঞ্জস্য পূর্ণ প্রসারণ - উইন্ডো অনুপাতে" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "&সরঞ্জামসমূহ" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "আনুপূর্বিক তফাৎ" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "এবং অন্য সমস্ত এমরক সহযোগকারি গন" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "" #: core/utilities.cpp:108 msgid "1 day" msgstr "১ দিন" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "১টি ট্র্যাক" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128 কেবিপিস এম পি থ্রী" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 অনবরত সঙ্গীত" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "এখনই প্রিমিয়ামে আপগ্রেড করুন" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "একটি Grooveshark Anywhere একাউন্ট আবশ্যক।" #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "এক্ টি স্পটীফাই অ্যাকাউন্ট প্রয়োজন" #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:78 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:153 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "এক টি সঙ্গীত প্লে লিস্ট এ অন্তর্ভুক্ত হয় যদি কিনা মান গুলি ঠিক পুরন করে।" #: smartplaylists/searchterm.cpp:297 msgid "A-Z" msgstr "এ থেকে জেড পর্যন্ত" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "এ এ সি" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "" #: core/song.cpp:336 msgid "AIFF" msgstr "এআইএফএফ" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "%1-এর সম্বন্ধে" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "ক্লেমেন্টাইন সন্মন্ধে" #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "কিউ টি সন্মন্ধে" #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "অ্যাকাউন্ট সন্মন্ধে" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "পদক্ষেপ" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "কার্যকরী / অকার্যকরী অয়্যারমোট" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "সঙ্গীত যোগ করুন" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "যদি নোটিফিকেশান টাইপ সাপোর্ট করে তাবে এক্ টি নতুন লাইন যোগ করুন" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "পদক্ষেপ গ্রহন করুন" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "অন্য এক্ টি সঙ্গীত যোগ করুন" #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "ডাইরেকট রি যোগ করুন" #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "ফাইল যোগ করুন" #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "অনুবাদ এর জন্য ফাইল যোগ করুন" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "ফোল্ডার যোগ করুন" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "ফোল্ডার যুক্ত করুন..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "এক টি নতুন ফোল্ডার যোগ করুন" #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "খোঁজার বিষয় যোগ করুন" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "গান এর ট্যাগ গুলি যোগ করুন" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "গায়ক এর পরিচয় এর ট্যাগ লিপিবদ্ধ করুন" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "গায়ক এর পরিচয় লিপিবদ্ধ করুন" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "পরিচালক এর ট্যাগ যুক্ত করুন" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "সঙ্গীত এর ডিস্ক এর তথ্য লিপিবদ্ধ করুন" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "সঙ্গীত এর ধরন লিপিবদ্ধ করুন" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "সঙ্গীত এর সময় এর তথ্য লিপিবদ্ধ করুন" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "স্রুতসঙ্গীত এর সংখ্যা" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "অস্রুতসঙ্গীত এর সংখ্যা" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "সঙ্গীত টাইটল ট্যাগ যুক্ত করুন" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "সঙ্গীত এর ট্র্যাক ট্যাগ যুক্ত করুন" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "সঙ্গীত এর প্রকাশ কাল ট্যাগ যুক্ত করুন" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "সঙ্গীত এর ধারা যুক্ত করুন" #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "অন্য প্লে লিস্ট যুক্ত করুন" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "প্লে লিস্ট যোগ করুন" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "সঙ্গীত ধারাবাহিকতায় যুক্ত করুন" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "উইমোটেডেভ সংযুক্ত করুন" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "যোগ..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "এই মাসে প্রকাশিত" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "এই সপ্তাহে প্রকাশিত" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "এই বছর প্রকাশিত" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "আজ প্রকাশিত" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "বিগত তিন মাসে প্রকাশিত" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "অত্যাধুনিক সঞ্জুক্তিকরন" #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "কপি হওয়ার পর" #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "অ্যালবাম" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "অ্যালবাম (পরিচ্ছন্ন আওয়াজ সমস্ত সঙ্গীত এর জন্য)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "অ্যালবাম শিল্পী" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "জামেন্দ.কম এর অ্যালবাম তথ্য..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "অ্যালবাম কভার" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "কভারবিহীন অ্যালবাম" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "সব ফাইল (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "সমস্ত অ্যালবাম গুলি" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "সমস্ত শিল্পীগণ" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "সর্বধরনের ফাইল (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "সমস্ত প্লে লিস্ট (%1)" #: ui/about.cpp:74 msgid "All the translators" msgstr "সমস্ত অনুবাদকগন" #: library/library.cpp:84 msgid "All tracks" msgstr "সমস্ত ট্র্যাক গুলি" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "মধ্য/পার্শ্ববর্তী এনকোডিং অনুমোদন" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "আসল টি র সমান্তরাল ভাবে" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "স্থায়ী ভাবে মেন উইন্ডো সরিয়ে ফেলুন" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "স্থায়ী ভাবে মেন উইন্ডো বর্তমান রাখুন" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "স্থায়ী ভাবে সঙ্গীত চালু রাখুন" #: internet/spotifyblobdownloader.cpp:60 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "এক্ টি প্লাগ ইন প্রয়োজন। আপনি কি প্লাগ ইন টি ডাউনলোড করে ইন্সটল করতে ইচ্ছুক ?" #: devices/gpodloader.cpp:61 msgid "An error occurred loading the iTunes database" msgstr "iTune ডাটাবেস লোডইং ত্রুটি র জন্য দুঃখিত ।" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "ত্রুটি পূর্ণ মেটা ডাটা সংযুক্তি %1" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:78 msgid "And:" msgstr "এবং" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "উপস্থিতি" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "ফাইল / ইউ আর এল প্লে লিস্ট এ সংযুক্তি করন" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "প্লে লিস্ট এ সংযুক্তি করন" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "প্লে লিস্ট এ সংযুক্তি করন" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "কম্প্রেসন যুক্ত করুন ।" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "আপনি কি স্থায়ী ভাবে %1 প্রেসেট টি ডিলিট করতে চান ?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "আপনি কি গান গুলি র পরিসংখ্যান রিসেট করতে চান ?" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "শিল্পী" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "শিল্পী সম্পকিত তথ্য" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "শিল্পীর অদ্যাক্ষর" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "" #: ui/about.cpp:65 msgid "Authors" msgstr "গীতিকার" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "বিপিএম" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "" #: core/database.cpp:734 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "" #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "কিন্তু এই উৎসসমূহ নিষ্কিয় আছে:" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "" #: core/song.cpp:339 msgid "CDDA" msgstr "" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "" #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "" #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "" #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "" #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "ক্লেমেন্টাইন যেসব ওয়েবসাইট থেকে লিরিক খুঁজবে সেগুলো নির্বাচন করুন।" #: ui/equalizer.cpp:115 msgid "Classical" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "যখন গান পরিবর্তন হয় তখন ক্লেমেন্টাইন বার্তা দেখাতে পারে।" #: ../bin/src/ui_podcastsettingspage.h:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: internet/lastfmsettingspage.cpp:110 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 "" #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "" #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:116 msgid "Club" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "" #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "" #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "" #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "" #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "" #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "" #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "" #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "" #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:64 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: transcoder/transcoder.cpp:432 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "প্রচ্ছদ সংগঠক" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "" #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "" #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "" #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "" #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "" #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "" #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "" #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "" #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "গানের তথ্য পরিবর্তন" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "গানের তথ্য পরিবর্তন..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "গানের তথ্য পরিবর্তন..." #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "খোঁজার বিষয়বস্তু এখানে লিখুন" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:63 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "" #: core/song.cpp:328 msgid "Flac" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:43 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "তথ্য" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "" #: core/database.cpp:673 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "ভুল তথ্য দেয়া হয়েছে" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "উইন্ডো বন্ধ করা হলেও পেছনে চলতে থাকুক" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "" #: internet/lastfmservice.cpp:437 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:154 msgid "Last.fm password" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "দৈর্ঘ্য" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "" #: ui/equalizer.cpp:123 msgid "Live" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "" #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "" #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "" #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "" #: core/song.cpp:330 msgid "MPC" msgstr "" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "তাই হোক!" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "" #: library/library.cpp:74 msgid "Most played" msgstr "" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "সঙ্গীত" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "আমার সংগীত" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "" #: library/library.cpp:67 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:80 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "" #: core/utilities.cpp:147 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:366 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "" #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "" #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "" #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "" #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "" #: core/organise.cpp:65 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:124 msgid "Party" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "" #: widgets/osd.cpp:156 msgid "Paused" msgstr "" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "" #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "" #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "যদি বন্ধ থাকে তবে চালাও, যদি চালু থাকে তবে আটকাও" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "চালু কর যদি অন্য কিছু চালু না থাকে" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "পছন্দসমূহ" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "পছন্দসমূহ..." #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "সংস্করনের তথ্য ছাপুন" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "ক্রম সংগঠক" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "বৃষ্টি" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "আমার সংগীত থেকে মুছে ফেলুন" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" 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:206 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "" #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "" #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "শব্দ মাত্র পরিবর্তন করলে বার্তা দেখাও" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:460 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "" #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "" #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "কোন উৎসগুলো সক্রিয় এবং নিষ্ক্রিয় তা দেখাও" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "গানের তথ্য" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "গানের তথ্য" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 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 "" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "উৎস" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "উৎসসমূহ" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "" #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "" #: core/song.cpp:341 msgid "Stream" msgstr "" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "" #: ui/about.cpp:70 msgid "Thanks to" msgstr "" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "" #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:56 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:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:174 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:151 msgid "Third level" msgstr "" #: internet/jamendoservice.cpp:171 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "শিরনাম" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "" #: core/song.cpp:338 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "" #: devices/giolister.cpp:161 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "যখন ক্লেমেন্টাইন চালু হয়" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "যখন তালিকা খালি..." #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "" #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "" #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "" #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "" clementine-1.2.0+dfsg/src/translations/br.po000066400000000000000000004664101223327513400210440ustar00rootroot00000000000000# 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 # Belvar , 2013 # Belvar , 2011-2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-09-11 17:05+0000\n" "Last-Translator: Belvar \n" "Language-Team: Breton (http://www.transifex.com/projects/p/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:39 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\nTu zo deoc'h 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:246 msgid " days" msgstr " devez" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " kbde" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " me" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " pik" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " eilenn" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " ton" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 albom" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 devezh" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 devezh 'zo" #: podcasts/gpoddersync.cpp:79 #, 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:413 #, qt-format msgid "%1 selected of" msgstr "%1 diuzet eus" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 ton" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 ton" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 ton kavet" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 ton kavet (%2 diskouezet)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 ton" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 kaset" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1 : enlugellad wiimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, qt-format msgid "%L1 other listeners" msgstr "%L1 selaouer all" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "bet selaouet %L1 gwech" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n c'hwitet" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n echuet" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "&Personelaat" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "Ouzhpenn" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "&Sikour" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "K&uzhat %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "K&uzhat" #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Kleiz" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "Sonerezh" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Hini ebet" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "Roll Seniñ" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Kuitaat" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "Doare adlenn" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Dehou" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "Doare meskañ" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "&Astenn ar bannoù evit klotañ gant ar prenestr" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "&Ostilhoù" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(disheñvel a-dreuz kanaouennoù liesseurt)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "... Hag holl kenlabourerien Amarok" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "0px" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 devezh" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 ton" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "127.0.0.1" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "MP3 128k" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "40%" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 ton dre zegouezh" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "Hizivaat da Premium bremañ" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "Krouiñ ur c'hont nevez pe adsevel ur ger-tremen" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "Ur c'hont Grooveshark a zo dleet" #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "Ret eo deoc'h kaout ur kont Spotify Premium." #: ../bin/src/ui_networkremotesettingspage.h:189 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:78 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:153 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:297 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "ALL GLORY TO THE HYPNOTOAD" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "Dilezel" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "A-zivout %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "A-zivout Clementine..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "A-zivout Qt..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Titouroù ar gont" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "Titouroù ar gont (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Oberiadenn" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Gweredekaat/Diweredekaat Wiiremote" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "Ouzhpennañ ar podkast" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Ouzhpennañ ul lanv" #: ../bin/src/ui_notificationssettingspage.h:425 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:193 msgid "Add action" msgstr "Ouzhpennañ un oberiadenn" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Ouzhpennañ ul lanv all..." #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Ouzhpennañ un teuliad..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "Ouzhpennañ ur restr" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "Ouzhpennañ ur restr d'an treuzkemmer" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "Ouzhpennañ ur restr pe muioc'h d'an treuzkemmer" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Ouzhpennañ ur restr..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Ouzhpennañ restroù da" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Ouzhpennañ un teuliad" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Ouzhpennañ un teuliad..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Ouzhpennañ un teuliad nevez..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "Ouzhpennañ ar podkast" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "Ouzhpennañ ur podkast..." #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Ouzhpennañ ur ger klask" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "Ouzhpennañ klav albom an ton" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "Ouzhpennañ klav arzour albom an ton" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "Ouzhpennañ klav arzour an ton" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "Ouzhpennañ poentoù emgefreek an ton" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "Ouzhpennañ klav sonaozour an ton" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "Ouzhpennañ klav pladenn an ton" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "Ouzhpennañ anv restr an ton" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "Ouzhpennañ klav doare an ton" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "Ouzhpennañ klav rummad ar sonerezh" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "Ouzhpennañ klav padelezh an ton" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "Ouzhpennañ klav soner an ton" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "Ouzhpennañ an niver a wech ma'z eo bet lennet an ton" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "Ouzhpennañ notenn an ton" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "Ouzhpennañ an niver a wech ma 'z eo bet lammet an ton" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "Ouzhpennañ klav titl an ton" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "Ouzhpennañ klav niverenn an ton" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "Ouzhpennañ klav bloavezh an ton" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Ouzhpennan ul lanv..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "Ouzhpennañ da tonioù karetañ Grooveshark" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "Ouzhpennañ da rolloù seniñ Grooveshark" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "Ouzhpennañ d'ur roll seniñ all" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Ouzhpennañ d'ar roll seniñ" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "Ouzhpennañ d'al listenn c'hortoz" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Ouzhpennañ oberadennoù wiimotedev" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Ouzhpennañ..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Ouzhpennet ar miz-mañ" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Ouehpennet ar sizhun-mañ" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Ouzhpennet ar bloaz-mañ" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Ouzhpennet hiziv" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Ouzhpennet e-kerzh an tri miz diwezhañ" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "Oc'h ouzhpennañ an ton d'an doser sonerezh." #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "Oc'h ouzhpennañ an ton d'ar re karetañ" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Strolladur kemplez..." #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "Goude " #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "Goude an eiladur..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Albom" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Albom (Ampled peurvat evit an holl roud)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Arzour an albom" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "Golo Albom" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Titouroù an albom war jamendo.com..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Albomoù gant ur golo" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Albomoù hep golo" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Holl restroù (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "All Glory to the Hypnotoad!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "An holl albomoù" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "An holl arzourien" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "Holl restroù (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Holl rolloù seniñ (%1)" #: ui/about.cpp:74 msgid "All the translators" msgstr "An holl troerien" #: library/library.cpp:84 msgid "All tracks" msgstr "An holl roudoù" #: ../bin/src/ui_networkremotesettingspage.h:194 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:196 msgid "Allow downloads" msgstr "Aotren ar pellgargadurioù" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "Aotren an enkodiñ mid/side" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "E-kichen ar reoù orin" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Atav kuzhat ar prenestr pennañ" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Atav diskouez ar prenestr pennañ" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "Atav kregin da lenn" #: internet/spotifyblobdownloader.cpp:60 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:61 msgid "An error occurred loading the iTunes database" msgstr "Ur gudenn a zo savet en ur c'hargañ stlennvon iTunes" #: ui/edittagdialog.cpp:663 #, 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/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "Ur gudenn dianav a zo bet." #: ui/about.cpp:78 msgid "And:" msgstr "Ha(g) :" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "Fuloret" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Neuz" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Ouzhpennañ restroù pe liammoù internet d'ar roll seniñ" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "Ouzhpennañ d'ar roll seniñ lennet" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "Ouzhpennañ d'ar roll seniñ" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "Koazhañ a-benn mirout ouzh an troc'hadennoù" #: ui/equalizer.cpp:197 #, 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 »" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "Ha sur oc'h ho peus c'hoant diverkañ ar roll seniñ ?" #: ui/edittagdialog.cpp:769 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:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Arzour" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Titouroù war an arzour" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "Skingomz dre arzour" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "Klavioù an arzour" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "Lizherennoù-tal an arzour" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Mentrezh Aodio" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Dilesadur sac'het" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "Aozer" #: ui/about.cpp:65 msgid "Authors" msgstr "Aozerien" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Emgefreek" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Hzivadurioù ent emgefreek" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "Digeriñ ent emgefreek ar rummadoù o-unan e gwez ar sonaoueg" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "Hegerz" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "Fonnder keidennek" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "Ment keidennek ar skeudenn" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "Podkastoù BBC" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "Lanvioù drekleur" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Liv an drekleur" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "Skeudenn drekleur" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Divoullder drekleur" #: core/database.cpp:734 msgid "Backing up database" msgstr "Enrolladenn ar stlennvon" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "Kempouez ar son" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Skarzhañ" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "Spektrogram dre varennoù" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Glas boutin" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "Stumm audio boaz" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Emzalc'h" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "Gwell" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "Buhezskrid %1" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Fonnder" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "Bitrate" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "Spektogram dre vloc'hoù" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "Doare bloc'hoù" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "Kementad a ruzed" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "Korf" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "Spektogram boom" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Furchal..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "Padelezh ar stoker" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "O lakaat er memor skurzer" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "Ar mamennoù-se a zo diweredekaet :" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Boutonoù" #: core/song.cpp:339 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "Kemer e kont ar CUE sheet" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "Nullañ" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Kemmañ golo an albom" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Kemmañ ment ar font..." #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "Cheñch an doare adlenn" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Kemmañ ar berradenn" #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "Cheñch an doare meskañ" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Kemmañ ar yezh" #: ../bin/src/ui_playbacksettingspage.h:330 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:228 msgid "Check for new episodes" msgstr "Klask pennadoù nevez" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Klask hizivadurioù..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "Choazit un anv evit ho roll seniñ spredek" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Choaz ent emgefreek" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Choaz ul liv..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "Choaz ur font..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Choaz el listenn" #: smartplaylists/querywizardplugin.cpp:155 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." #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "Choaz an teuliad pellgargañ podkastoù" #: ../bin/src/ui_songinfosettingspage.h:188 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:115 msgid "Classical" msgstr "Klasel" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "O naetaat" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Goullonderiñ" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Skarzhañ ar roll seniñ" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Kudenn gant Clementine" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Oranjez Clementine" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Skrammañ Clementine" #: ../bin/src/ui_deviceproperties.h:376 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_boxsettingspage.h:104 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:104 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:104 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_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "Clementine a zo gouest da seniñ sonerezh bet karget war Ubuntu One" #: ../bin/src/ui_notificationssettingspage.h:431 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:250 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:128 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." #: internet/lastfmsettingspage.cpp:110 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 "Clementine ne zeu ket a-benn da kavout stad ho koumanant dre ma vez kudennoù gant ho kennask. An tonioù sonet a vo lakaet er grubuilh ha kaset e vint diwezhatoc'h da Last.fm." #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Gweler skeudennoù Clementine" #: ../bin/src/ui_trackselectiondialog.h:206 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:210 msgid "Clementine will find music in:" msgstr "Clementine a gavo ar sonerezh e :" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Klikit aze evit krouiñ ho levraoueg sonerezh" #: playlist/playlisttabbar.cpp:293 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:72 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_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "Serriñ ar roll seniñ" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "Serriñ an hewelaat" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "Serrin ar prenestr-mañ a paouezo ar pellgargadenn" #: ui/albumcovermanager.cpp:216 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:116 msgid "Club" msgstr "Klub" #: ../bin/src/ui_appearancesettingspage.h:272 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:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Evezhiadenn" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "Leuniañ ar c'hlavioù ent emgefreek" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "Leuniañ ar c'hlavioù ent emgefreek..." #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Aozer" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "Kefluniañ %1..." #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "Kefluniañ Grooveshark" #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Kefluniañ Last.fm..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "KefluniañMagnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Kefluniañ ar Berradennoù" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "Kefluniañ Spotify" #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "Kefluniañ Subsonic..." #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "Kefluniañ an enklsak hollek..." #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "Kefluniañ ar sonaoueg..." #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "Kefluniañ ar podkastoù" #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "Kefluniañ..." #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "Kennaskañ Wii Remote en ur implij an oberenn gweredekaat/diweredekaat" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "An drobarzhell a zo o kennaskañ" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "O kennaskañ da Spotify" #: internet/subsonicsettingspage.cpp:107 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/subsonicsettingspage.cpp:117 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/" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "Letrin" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "CBR" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "Treuzkemm an holl sonerezh" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "Treuzkemm ar sonerezh ne c'hell ket an drobarzhell lenn" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "Kopiañ d'ar golver" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Kopiañ war an drobarzhell" #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Eilañ er sonaoueg..." #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "Gwirioù arzour" #: internet/subsonicsettingspage.cpp:81 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:64 #, 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" #: transcoder/transcoder.cpp:432 #, 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:426 #, 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/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "Dibosupl kargañ ar skingomz last.fm" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "Dibosubl eo digeriñ ar restr ec'hankañ %1" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Merour ar godeligoù" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "Golo diwar ur skeudenn enframmet" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Golo karget ent emgefreek adalek %1" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "Golo diweredekaet gant an dorn" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "Golo nann diuzet" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "Golo diuzet adalek %1" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "Goloioù adalek %1" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "Krouiñ ur roll seniñ Grooveshak nevez" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "Lakaat un treveuz pa vez kemmet ar roud ent emgefreek" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "Lakaat un treveuz pa vez kemmet ar roudoù gant an dorn" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "Personalaat" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "Skeudenn personelaet :" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "Kemennadenn gwellvezioù personelaet" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "Skingomz personelaet" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Personelaat..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "Hent DBus" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Dañs" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Deizad krouadur" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Deizad kemmadur" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "Deizioù" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "Dre &ziouer" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "Digreskiñ an ampled eus 4%" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "Digreskiñ an ampled eus dre gant." #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Digreskiñ an ampled" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "Skeudenn drekleur dre ziouer" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "Dre ziouer" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "Amzer etre ar heweladurioù" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "Diverkañ" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "Diverkañ ur roll seniñ Grooveshark" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "Diverkañ ar roadennoù pellgarget" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Diverkañ restroù" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Diverkañ eus an drobarzhell" #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Diverkañ eus ar bladenn" #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "Diverkañ ar pennadoù lennet" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "Diverkañ ar ragarventennoù" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "Diverkañ ar roll seniñ speredek" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "Diverkañ ar restroù orin" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "O tiverkañ restroù" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "Dilemel ar roudoù diuzet diwar al listenn c'hortoz" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "Dilemel ar roud-mañ diwar al listenn c'hortoz" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Pal" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Munudoù..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Trobarzhell" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Perzhioù an drobarzhell" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Anv an drobarzhell" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Oerzhioù an drobarzhell..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Trobarzhelloù" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "C'hoant ho poa lavar" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "Ger-tremen Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "Anv implijer Digitally Imported" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "Kennaskañ eeun da Internet" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Teuliad" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "Diweredekaat ar padelezh" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "Diweredekaat ar varenn-imor" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Diwederakaet" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Pladenn" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "Treuzkas digendalc'hus" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 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:715 msgid "Do a full library rescan" msgstr "Ober un adc'hwilervadur eus ar sonaoueg a-bezh" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "Chom hep treuzkemm ar sonerezh" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "Chom hep skrivañ war-c'horre" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Chom hep adlenn" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "Chom hep diskouez el lodenn \"arzourien liesseurt\"" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "Chom hep meskañ" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "Chom hep paouez!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "Reiñ arc'hant" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Daouglikañ evit digeriñ" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "Daouglikañ war un ton..." #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "Pellgargañ %n pennad" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "Teuliad pellgargañ" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "Pellgargañ ar pennadoù davet " #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "Kevreañ d'ar pellgargadenn" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "Pellgargañ pennadoù nevez ent emgefreek" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "Pellgargadur e steuad" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "Pellgargan ar poellad Android" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Pellgargañ an albom" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Pellgargañ an albom..." #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "Pellgargañ ar pennad-mañ" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "Pellgargañ" #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "O pellgargañ (%1%)..." #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "O pellgargañ katalog Icecast" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "O pellgargañ katalog Jamendo" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "O pellgargañ katalog Magnatune" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "O pellgargañ enlugellad Spotify..." #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "O pellgargañ metadaveennoù" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "Lakait da riklan avit adlakaat" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "Dropbox" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "Ar stumm dinamikel a zo aktivet" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "Meskaj dargouezhek dialuskel" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "Kemmañ ar roll seniñ speredek..." #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Cheñch ar c'hlav \"%1\"..." #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "Cheñch ar c'hlav..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "Cheñch ar c'hlavioù" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Cheñch deskrivadur ar roud" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "Cheñch deskrivadur ar roud..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Cheñch deskrivadur ar roudoù..." #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Embann..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "Aktivañ Wii Remote" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "Aktivañ ar c'hevataler" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "Aotren ar beradennoù pa vez enaouet prenestr Clementine nemetken" #: ../bin/src/ui_globalsearchsettingspage.h:147 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:62 msgid "Enable/disable Last.fm scrobbling" msgstr "(Di)gweredekaat scrobbling Last.fm" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "Kemplezh enkodiñ" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "Perzhded al lusker enkodiñ" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "Doare enkodiñ" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "Lakait un URL" #: ../bin/src/ui_coverfromurldialog.h:103 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:205 msgid "Enter a filename for exported covers (no extension):" msgstr "Lakait anv ur restr evit ar goloioù ezporzhiet (askouezhadenn ebet) :" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "Lakait un anv evit ar roll seniñ" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Lakait anv un arzour pe n'eus forzh peseurt klav evit selaou ouzh skingomz Last.fm" #: ../bin/src/ui_globalsearchview.h:209 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:77 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:77 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:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "Lakait amañ gerioù ho enklask" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "Lakait chomlec'h red ur skingomz internet" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "Skrivit anv an teuliad" #: ../bin/src/ui_networkremotesettingspage.h:198 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:87 msgid "Entire collection" msgstr "Dastumadeg hollek" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Fazi" #: 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:55 msgid "Error copying songs" msgstr "Ur gudenn a zo savet e-kerzh kopiadur an tonioù" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "Ur gudenn a zo savet e-kerzh dilamidigezh an tonioù" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "Ur gudenn a zo savet o pellgargañ enlugellad Spotify" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "Ur gudenn a zo savet e-pad kargadur %1" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Kudenn o kargañ roll seniñ di.fm" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "Ur gudenn a zo savet e-pad treterezh %1 : %2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "Kudenn e-pad kargadenn ar CD audio" #: library/library.cpp:63 msgid "Ever played" msgstr "Bet lennet dija" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "Bep 10 munutenn" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "Bep 12 eurvezh" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "Bep 2 eurvezh" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "Bep 20 munutenn" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "Bep 30 munutenn" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "Bep 6 eurvezh" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "Bep eurvezh" #: ../bin/src/ui_playbacksettingspage.h:303 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:208 msgid "Existing covers" msgstr "Goloioù a zo aze" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "Brasaat" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "Ne vo ket mat ken d'an %1" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "Ezporzhiañ ar goloioù" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "Ezporzhiañ ar goloioù" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "Ezporzhiañ ar goloioù pellgarget" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "Ezporzhiañ ar goloioù enlakaet" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "Ezporzhiadur echuet" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "Ezporzhiet %1 golo war %2 (%3 tremenet)" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 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:300 msgid "Fade out when stopping a track" msgstr "Echuiñ gant un treveuz pa vez paouezet ur roud" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "Arveuz" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "Padelezh an arveuz" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "C'hwited eo bet adtapadenn an teuliad" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "C'hwitet eo bet gant tapadenn ar podkastoù" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "C'hwitet e bet gant kargadenn ar podkastoù" #: podcasts/podcasturlloader.cpp:167 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:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "Trumm" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "Ma re garetañ" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "Roudoù karetañ" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "Tapout ar goloioù a vank" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "Kerc'hat ent emgefreek" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "Pellgargadur echu" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "O tapout sonaoueg Subsonic" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Ur gudenn a zo savet e-pad pellgargadur ar golo" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "Askouzehadenn ar restr" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "Mentrezhoù restroù" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Anv ar restr" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "Anv ar restr (hep an hent)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Ment ar restr" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Stumm ar restr" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Anv ar restr" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Restroù" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "Restroù da treuzkemmañ" #: smartplaylists/querywizardplugin.cpp:90 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." #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "O genel ar roud audio" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "Echuiñ" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "Live kentañ" #: core/song.cpp:328 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Ment an nodrezh" #: ../bin/src/ui_spotifysettingspage.h:213 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:204 msgid "Force mono encoding" msgstr "Forsiñ an enkodiñ mono" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "Disonjal an drobarzhell" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Form" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "Mentrezh" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Skeudennoù dre eilenn" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "Skeudennoù dre buffer" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Mignoned" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "Skornet" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Full Bass" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "Fumm Bass + Treble" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "Full Treble" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "Lusker son GStreamer" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "Hollek" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Kefluniadur hollek" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Doare" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "Kaout un URL evit rannañ ar roll seniñ Grooveshark" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "Kaout un URL evit rannañ an ton Grooveshark" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "O taspugnat tonioù brudet Grooveshark" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "O taspugn ar c'hanolioù" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "O tegemer al lanvioù" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "Reiñ un anv:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "Go" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "Mont d'ar roll seniñ o tont" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "Mont d'ar roll seniñ a-raok" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, 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:206 msgid "Grey out non existent songs in my playlists" msgstr "Grisaat an tonioù n'int ket mui em roll seniñ" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "Kudenn kennaskañ gant Grooveshark" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "URL ar roll seniñ Grooveshark" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "Skingomz Grooveshark" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "URL ar ganaouenn Grooveshark" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "Strollañ al sonaoueg dre..." #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "Strollad dre" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "Strollañ dre Albom" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "Strollañ dre Arzour" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "Strollañ dre Arzour/Albom" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "Strollañ dre Arzour/Bloaz - Albom" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "Strollañ dre Zoare/Albom" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "Strollañ dre Zoare/Arzour/Albom" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "Strolladenn" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "Ar pajenn HTML a oa hep lanv RSS ebet." #: internet/subsonicsettingspage.cpp:135 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:163 msgid "HTTP proxy" msgstr "Proksi HTTP" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "Laouen" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "Titouroù war an dafar" #: ../bin/src/ui_deviceproperties.h:372 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:202 msgid "High" msgstr "Uhel" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "Uhel (%1 fps)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "Uhel (1024x1024)" #: internet/subsonicsettingspage.cpp:112 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:310 msgid "Hours" msgstr "Eurioù" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "N'am eus kont Magnatune ebet" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Arlun" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "Arlunioù en uhelañ" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "Anaoudadur an ton" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 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:77 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:204 msgid "Ignore \"The\" in artist names" msgstr "Ober hep ma vefe \"The\" e anvioù an arzourien" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Skeudennoù (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "A-benn %1 deizh" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "A-benn %1 sizhun" #: ../bin/src/ui_wizardfinishpage.h:86 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/spotifyservice.cpp:360 msgid "Inbox" msgstr "Boest degemer" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "Diskouez an albom er gemenadenn" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "Ouzhpennañ an holl tonioù" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Handelv protokol REST Subsonic digenglotus. Hizivait an arval." #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Handelv protokol REST Subsonic digenglotus. Ret eo d'ar servijer hizivaat." #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Kefluniadur diglok, bezit sur eo leuniet an holl maeziennoù." #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "Kreskiñ an ampled eus 4%" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "Kreskiñ an ampled eus dre gant" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Kreskiñ an ampled" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "Menegeradur %1" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "Titouroù" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "Enlakaat..." #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Staliaet" #: core/database.cpp:673 msgid "Integrity check" msgstr "O gwiriañ an anterinder" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "Pourchaserien internet" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "Alc'hwez API didalvoudek" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Mentrezh didalvoudek" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "Hentenn didalvoudek" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "Arventennoù didalvoudek" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "Loazioù erspizet didalvoudek" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "Servij didalvoudek" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "Kudenn gant alc'hwez an dalc'h" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "Kudenn gant an anv implijer pe ar ger-tremen" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "Roudoù Jamendo Selaouet an aliesañ" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "Top roudoù Jamendo" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "Top ar miz roudoù Jamendo" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "Top ar sizhun roudoù Jamendo" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "Stlennvon Jamendo" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "Mont d'ar roud lennet bremañ" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Pouezhit war ar bouton e-pad %1 eilenn..." #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Pouezhit war ar boutoñn e-pad %1 eilenn..." #: ../bin/src/ui_behavioursettingspage.h:193 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:193 msgid "Keep the original files" msgstr "Dec'hel ar restroù orin" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "Bisig" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Yezh" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "Hezoug/Selaouegoù" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Sal bras" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "Golo albom tev" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "Barenn gostez ledan" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "Selaouet e ziwezhañ" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "Skingomz last.fm personelaet :%1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Sonaoueg Last.fm- %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "Skingomz Last.fm- %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Skingomz amezeg Last.fm- %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Savlec'h skingomz Last.fm- %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Arzourien Last.fm dammheñvel da %1" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Klav evit ar skingomz Last.fm: %1" #: internet/lastfmservice.cpp:437 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:154 msgid "Last.fm password" msgstr "Ger-tremen Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "Niver a selaouadennoù Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Klavioù Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Anv implijer Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Wiki last.fm" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "Roudoù an nebeutañ plijet" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "Laoskit goullo evit an arventennoù dre ziouer" #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "Kleiz" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Padelezh" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Sonaoueg" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "Strolladur ar sonaoueg kemplesoc'h" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "Kemenn hizivadur ar sonaoueg" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "Enklask ar sonaoueg" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Bevennoù" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "Selaou ouzh tonioù Grooveshark diazezet war ar pezh ho peus selaouet a-raok." #: ui/equalizer.cpp:123 msgid "Live" msgstr "End-eeun" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Kargañ" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "Kargañ ar golo adalek un url" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "Kargañ ar golo adalek un url..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "Kargañ ur golo adalek ar bladenn" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "Kargañ ar golo adalek ur bladenn..." #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "Kargañ ar roll seniñ" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "Kargañ ar roll seniñ..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "O kargañ skingomz Last.fm" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "O kargañ an drobarzhell MTP" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "O kargañ stlennvon iPod" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "Kargañ ar roll seniñ speredek" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "O kargañ tonioù" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "O kargañ al lanv" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "O kargan roudoù" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "O kargañ titouroù ar roud" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "O kargañ..." #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "Kargañ restroù pe liammoù internet, hag eilec'hiañ ar roll seniñ" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Kennaskañ" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "C'hwitet eo bet ar c'hennaskañ" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "Aelad Diougan Padus (ADP)" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "Karout" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Izel (%1 fps)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "Izel (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "Aelad e Luzierezh Gwan (ALG)" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "Komzoù" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "Komzoù eus %1" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Pellgargañ Magnatune" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Pellgargadenn Magnatune echuet" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "Aelad pennañ (MAIN)" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "Ober evel-se !" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "Lakaat ar roll seniñ da vezañ lennus ezlinenn" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "Respont furmed fall" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "Kefluniadur dornel ar proksi" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "Gant an dorn" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "Aozer" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "Merkañ evel selaouet" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "Merkañ evel nevez" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "Implij an holl gerioù enklsask (HA)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "Implij unan pe meur a gerioù enklask (PE)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "Fonnder uhelañ" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "Etre (%1 fps)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "Etre (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "Doare emezeladur" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "Fonnder izelañ" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "Ragarventennoù projectM a vank" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "Patrom" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "Evezhiañ cheñchamantoù ar sonaoueg" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "Lenn e mono" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "Mizioù" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "Imor" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "Doare ar varenn imor" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "Barenn imor" #: library/library.cpp:74 msgid "Most played" msgstr "Lennet an aliesañ" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "Poent staliañ" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "Poentoù staliañ" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "Dindan" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "Dilec'hiañ davit ar sonaoueg..." #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "A-us" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "Sonerezh" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Sonaoueg" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "Mut" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "Ma sonaoueg Last.fm" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "Ma skingomz miks Last.fm" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "Ma amezeien Last.fm" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "Ma skingomz erbedadennoù Last.fm" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "Ma skingomz miks" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "Ma Sonerezh" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "Ma amezeien" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "Ma savlec'h skingomz" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "Ma erbedadennoù" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Anv" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "Dibarzhioù anv" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "Bandenn strizh (NB)" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "Amezeien" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "Rouedad" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "Proksi rouedad" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "Rouedad pell" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "Morse" #: library/library.cpp:67 msgid "Never played" msgstr "Morse sonet" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "Morse kregiñ da lenn" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "Teuliad nevez" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "Roll seniñ nevez" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "Roll seniñ speredek nevez..." #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "Tonioù nevez" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "Ar roudoù nevez a vo ouzhpennet ent emgefreek." #: library/library.cpp:80 msgid "Newest tracks" msgstr "Roudoù nevesañ" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "Da-heul" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Roud o tont" #: core/utilities.cpp:147 msgid "Next week" msgstr "Ar sizhun a-zeu" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "Dezrannerez ebet" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "Skeudenn drekleur ebet" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "Golo ebet da ezporzhiañ" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "Bloc'h hir ebet" #: playlist/playlistcontainer.cpp:366 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:145 msgid "No short blocks" msgstr "Bloc'h berr ebet" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "Hini ebet" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 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:155 msgid "Normal" msgstr "Reizh" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "Rizh bloc'h skoueriek" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "N'eus ket tu implij pa vez implijet ur roll seniñ dinamek" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "Digennasket" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "N'eus ket trawalc'h a endalc'h" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "N'eus ket trawalc'h a fans" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "N'eus ket izili a-walc'h" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "N'eus ket trawalc'h a amezeizen" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "N'eo ket staliet" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "N'eo ket kennasket" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "N'est ket savet - daouglikañ evit sevel" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "Doare kemenn" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Kemenadennoù" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "O seniñ" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "Rakwel an OSD" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "Demerez" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "Digeriñ %1 er merdeer" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "Lenn ur CD &audio" #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "Digeriñ ur restr OPML" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "Digeriñ ur restr OPML..." #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "Digeriñ an drobarzhell" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "Digeriñ ur restr..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "Digeriñ e-barzh Google Drive" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "Digerin en ur roll seniñ nevez" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Digeriñ..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "Oberiadenn c'hwitet" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "Gwelladenn ar fonnder" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "Gwelladenn ar perzhded" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "Dibarzhioù..." #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "Aozañ ar restroù" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "Aozañ ar restroù..." #: core/organise.cpp:65 msgid "Organising files" msgstr "Oc'h aozañ ar restroù" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "Klavioù orin" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Dibarzhioù all" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "Ezkas" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "Trobarzhell ezkas" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "Dibarzhioù ezkas" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "Enlugellad ezkas" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "Skrivañ war pep tra" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "Flastrañ ar restroù a vez diouto dija" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "Skrivañ war ar re bihanoc'h nemetken" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "Perc'henn" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "O tielfennañ katalog Jamendo" #: ui/equalizer.cpp:124 msgid "Party" msgstr "Fest" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "Ger-tremen" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Ehan" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "Ehan al lenn" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Ehanet" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "Soner" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "Piksel" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "Bareen gostez simpl" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Lenn" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "Seniñ an Arzour pe ar c'hlav" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "Seniñ skingomz an arzour..." #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "Konter selaouadennoù" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "Lenn ur skingomz personelaet" #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "Lenn pe ehan, hervez ar stad" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "Lenn ma vez netra all o vezañ lennet" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "Lenn ar skingomz gant ar c'hlav" #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "Seniñ an vet roud eus ar roll seniñ" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "Lenn/Ehan" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Lenn sonerezh" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Dibarzhioù al lenner" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "Roll seniñ" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "Roll seniñ echuet" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "Dibarzhioù ar roll seniñ" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "Doare ar roll seniñ" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "Rolloù seniñ" #: ../data/oauthsuccess.html:36 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:214 msgid "Plugin status:" msgstr "Stad an enlugellad" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "Podkastoù" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Pop" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "Tonioù brudet" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "Tonioù brudet ar miz-mañ" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "Tonioù brudet hiziv" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "Padelezh ar popup" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "Porzh" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "Rak-ampled" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "Gwellvezioù" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "Gwellvezioù..." #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "Anv ar goloioù karetañ (dispartiet gant virgulennoù)" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "Mentrezh audio karetañ" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "Bitrate karetañ " #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "Mentrezh karetañ" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "Rizh audio premium" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "Ragarventenn :" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "Pouezhit war ur c'henaozadur touchennoù evit implij " #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "Pouezit war un douchenn" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Pouezit war ur kombinadenn touchennoù evit implij %1" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "Dibarzhioù an OSD brav" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "Rakwel" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "A-raok" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 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:131 msgid "Profile" msgstr "Aelad" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "Enraog" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 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:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "Perzhded" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "Goulennadeg trobarzhell" #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "Merour listenn c'hortoz" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "Lakaat ar roudoù da heul" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "Lakaat ar roud da heul" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "Skingomz (Ampled kevatal evit an holl roudoù)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "Skingomzoù" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "Glav" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "Heweladur dargouezhek" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "Lakaat 0 steredenn evit an ton lennet" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "Lakaat 1 steredenn evit an ton lennet" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "Lakaat 2 steredenn evit an ton lennet" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "Lakaat 3 steredenn evit an ton lennet" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "Lakaat 4 steredenn evit an ton lennet" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "Lakaat 5 steredenn evit an ton lennet" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "Notenn" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "Sur oc'h da gaout c'hoant da nullañ" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "Aet e biou ar vevenn adkas, gwiriekait kefluniadur ar servijer." #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "Azbevaat" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "Hizivaat ar c'hatalog" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "Hizivaat ar c'hanolioù" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "Hizivat listenn ar mignoned" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "Hizivat listenn ar savlec'hioù" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "Hizivaat al lanvioù" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Reggae" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "Kaout soñj eus fiñv ar Wii remote" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "Kaout soñj eus ar wech diwezhañ" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Tennañ" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "Tennañ an oberiadenn" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "Tennañ an tonioù doubl eus ar roll seniñ" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "Tennañ an teuliad" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "Tennañ eus va sonerezh" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "Tennañ eus an tonioù karetañ" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "Tennañ kuit eus ar roll seniñ" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "Tennañ ar roll seniñ" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "Tennañ ar rolloù seniñ" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "Diverkañ tonioù eus va sonerezh" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "Diverkañ tonioù eus va karetañ" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "Cheñch anv \"%1\" ar roll seniñ." #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "Cheñch anv roll seniñ Grooveshark" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "Adenvel ar roll seniñ" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "Adenvel ar roll seniñ..." #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "Adniverenniñ ar roudoù en urzh-mañ..." #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Adlenn" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "Adlenn an albom" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "Adlenn ar roll seniñ" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "Adlenn an ton" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Eillec'hiañ ar roll seniñ lennet" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "Eillec'hiañ ar roll seniñ" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "Eillec'hiañ esaoù gant is-linennoù" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "Replay Gain" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "Doare Replay Gain" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "Adpoblañ" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "Ezhomm 'zo eus ur c'hod kennaskañ" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "Adderaouiñ" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" msgstr "Adderaouiñ ar konter lennadennoù" #: 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:206 msgid "Restrict to ASCII characters" msgstr "Bevenniñ ouzh an arouezennoù ASCII" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "Kenderc'hel da seniñ pa grog ar poellad" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "Oc'h adkavout tonioù \"My Music\" Grooveshark." #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "O taspugnat ho tonioù Grooveshark karetañ" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "O taspugnat rolloù seniñ Grooveshark" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "Distreiñ war Clementine" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "Dehou" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "Seveniñ" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "SOCKS proksi" #: internet/subsonicsettingspage.cpp:122 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:202 msgid "Safely remove device" msgstr "Tennañ an drobarzhell diarvar" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "Tennañ an drobarzhell diarvar goude an eilañ" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "Standilhonañ" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "Standilhonañ" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "Enrollit ho restroù .mood en ho sonaoueg" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "Enrollañ golo an albom" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "Enrollan ar golo war ar bladenn..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "Enrollañ ar skeudenn" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "Enrollañ ar roll seniñ" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "Enrollañ ar roll seniñ..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "Enrollañ ar ragarventennoù" #: ../bin/src/ui_librarysettingspage.h:193 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:197 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:115 msgid "Save this stream in the Internet tab" msgstr "Enrollañ al lanv-mañ en ivinell internet" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "O enrollañ stadegoù an tonioù e restr an tonioù" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "Enrolladur an tonioù" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "Aelad ar feur standilhonañ (SSR)" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "Cheñch ar ment" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "Poentoù" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "Scrobble ar roudoù selaouet ganin" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "Klask" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "Klask war savlec'hioù Icecast" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "Klask Jamendo" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Klask Magnatune" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "Klask Subsonic" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "Klask goloioù albom..." #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "Klask pep tra" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "Klask war gpodder.net" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "Klask war iTunes" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "Doare klask" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "Dibarzhioù klask" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "Disoc'hoù an enklask" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "Gerioù enklask" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "O klask war Grooveshark" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "EIl live" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "Mont war gil" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "Mont war-raok" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "Klask ar roud lennet gant ur sammad relativel" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "Klask ar roud lennet gant ul lec'hiadur absolud" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "Diuzañ an holl" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "Diuzañ hini ebet" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "Diuzañ liv an drekleur" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "Choaz ar skeudenn drekleur" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "Diuzañ an disoc'h gwellañ" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "Diuzañ liv ar c'hentañ renk" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "Diuzañ heweladurioù" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "Diuzañ heweladurioù..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "Niver heuliad" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "URL ar servijer" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "Munudoù ar servijer" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "Servij ezlinenn" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Termeniñ %1 d'an talvoud %2..." #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "Termeniñ an ampled da dre gant" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "Lakaat un talvoud evit an holll roudoù diuzet" #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "Gwellvezioù" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Berradenn" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "Berradenn evit %1" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Berradenn evit %1 a zo dija anezhañ" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Diskouez" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "Diskouez OSD" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "Lugerniñ ar roud o vezañ lennet" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "Diskouez ar varenn imor el lenner" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "Implij reizhad kemenadenn ar burev" #: ../bin/src/ui_notificationssettingspage.h:442 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:441 msgid "Show a notification when I change the volume" msgstr "Diskouez ur gemennadenn pa cheñchan an ampled" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "Diskouez ur popup e-kichen ar zonenn kemenadennoù" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "Diskouez un OSD brav" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "Diskouez a-us d'ar varenn stad" #: ui/mainwindow.cpp:460 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:209 msgid "Show cover art in library" msgstr "Diskouez ar golo er sonaoueg" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "Diskouez an dispartierien" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "Diskouez er ment gwirion..." #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "Diskouez er merdeer retroù" #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "Diskouez e \"Arzourien Liesseurt\"" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "Diskouez ar varenn imor" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "Diskouez an doublennoù nemetken" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "Diskouez an tonioù hep klav nemetken" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "Diskouez alioù enklask." #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "Diskouez ar boutonoù \"karout\" ha \"skarzhañ\"" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "Diskouez ar bouton scrobbling er prenestr pennañ" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "Diskouez an ikon er zonenn kemenadennoù" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "Diskouez peseurt mamenn a zo gweredekaet ha pe re a zo diweredekaet." #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "DIskouez/Kuzhañ" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Meskañ" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "Meskañ an albomoù" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "Meskañ an holl" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "Meskañ ar roll seniñ" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "Meskañ an tonioù war an albom-mañ" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "Kennaskañ" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "Digennaskañ" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "O kennaskañ..." #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "Arzourien dammheñvel" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "Ment" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "Ment:" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "Mont a-drek er roll seniñ" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "Konter tonioù lammet" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "Mont dirak er roll seniñ" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "Golo album bihan" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "Barenn gostez bihan" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "Roll seniñ speredek" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "Rolloù seniñ speredek" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "Titouroù an ton" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "Titouroù an ton" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "Sonogram" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "Digarezit" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "Urzhiañ dre doare (urzh lizherennek)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "Urzhiañ dre doare (dre brud)" #: ../bin/src/ui_icecastfilterwidget.h:77 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ñ" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "Mammenn" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "Mammennoù" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "Kudenn kennaskañ gant Spotify" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "Enlugellad Spotify" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "Enlugellad Spotify n'eo ket staliet" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "Boaz" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "Karetañ" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "Kregiñ ar roll seniñ" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "Kregin an transkodiñ" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 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:405 #, qt-format msgid "Starting %1" msgstr "O kregiñ %1" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "O kregiñ..." #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "Savlec'hioù" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Paouez" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "Paouez goude" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "Paouez goude ar roud-mañ" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Paouez goude vefe lennet an ton" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "Paouez goude ar roud lennet" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "Paouezet" #: core/song.cpp:341 msgid "Stream" msgstr "Lanv" #: internet/subsonicsettingspage.cpp:30 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:160 msgid "Streaming membership" msgstr "Izili streaming" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "Rollioù seniñ koumanantet" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "Koumananterien" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "Berzh !" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "%1 skrivet" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "Klavioù atizet" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "Taolenn" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "Uhel tre (%1 fps)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "Bras-tre (2048x2048)" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "Mentrezhoù restr kemeret e kont" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "Gourbediñ bremañ ar stadegoù er restroù" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "Sinkronizadur ar boest degemer Spotify" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "Sinkronizadur ar roll seniñ Spotify" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "Sinkronizadur tonioù gwellañ Spotify" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "Livioù ar reizhad" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "Ivinelloù a-us" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Klav" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "Leunier klav" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "Skingomz dre klav" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "Fonnder tizhet" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Tekno" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "Dibarzhioù an testenn" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Trugarez da" #: ui/globalshortcutssettingspage.cpp:175 #, 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:282 msgid "The album cover of the currently playing song" msgstr "Golo an albom o vezañ lennet" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "An teuliad %1 a zo direizh" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "Ar roll seniñ '%1' a oa goulo pe n'eus ket bet tu he kargañ" #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "Al lec'hienn goulennet n'eo ket ur skeudenn" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "Tonioù all a zo en album-mañ" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "Ur gudenn a zo bet e-pad an eskemm gant gpodder.net" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Ur gudenn a zo savet evit kaout metaroadennoù adalek Magnatune" #: podcasts/itunessearchpage.cpp:76 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:56 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:389 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:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 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:187 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:174 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:151 msgid "Third level" msgstr "Trede live" #: internet/jamendoservice.cpp:171 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/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "N'ez eus ket eus an albom er mentrezh goulennet" #: ../bin/src/ui_deviceproperties.h:381 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:375 msgid "This device supports the following file formats:" msgstr "An drobarzhell a c'hell lenn ar mentrezhoù restroù mañ :" #: devices/devicemanager.cpp:566 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:567 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:324 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:186 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/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "Al lanv-mañ a zo evit an izili o deus paet." #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "An doare trobarzhell-mañ n'eo ket meret :%1" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "Padelezh termen" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Titl" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "Evit kregiñ ur skingomz Grooveshark, gwelloc'h vefe deoc'h selaou ouzh un nebeud tonioù Grooveshark all" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "Hiziv" #: core/globalshortcuts.cpp:59 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:1369 msgid "Toggle queue status" msgstr "Cheñch stad al listenn c'hortoz" #: ../bin/src/ui_mainwindow.h:718 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:143 msgid "Tomorrow" msgstr "Warc'hoaz" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "Bet adkaset re a wech " #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "Top tonioù" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "Hollad an albomoù:" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "Niver a eizhbit treuzkaset" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "Niver a atersadennoù rouedad" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Roud" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "Treuzkodañ Sonerezh" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "Renabl an transkoder" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "Transkodiñ" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "O transkodiñ %1 restr oc'h implij %2 threads" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "Dibarzhioù transkodiñ" #: core/song.cpp:338 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "Turbin" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "Lazhañ" #: devices/giolister.cpp:161 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "URL(où)" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "Ger-tremen Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "Anv implijer Ubuntu One" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "Bandenn ledan tre (UWB)" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "N'eus ket tu pellgargañ %1 (%2)" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Dianav" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "Doare endalc'h dianavezet" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Kudenn dianav" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "Ar golo n'eo ket bet lakaet" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "Digoumanantiñ" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "Sonadegoù o-tont" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "O hizivaat roll seniñ Grooveshark" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "Hizivaat ar podkastoù" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "Hizivaat teuliadoù kemmet ar sonaoueg" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "Hizivaat ar sonaoueg pa grog Clementine" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "Hizivaat ar podkast-mañ" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "Hizivadur" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Hizivadenn %1" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "Hizivadenn %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "O hizivaat ar sonaoueg" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "Implij" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "Implij klav arzour an albom pa vez tu" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "Implij berradennoù Gnome" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "Implij metaroadenn Replay Gain ma 'z eo posubl" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "Implijout SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "Implij ar Wii Remote" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "Implij ur roll livioù personelaet" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "Implij ur kemenadennoù personelaet" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "Implijout ur pellurzhier rouedad" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "Implij ar c'jennaskañ" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "Implij al lusker managment dre bitrate" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "Implij mod dinamikel" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "Implij ar c'hemennadennoù evit embann stad ar wiimote" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "Implij ar mod kemmañ ar sonioù evit ur mare" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "Implij yezh dre ziouer ar reizhad" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "Implij roll livioù dre ziouer ar reizhad" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "Implij dibarzhioù dre ziouer ar proksi" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "Implij normalizadur an ampled" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "Implijet" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "An implijer %1 n'en deus ket a kont Grooveshark Anywhere." #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "Etrefas implijer" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Lezanv" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "Implij ar roll evit ouzhpennañ un ton a..." #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "Fonnder kemmus" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "Arzourien Liesseurt" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "Handelv %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "Gwelout" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "Doare heweladur" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "Heweladurioù" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "Dibarzhioù heweladurioù" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "Dinoer aktivelezh mouezh" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "Ampled %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "Gervel ac'hanon pa vez serret un ivinell roll seniñ" #: core/song.cpp:337 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "Lec'hienn web" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "Sizhunvezhioù" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "Pa grog Clementine" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "Pa 'z eo goullo al listenn..." #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "Tu zo deoc'h klask..." #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "Bandenn ledan (WB)" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wiimote %1: gweredekaet" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wiimote %1: Kennasket" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wiimote %1: energiezh kritikal (%2%)" #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wiimote %1: diweredekaet" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wiimote %1: Digennasket" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wiimote %1: energiezh izel (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "ausio Windows Media" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "Hep golo:" #: library/libraryview.cpp:530 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:2088 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:151 msgid "Write all songs statistics into songs' files" msgstr "Skrivañ stadegoù an holl tonioù e restroù an tonioù" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "Anv-implijer pe ger-tremen fall." #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "Bloaz" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "Bloaz - Albom" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "Bloaz" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "Dec'h" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "Emaoc'h o vont da pellgargañ an albomoù-mañ" #: playlist/playlistlistcontainer.cpp:311 #, 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:177 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:172 msgid "You are not signed in." msgstr "N'oc'h ket kennasket." #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "Kennasket oc'h evel %1." #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "Kennasket oc'h." #: ../bin/src/ui_groupbydialog.h:123 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/digitallyimportedsettingspage.cpp:46 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/magnatunesettingspage.cpp:53 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:57 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" #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "Tu zo deoc'h skroblañ tonioù digoust, met n'eus nemet an izili hag a bae a c'hell selaou d'ar skingomz Last.fm radio dre gClementine." #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "N'ho peus ket a kont Grooveshark Anywhere." #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "N'ho peus ket a kont Spotify Premium." #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "N'ho peus ket a koumanant gweredekaet" #: internet/spotifyservice.cpp:170 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 ar c'hefluniadoù." #: internet/spotifysettingspage.cpp:158 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:87 msgid "You love this track" msgstr "Karout a rit ar roud-mañ" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "Ret eo deoc'h lañsañ Gwellvezioù ar reizhiad ha gweredekaat an dibab \"Gweredekaat evit an trevnadoù sikour\" evit implijout ar berradennoù hollek e Clementine." #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "Ezhomm a vo adloc'hañ Clementine ma cheñchit ar yezh." #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "Ne vo ket tu deoc'h lenn savlec'hioù Last.fm ma n'oc'h ket koumanantet da Last.fm." #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "Ho chomlec'h IP a zo :" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Hoc'h aotreoù arveriad evit Last.fm a zo direizh." #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "Hoc'h aotreoù arveriad evit Magnatune a zo direizh." #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "Ho sonaoueg a zo goullo !" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "Ho lanvioù skingomz." #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "Ho skroble : %1" #: visualisations/visualisationcontainer.cpp:152 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/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "Hoc'h anv implijer pe ho ger-tremen a zo direizh." #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Zero" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "ouzhpennañ %n ton" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "goude" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "'zo" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "ha" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "ent emgefreek" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "araok" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "etre" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "brasañ araok" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "bdm" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "en deus" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "diweredekaet" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "pladenn %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "n'en deus ket" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "a echu gant" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "zo kevatal da" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "gpodder.net" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "Teuliad gpodder.net" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "brasoc'h eget" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "etrezek ar re ziwezhañ" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "kbde" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "nebeutoc'h eget" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "hirañ araok" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "diblasañ %n ton" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "nevesañ araok" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "disheñvel diouzh" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "a-raok ar re ziwezhañ" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "ket war" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "koshoc'h da gentañ" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "war" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "dibarzhioù" #: ../bin/src/ui_networkremotesettingspage.h:203 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:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "Tennañ %n ton" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "berrañ araok" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "Meskañ an tonioù" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "bihanañ araok" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "Urzhiañ an tonioù" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "a grog gant" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "paouez" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "roud %1" clementine-1.2.0+dfsg/src/translations/bs.po000066400000000000000000003724521223327513400210470ustar00rootroot00000000000000# 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" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:08+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Bosnian (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " pt" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " sekundi" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " pjesama" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 albuma" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 dana" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "prije %1 dana" #: podcasts/gpoddersync.cpp:79 #, 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:413 #, qt-format msgid "%1 selected of" msgstr "%1 označeno od" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 pjesma" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 pjesama" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 pjesama pronađeno" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 pjesama pronađeno (prikazano %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 pjesama" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1 Wiimotedev modul" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, qt-format msgid "%L1 other listeners" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n neuspjelo" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n završeno" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "&Vlastito" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "&Pomoć" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "&Sakrij %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "&Sakrij..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Lijevo" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Nijedan" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Izlaz" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Desno" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "&Razvuci red da odgovara veličini prozora" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(različito među više pjesama)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "...i svim Amarok pomagačima" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 dan" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 pjesma" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 nasumičnih pjesama" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "" #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:78 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:153 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:297 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "SVA SLAVA HIPNOŽABI" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "O %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "O Clementine..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "O Qt-u..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Detalji o nalogu" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Akcija" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Pokreni/zaustavi Wii-daljinski" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Dodaj tok" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "Dodaj akciju" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Dodaj još jedan tok..." #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Dodaj fasciklu..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Dodaj datoteku..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Dodaj datoteke za pretvorbu" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Dodaj fasciklu" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Dodaj fasciklu..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Dodaj novu fasciklu..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Unesi termin za pretraživanje" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Dodaj tok..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "Dodaj drugoj listi pjesama" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Dodaj u listu pjesama" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "Dodaj na listu čekanja" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Dodaj wiimotedev akciju" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Dodaj..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Dodano ovaj mjesec" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Dodano u ovoj sedmici" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Dodano ove godine" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Dodano danas" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Dodano u zadnja tri mjeseca" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Napredno grupiranje" #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "Poslije kopiranja..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Album (idealna jačina za sve pjesme)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Izvođač albuma" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Informacije o albumu na jamendo.com..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Albumi sa omotom" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Albumi bez omota" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Sve datoteke (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "Sva slava Hipno-žabi!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Svi albumi." #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Svi izvođači" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "Sve datoteke (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Sve liste pjesama (%1)" #: ui/about.cpp:74 msgid "All the translators" msgstr "Svi prevodioci" #: library/library.cpp:84 msgid "All tracks" msgstr "Sve pjesme" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "Pored orginala" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Uvjek sakrij glavni prozor" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Uvjek prikaži glavni prozor" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "Uvjek počni sa slušanjem" #: internet/spotifyblobdownloader.cpp:60 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:61 msgid "An error occurred loading the iTunes database" msgstr "Desila se greška prilikom učitavanja iTunes baze podataka" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Desila se greška prilikom zapisivanja meta podataka na '%1'" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:78 msgid "And:" msgstr "I:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Izgled" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Dodaj datoteke/URL.ove listi pjesama" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "Dodaj trenutnoj listi pjesama" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "Primjeni kompresiju da bi sprječio smetnje" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Jeste li sigurni da želite obrisati \"%1\" podešavanje?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "" #: ui/edittagdialog.cpp:769 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:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Izvođač" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Informacije o izvođaču" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "Izvođačevi inicijali" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Audio format" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Autentifikacija nije prošla" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "" #: ui/about.cpp:65 msgid "Authors" msgstr "Autori" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Automatsko osvježavanje" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "Dostupno" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "Pozadinski tokovi" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Boja pozadine" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Providnost pozadine" #: core/database.cpp:734 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Zabrana" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Osnovna plava" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Ponašanje" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "Biografija od %1" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Protok bitova" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Pretraži..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Dugmad" #: core/song.cpp:339 msgid "CDDA" msgstr "" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "CUE lista podrška" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Promjeni omot" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Promjeni veličinu slova..." #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "Promjeni način ponavljanja" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Promjeni kraticu..." #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Promjeni jezik" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Provjeri za nadogradnje..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "Izaberite ime za svoju pametnu listu pjesama" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Izaberi automatski" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Izaberi boju..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "" #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Izaberi iz liste" #: smartplaylists/querywizardplugin.cpp:155 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." #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:188 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:115 msgid "Classical" msgstr "Klasična" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Čisto" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Isprazni listu pjesama" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Clementine Greška" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Clementine narandžasta" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Clementine vizualizacije" #: ../bin/src/ui_deviceproperties.h:376 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_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:431 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:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:128 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." #: internet/lastfmsettingspage.cpp:110 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 "" #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Clementine preglednik slika" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "Clementine nije mogao pronaci rezultate za ovu datoteku" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Kliknite ovjde da dodate neku muziku" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "Kliknite da mjenjate između ukupnog i preostalog vremena" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "Zatvorite vizualizacije" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "Zatvarajući ovaj prozor, otkazat ćete preuzimanje." #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "Zatvarajući ovaj prozor, zaustavit ćete pretrzagu za omotima albuma." #: ui/equalizer.cpp:116 msgid "Club" msgstr "Klubski" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Komentar" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "Automatski završi oznake" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "Automatski završi oznake..." #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Kompozitor" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "" #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "" #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Podesi Last.fm..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "Podesi Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Podesi prečice" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "" #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "Podesi biblioteku..." #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "" #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "Spoji Wii daljinski koristeći akciju aktivacija/de-aktivacija" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "Spoji uređaj" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "Pretvori svu muziku" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "Pretvori svu muziku koju ovaj uređaje ne podržava" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Kopiraj na uređaj..." #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Kopiraj u biblioteku..." #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:64 #, 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." #: transcoder/transcoder.cpp:432 #, 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:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "Nemoguće učitati last.fm radio stanicu" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "Nemoguće otvoriti izlaznu datoteku %1" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Menadžer omota" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "Omoti sa uključene slike" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Omot učitan automatski sa %1" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "Omot ručno poništen" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "Omot nije podešen" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "Omot podešen sa %1" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "Glatki prelaz sa pjesme na pjesmu, prilikom automatskog prelaženja." #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "Prilagođeno" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "Posebni radio" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Posebno..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "DBus putanja" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Dens" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Datum stvaranja" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Datum izmjenje" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "Uo&bičajena" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Smanji glasnost" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "Podrazumijevano" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "Razmak između vizualizacija" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Obriši datoteke" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Obriši sa uređaja" #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Obriši sa diska..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "Obriši postavke" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "Obriši pametnu listu" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "Obriši orginalne datoteke" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Brišem datoteke" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "Makni sa liste čekanja označene pjesme" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "Makni sa liste čekanja označenu pjesmu" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Odredište" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Detalji..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Uređaj" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Osobine uređaja" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Ime uređaja" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Osobine uređaja..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Uređaji" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "Direktna internet veza" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Fascikla" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Onemogućeno" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Disk" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 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:715 msgid "Do a full library rescan" msgstr "Uradi ponovni pregled biblioteke" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "Ne pretvaraj nikakvu muziku" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Ne ponavljaj" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "Ne prikazuj u raznim izvođačima" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "Ne mješaj" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "Ne zaustavljaj!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Dupli klik za otvaranje" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "Dupli klik na pjesmu će..." #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "Preuzmi fasciklu" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "Prezmi članstvo" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Preuzmi ovaj album" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Preuzmi ovaj album..." #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "" #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "Preuzimam Icecast fasciklu" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "Preuzimam Jamendo katalog" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "Preuzimam Magnatune katalog" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "" #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "" #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "" #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:63 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "" #: core/song.cpp:328 msgid "Flac" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:43 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "" #: core/database.cpp:673 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "" #: internet/lastfmservice.cpp:437 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:154 msgid "Last.fm password" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "" #: ui/equalizer.cpp:123 msgid "Live" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "" #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "" #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "" #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "" #: core/song.cpp:330 msgid "MPC" msgstr "" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "" #: library/library.cpp:74 msgid "Most played" msgstr "" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "" #: library/library.cpp:67 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:80 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "" #: core/utilities.cpp:147 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:366 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "" #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "" #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "" #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "" #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "" #: core/organise.cpp:65 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:124 msgid "Party" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "" #: widgets/osd.cpp:156 msgid "Paused" msgstr "" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "" #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "" #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" 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:206 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "" #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "" #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:460 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "" #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "" #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 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 "" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "" #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "" #: core/song.cpp:341 msgid "Stream" msgstr "" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "" #: ui/about.cpp:70 msgid "Thanks to" msgstr "" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "" #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:56 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:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:174 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:151 msgid "Third level" msgstr "" #: internet/jamendoservice.cpp:171 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "" #: core/song.cpp:338 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "" #: devices/giolister.cpp:161 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "" #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "" #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "" #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "" clementine-1.2.0+dfsg/src/translations/ca.po000066400000000000000000004770111223327513400210230ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Adolfo Jayme Barrientos , 2012-2013 # Adolfo Jayme Barrientos , 2013 # FIRST AUTHOR , 2010 # Roger Pueyo Centelles , 2011-2013 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-09-09 01:17+0000\n" "Last-Translator: Adolfo Jayme Barrientos \n" "Language-Team: Catalan (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr " dies" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " kb/s" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " pt" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " segons" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " cançons" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 àlbums" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 dies" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "fa %1 dies" #: podcasts/gpoddersync.cpp:79 #, 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:413 #, qt-format msgid "%1 selected of" msgstr "%1 seleccionades de" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 cançó" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 cançons" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 cançons trobades" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 cançons trobades (mostrant %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 temes" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 transferit" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1 mòdul Wiimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, qt-format msgid "%L1 other listeners" msgstr "%L1 altres oients" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 reproduccions en total" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n han fallat" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n han acabat" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "&Personalitzades" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "Extres" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "Aj&uda" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "&Amaga «%1»" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "&Amaga…" #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Esquerra" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "Música" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Cap" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "Llista de reproducció" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Surt" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "Mode de repetició" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Dreta" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "Mode aleatori" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "&Encabeix les columnes a la finestra" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "E&ines" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(diferents a les diverses cançons)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "… i tots aquells que han contribuït amb l’Amarok" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "0px" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 dia" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 pista" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "127.0.0.1" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "MP3 de 128k" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "40%" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 pistes aleatòries" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "Actualitzeu a Premium ara" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "Crea un compte nou o restableix la vostra contrasenya" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "Us cal un compte Grooveshark Anywhere." #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "Us cal un compte Premium del Spotify." #: ../bin/src/ui_networkremotesettingspage.h:189 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:78 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:153 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:297 msgid "A-Z" msgstr "A–Z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "LLOEM L’HIPNOGRIPAU" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "Interromp" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "Quant al %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "Quant al Clementine…" #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "Quant al Qt…" #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Detalls del compte" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "Detalls del compte (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Acció" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Habilita/inhabilita el Wiiremote" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "Afegeix un podcast" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Afegeix un corrent de dades" #: ../bin/src/ui_notificationssettingspage.h:425 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:193 msgid "Add action" msgstr "Afegeix una acció" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Afegeix un altre flux…" #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Afegeix un directori…" #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "Afegeix un fitxer" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "Afegeix un fitxer al convertidor" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "Afegeix fitxer(s) al convertidor" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Afegeix un fitxer…" #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Afegeix fitxers per convertir-los" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Afegeix una carpeta" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Afegeix una carpeta…" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Afegeix una carpeta nova…" #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "Afegeix un podcast" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "Afegeix un podcast…" #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Afegeix un terme de cerca" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "Afegeix l’etiqueta d’àlbum a la cançó" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "Afegeix l'etiqueta albumartist a la cançó" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "Afegeix l’etiqueta d’artista a la cançó" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "Afegeix valoració automàtica a la cançó" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "Afegeix l’etiqueta de compositor a la cançó" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "Afegeix l’etiqueta de disc a la cançó" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "Afegeix el nom de fitxer de la cançó" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "Afegeix l’etiqueta de gènere a la cançó" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "Afegeix etiqueta d’agrupació de la cançó" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "Afegeix l’etiqueta de durada a la cançó" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "Afegeix etiqueta d’intèrpret de la cançó" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "Afegeix el nombre de reproduccions" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "Afegeix una valoració a la cançó" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "Afegeix comptador de passades de cançó" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "Afegeix l’etiqueta de títol a la cançó" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "Afegeix l’etiqueta de número de pista a la cançó" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "Afegeix l’etiqueta d’any a la cançó" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Afegeix un flux…" #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "Afegeix als favorits del Grooveshark" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "Afegeix a les llistes de reproducció de Grooveshark" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "Afegeix a una altra llista de reproducció" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Afegeix a la llista de reproducció" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "Afegeix a la cua" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Afegeix una acció del Wiimotedev" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Afegeix…" #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Afegides aquest mes" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Afegides aquesta setmana" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Afegides aquest any" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Afegides avui" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Afegides els últims tres mesos" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "S'està afegint la cançó a La meva música" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "S’està afegint la cançó a favorites" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Agrupament avançat…" #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "Després de" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "Després de copiar…" #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Àlbum" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Àlbum (volum ideal per a totes les pistes)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Artista de l’àlbum" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "Caràtula de l’àlbum" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Informació de l’àlbum en jamendo.com…" #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Àlbums amb caràtules" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Àlbums sense caràtules" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Tots els fitxers (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "Lloem l’Hipnogripau!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Tots els àlbums" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Tots els artistes" #: ui/albumcoverchoicecontroller.cpp:47 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:74 msgid "All the translators" msgstr "Tots els traductors" #: library/library.cpp:84 msgid "All tracks" msgstr "Totes les pistes" #: ../bin/src/ui_networkremotesettingspage.h:194 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:196 msgid "Allow downloads" msgstr "Permet les baixades" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "Permet la codificació centre/costats" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "Al costat dels originals" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Oculta sempre la finestra principal" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Mostra sempre la finestra principal" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "Comença sempre la reproducció" #: internet/spotifyblobdownloader.cpp:60 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:61 msgid "An error occurred loading the iTunes database" msgstr "S’ha produït un error en carregar la base de dades d’iTunes" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "S’ha produït un error en escriure les metadades a «%1»" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "S’ha produït un error no especificat." #: ui/about.cpp:78 msgid "And:" msgstr "I:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "Enfadat" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Aparença" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Afegeix fitxers/URL a la llista de reproducció" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "Afegeix a la llista de reproducció actual" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "Afegeix a la llista de reproducció" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "Aplica compressió per evitar el «clipping»" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Esteu segur que voleu eliminar la predefinició «%1»?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "Esteu segur que voleu eliminar aquesta llista de reproducció?" #: ui/edittagdialog.cpp:769 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:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Artista" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Inf. artista" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "Ràdio de l’artista" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "Etiquetes de l’artista" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "Inicials de l’artista" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Format d’àudio" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Ha fallat l’autenticació" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "Autor" #: ui/about.cpp:65 msgid "Authors" msgstr "Autors" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Auto" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Actualització automàtica" #: ../bin/src/ui_librarysettingspage.h:208 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:45 msgid "Available" msgstr "Disponible" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "Velocitat de bits mitjà" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "Mida d’imatge mitjà" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "Podcasts de la BBC" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "PPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "Fluxes en segon pla" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Color de fons" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "Imatge de fons" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Opacitat del fons" #: core/database.cpp:734 msgid "Backing up database" msgstr "S’està fent una còpia de seguretat de la base de dades" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "Balanç" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Veta" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "Analitzador de barres" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Blau bàsic" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "Tipus d’àudio bàsic" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Comportament" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "Millor" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "Biografia de %1" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Taxa de bits" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "Taxa de bits" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "Analitzador de blocs" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "Tipus de bloc" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "Quantitat de desenfoqui" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "Cos" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "Analitzador de ressonància" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Explora…" #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "Durada de la memòria intermèdia" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "Emplenant la memòria intermèdia" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "Però aquests orígens estan desactivats:" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Botons" #: core/song.cpp:339 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "Compatibilitat amb fulles CUE" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "Cancel·la" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Canvia la caràtula" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Canvia la mida de la lletra" #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "Canvia la manera de repetició" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Canvia la drecera…" #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "Canvia el mode aleatori" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Canvia l’idioma" #: ../bin/src/ui_playbacksettingspage.h:330 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:228 msgid "Check for new episodes" msgstr "Comprova si hi ha nous episodis" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Comprova si hi ha actualitzacions…" #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "Trieu un nom per a la llista de reproducció intel·ligent" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Tria automàticament" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Tria el color…" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "Tria el tipus de lletra…" #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Tria de la llista" #: smartplaylists/querywizardplugin.cpp:155 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à." #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "Escolliu el directori de baixada dels podcasts" #: ../bin/src/ui_songinfosettingspage.h:188 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:115 msgid "Classical" msgstr "Clàssica" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "S‘està netejant" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Neteja" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Neteja la llista de reproducció" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Error de Clementine" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Taronja de Clementine" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Visualització de Clementine" #: ../bin/src/ui_deviceproperties.h:376 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 formant que pugui reproduir." #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine pot reproduir música que hagi carregat a Box" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine pot reproduir música que hagi carregat a Dropbox" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine pot reproduir música que hagi carregat a Google Drive" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "Clementine pot reproduir música que hagi carregat a Ubuntu One" #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "El Clementine pot mostrar un missatge cada vegada que la pista canvia." #: ../bin/src/ui_podcastsettingspage.h:250 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 vostres altres ordinadors i aplicacions de podcasts. Crea un compte." #: visualisations/projectmvisualisation.cpp:128 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." #: internet/lastfmsettingspage.cpp:110 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 "El Clementine no ha pogut obtenir l'estat de la vostra subscripció degut a un problema amb la connexió. Les cançons reproduïdes seran emmagatzemades i enviades més tard a Last.fm. " #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Visor d’imatges del Clementine" #: ../bin/src/ui_trackselectiondialog.h:206 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:210 msgid "Clementine will find music in:" msgstr "El Clementine trobarà música a:" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Feu clic aquí per afegir música" #: playlist/playlisttabbar.cpp:293 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:72 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_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "Premeu «Inicia sessió» i s’obrirà un navegador. Una vegada que acabi, torneu a Clementine." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Tanca" #: playlist/playlisttabbar.cpp:54 msgid "Close playlist" msgstr "Tanca la llista de reproducció" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "Tanca la visualització" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "Si tanqueu aquesta finestra, es cancel·larà la descàrrega." #: ui/albumcovermanager.cpp:216 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:116 msgid "Club" msgstr "Club" #: ../bin/src/ui_appearancesettingspage.h:272 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:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Comentari" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "Completa les etiquetes automàticament" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "Completa les etiquetes automàticament…" #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Compositor" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "Configura %1…" #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "Configura el Grooveshark…" #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Configura Last.fm..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "Configura Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Configura les dreceres" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "Configura l’Spotify…" #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "Configura Subsonic…" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "Configura la cerca global…" #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "Configura la col·lecció…" #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "Configura els podcasts…" #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "Configura…" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "Connetar els comandaments remot Wii amb l'acció activar/desactivar" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "Connecta el dispositiu" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "S’està connectant amb Spotify" #: internet/subsonicsettingspage.cpp:107 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/subsonicsettingspage.cpp:117 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/" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "Terminal" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "Taxa de bits constant" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "Converteix tota la música" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "Convertir qualsevol música que el dispositiu no pugui reproduir" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "Copiar al porta-retalls" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Còpia al dispositiu…" #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Còpia a la col·lecció…" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "Copyright" #: internet/subsonicsettingspage.cpp:81 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:64 #, 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" #: transcoder/transcoder.cpp:432 #, 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:426 #, 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/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "No s’ha pogut carregar l’estació de ràdio de Last.fm" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "No s’ha pogut obrir el fitxer de sortida %1" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Gestor de caràtules" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "Imatge de la portada autocontinguda al fitxer" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Imatge de portada carregada automàticament de %1" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "S’ha esborrat la imatge de la caràtula manualment" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "Imatge de portada no establerta" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "Imatge de portada establerta des de %1" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "Caràtules de %1" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "Crear una nova llista de reproducció de Grooveshark" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "Fusiona el so quan es canviï la pista automàticament" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "Fusiona el so quan es canviï la pista manualment" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Baix" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Maj+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Maj+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "Ctrl+Maj+T" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Amunt" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "Personalitzat" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "Imatge personalitzada:" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "Configuració personalitzada dels missatges" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "Ràdio personalitzada" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Personalitza..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "Camí del DBus" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Dance" #: core/database.cpp:688 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 vostra base de dades" #: playlist/playlist.cpp:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Data de creació" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Data de modificació" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "Dies" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "Per de&fecte" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "Redueix el volum un 4%" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "Redueix el volum per cent" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Redueix el volum" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "Imatge de fons per defecte" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "Opcions per defecte" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "Retard entre visualitzacions" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "Eliminar" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "Esborrar la llista de reproducció de Grooveshark" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "Esborra les dades baixades" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Suprimeix els fitxers" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Suprimeix del dispositiu…" #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Suprimeix del disc…" #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "Esborra els episodis escoltats" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "Elimina la predefinició" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "Elimina la llista de reproducció intel·ligent" #: ../bin/src/ui_organisedialog.h:194 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:1363 msgid "Dequeue selected tracks" msgstr "Treure de la cua les pistes seleccionades" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "Treure de la cua la pista" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Destí" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Detalls…" #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Dispositiu" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Propietats del dispositiu" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Nom de dispositiu" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Propietats del dispositiu…" #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Dispositius" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Potser volíeu dir" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "Contrasenya de Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "Usuari de Digitally Imported" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "Connexió directa a Internet" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Directori" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "Deshabilita la durada" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "Desactiva la generació de barres d’ànim" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Deshabilitat" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Disc" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "Transmissió discontínua" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 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:715 msgid "Do a full library rescan" msgstr "Analitza tota la col·lecció de nou" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "No converteixis cap musica" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "No ho sobreescriguis" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "No repetir" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "No ho mostris a Artistes diversos" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "No remenar" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "No aturar!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "Feu una donació" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Feu doble clic per obrir" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "En fer doble clic a una cançó..." #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "Baixa %n episodis" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "Directori de descàrregues" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "Baixa els episodis a" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "Membres de descarrega" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "Baixa els episodis nous automàticament" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "Baixada en la cua" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "Baixeu l’aplicació per l’Android" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Baixa aquest àlbum" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Baixa aquest àlbum…" #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "Baixa aquest episodi" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "Baixa…" #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "S’està baixant (%1%)…" #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "S’està baixant el directori d’Icecast" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "S’està baixant el catàleg de Jamendo" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "S’està baixant el catàleg de Magnatune" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "S’està baixant el connector d’Spotify" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "S’estan baixant les metadades" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "Arrossegueu per canviar de posició" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "Dropbox" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "S’ha activat el mode dinàmic" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "Mescla dinàmica aleatòria" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "Edita la llista de reproducció intel·ligent" #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Edita l’etiqueta «%1»…" #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "Edita l’etiqueta…" #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "Edita les etiquetes" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Edita la informació de la pista" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "Edita la informació de la pista…" #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Edita la informació de les pistes..." #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Edita…" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "Activa l’admissió del remot del Wii" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "Activa l’equalitzador" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "Activa les dreceres només quan el Clementine tingui el focus" #: ../bin/src/ui_globalsearchsettingspage.h:147 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:62 msgid "Enable/disable Last.fm scrobbling" msgstr "Activa/desactiva el «scrobbling» del Last.fm" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "Complexitat de la codificació" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "Qualitat del motor de codificació" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "Mode de codificació" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "Introduïu un URL" #: ../bin/src/ui_coverfromurldialog.h:103 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:205 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:137 msgid "Enter a new name for this playlist" msgstr "Introduïu un nom per aquesta llista de reproducció" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Introduïu un artista o una etiqueta per començar a sentir una radio de Last.fm." #: ../bin/src/ui_globalsearchview.h:209 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:77 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:77 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:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "Introduïu els termes de la cerca" #: ../bin/src/ui_addstreamdialog.h:114 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:171 msgid "Enter the name of the folder" msgstr "Introduïu el nom de la carpeta" #: ../bin/src/ui_networkremotesettingspage.h:198 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:87 msgid "Entire collection" msgstr "Tota la col·lecció" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Error" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Error connectant el dispositiu MTP" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "S’ha produït un error en copiar les cançons" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "S’ha produït un error en suprimir les cançons" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "S’ha produït un error en baixar el connector d’Spotify" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "S’ha produït un error en carregar %1" #: internet/digitallyimportedservicebase.cpp:203 #: internet/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:399 #, qt-format msgid "Error processing %1: %2" msgstr "Error processant %1: %2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "S’ha produït un error en carregar el CD d’àudio" #: library/library.cpp:63 msgid "Ever played" msgstr "Mai reproduïdes" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "Cada 10 minuts" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "Cada 12 hores" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "Cada 2 hores" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "Cada 20 minuts" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "Cada 30 minuts" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "Cada 6 hores" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "Cada hora" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Excepte entre pistes del mateix àlbum o del mateix full CUE" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "Caràtules existents" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "Expandeix" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "Caduca el %1" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "Exporta les caràtules" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "Exporta les caràtules" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "Exporta les caràtules baixades" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "Exporta les caràtules incrustades" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "Ha finalitzat l’exportació" #: ui/albumcovermanager.cpp:786 #, 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:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "Atenua el volum en pausar i en reprendre" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "Esvaeix el so en parar una pista" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "Esvaïment" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "Durada de l’esvaïment" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "No s'ha pogut obtenir el directori" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "No s'han pogut obtenir els podcasts" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "No s'ha pogut carregar el podcast" #: podcasts/podcasturlloader.cpp:167 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:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "Ràpid" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "Preferits" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "Cançons favorites" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "Recull les caràtules que falten" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "Recull automàticament" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "S'han acabat d'obtenir les dades" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "S’està recollint la col·lecció de l’Subsonic" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "S’ha produït un error en obtenir la caràtula" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "Extensió del fitxer" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "Format dels fitxers" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Nom del fitxer" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "Nom del fitxer (sense camí)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Mida del fitxer" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Tipus de fitxer" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Nom de fitxer" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Fitxers" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "Fitxers per convertir" #: smartplaylists/querywizardplugin.cpp:90 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." #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "S'està establint l'emprenta digital a la cançó" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "Finalitzat" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "Primer nivell" #: core/song.cpp:328 msgid "Flac" msgstr "FLAC" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Mida de la lletra" #: ../bin/src/ui_spotifysettingspage.h:213 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:204 msgid "Force mono encoding" msgstr "Força la codificació mono" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "Oblida el dispositiu" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Formulari" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "Format" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Taxa de mostreig" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "Trames per espai de memòria intermèdia" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Amics" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "Congelat" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Baixos complets" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "Baixos i aguts complets" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "Aguts complets" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "Motor d’àudio GStreamer" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "General" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Configuració general" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Estil" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "Obtingueu una URL per compartir aquesta llista de reproducció de Grooveshark" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "Obtingueu una URL per compartir aquesta cançó de Grooveshark" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "S’estan obtenint les cançons populars de Grooveshark" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "S’estan obtenint els canals" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "S’estan obtenint els fluxos" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "Doneu-li un nom:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "Vés-hi" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "Vés a la pestanya de la següent llista de reproducció" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "Vés a la pestanya de l'anterior llista de reproducció" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, 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:206 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_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "S'ha produït un error en iniciar sessió a Grooveshark" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "URL de la llista de reproducció de Grooveshark" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "Ràdio de Grooveshark" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "URL de la cançó a Grooveshark" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "Agrupa la col·lecció per…" #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "Agrupa per" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "Agrupa per àlbum" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "Agrupa per artista" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "Agrupa per artista/àlbum" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "Agrupa per artista/any–àlbum" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "Agrupa per gènere/àlbum" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "Agrupa per gènere/artista/àlbum" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "Agrupació" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "La pàgina HTML no conté cap canal RSS" #: internet/subsonicsettingspage.cpp:135 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:163 msgid "HTTP proxy" msgstr "Proxy HTTP" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "Content" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "Informació del maquinari" #: ../bin/src/ui_deviceproperties.h:372 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:202 msgid "High" msgstr "Alt" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "Alta (%1 fps)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "Alta (1024 × 1024)" #: internet/subsonicsettingspage.cpp:112 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:310 msgid "Hours" msgstr "Hores" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "Hipnogripau" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "No tinc cap compte a Magnatune" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Icona" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "Icones a la part superior" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "S’està identificant la cançó" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 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:77 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:204 msgid "Ignore \"The\" in artist names" msgstr "Ignora «The» als noms dels artistes" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Imatges (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "D’aquí a %1 dies" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "D’aquí a %1 setmanes" #: ../bin/src/ui_wizardfinishpage.h:86 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 noves pistes s'escolliran i afegiran a la llista de reproducció cada vegada que acabi una cançó." #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "Safata d’entrada" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "Incloure la caràtula a la notificació" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "Inclou totes les cançons" #: internet/subsonicsettingspage.cpp:90 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/subsonicsettingspage.cpp:94 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/subsonicsettingspage.cpp:127 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:158 msgid "Increase the volume by 4%" msgstr "Incrementa el volum un 4%" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "Augmenta el volum per cent" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Incrementa el volum" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "S'està indexant %1" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "Informació" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "Insereix…" #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Instal·lat" #: core/database.cpp:673 msgid "Integrity check" msgstr "Comprovació d’integritat" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "Proveïdors d’Internet" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "La clau de l’API no és vàlida" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "El format no és vàlid" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "El mètode no és vàlid" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "Els paràmetres no són vàlids" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "El recurs especificat no és vàlid" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "El servei no és vàlid" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "La clau de sessió no és vàlida" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "El nom d’usuari i/o la contrasenya no és vàlid" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "Pistes més escoltades a Jamendo" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "Les millors cançons del Jamendo" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "Les millors cançons del mes al Jamendo" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "Les millors cançons de la setmana al Jamendo" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "Base de dades de Jamendo" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "Vés a la pista que s’està reproduïnt" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Premeu els botons per %1 segon…" #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Premeu els botons per %1 segons…" #: ../bin/src/ui_behavioursettingspage.h:193 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:193 msgid "Keep the original files" msgstr "Conserva els fitxers originals" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "Gatets" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Idioma" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "Portàtil/auriculars" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Saló gran" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "Caràtula de l’àlbum gran" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "Barra lateral gran" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "Últim reproduït" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "Ràdio personalitzada de Last.fm: %1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Col·lecció de Last.fm – %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "Ràdio mix de Last.fm – %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Radio dels veïns de Last.fm – %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Estació de ràdio de Last.fm – %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Artistes similars a %1 del Last.fm" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Ràdio d’etiqueta a Last.fm: %1" #: internet/lastfmservice.cpp:437 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:154 msgid "Last.fm password" msgstr "Contrasenya de Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "Recompte de reproduccions de Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Etiquetes de Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Usuari de Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Wiki de Last.fm" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "Cançons menys preferides" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "Deixeu-ho buit per assignar el valor predeterminat. Exemples: «/dev/dsp», «front»,…" #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "Esquerra" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Durada" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Col·lecció" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "Agrupació avançada de la col·lecció" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "Avís de reescaneig de la col·lecció" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "Cerca a la col·lecció" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Límits" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "Escolteu cançons de l’Grooveshark basant-se en allò que s’ha reproduït prèviament " #: ui/equalizer.cpp:123 msgid "Live" msgstr "En directe" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Carregar" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "Carrega la caràtula des de l’URL" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "Carrega la caràtula des de l’URL…" #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "Carrega la portada des del disc dur" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "Carrega la caràtula des del disc…" #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "Carrega la llista de reproducció" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "Carrega la llista de reproducció..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "S’està carregant la ràdio de Last.fm" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "S’està carregant el dispositiu MTP" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "S’està carregant la base de dades de l’iPod" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "S’està carregant la llista de reproducció intel·ligent" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "S’estan carregant les cançons" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "S’està carregant el flux" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "S’estan carregant les pistes" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "S’està carregant la informació de les pistes" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "S’està carregant…" #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "Carregar fitxers/URLs, substituïnt l'actual llista de reproducció" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Entra" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "Ha fallat l'inici de sessió" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "Perfil de predicció a llarg termini (LTP)" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "M’encanta" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Baixa (%1 fps)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "Baixa (256 × 256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "Perfil de baixa complexitat (LC)" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "Llletres" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "Lletres des de %1" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Baixada de Magnatune" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Baixada de Magnatune finalitzada" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "Perfil principal (MAIN)" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "Fes-ho doncs!" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "Fes la llista de reproducció disponible fora de línia" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "Resposta incorrecta" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "Configuració manual del servidor intermediari" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "Manualment" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "Fabricant" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "Marca com a escoltat" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "Marca com a nou" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "Tots els termes de cerca han de coincidir (AND)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "Un o més termes de cerca han de coincidir (OR)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "Màxima taxa de bits" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "Mitja (%1 fps)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "Mitja (512 × 512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "Tipus d’afiliació" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "Taxa de bits mínima" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "Falten les predefinicions del projectM" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "Model" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "Monitoritza els canvis a la col·lecció" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "Reproducció monofònica" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "Mesos" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "Estat d’ànim" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "Estil de barres d’ànim" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "Barres d’ànim" #: library/library.cpp:74 msgid "Most played" msgstr "Més reproduïdes" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "Punt de muntatge" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "Punts de muntatge" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "Mou cap avall" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "Mou a la col·lecció…" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "Mou cap amunt" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "Música" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Col·lecció de música" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "Silenci" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "La meva col·lecció del Last.fm" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "La meva ràdio mix del Last.fm" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "El meu veïnat del Last.fm" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "La meva ràdio recomanada de Last.fm" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "La meva ràdio mix" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "La meva música" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "El meu veïnat" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "La meva emissora de ràdio" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "Les meves recomanacions" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Nom" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "Opcions d'anomenat" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "Banda estreta (BE)" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "Veïns" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "Xarxa" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "Servidor intermediari de xarxa" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "Control remot de xarxa" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "Mai" #: library/library.cpp:67 msgid "Never played" msgstr "Mai reproduïdes" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "Mai comencis a reproduir" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "Carpeta nova" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "Llista de reproducció nova" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "Llista de reproducció intel·ligent nova…" #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "Cançons noves" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "Les pistes noves seran afegides automàticament" #: library/library.cpp:80 msgid "Newest tracks" msgstr "Pistes més noves" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "Següent" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Pista següent" #: core/utilities.cpp:147 msgid "Next week" msgstr "La setmana vinent" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "Sense analitzador" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "Sense imatge de fons" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "No hi ha cap caràtula que exportar." #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "No utilitzis blocs llargs" #: playlist/playlistcontainer.cpp:366 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:145 msgid "No short blocks" msgstr "No utilitzis blocs curs" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "Cap" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 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:155 msgid "Normal" msgstr "Normal" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "Tipus de bloc normal" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "No està disponible mentre s'utilitza una llista de reproducció dinàmica" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "No connectat" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "No hi ha suficient contingut" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "No hi ha suficients ventiladors" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "No hi ha prous membres" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "No hi ha prous veïns" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "No instal·lat" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "No heu iniciat la sessió" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "No s’ha muntat – feu doble clic per muntar-ho" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "Tipus de notificació" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Notificacions" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Ara en reproducció" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "Vista prèvia OSD" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "Opacitat" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "Obre %1 en un navegador" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "Obre un CD d’àudio…" #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "Obre un fitxer OPML" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "Obre un fitxer OPML…" #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "Obrir dispositiu" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "Obre un fitxer..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "Obre-ho a Google Drive" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "Obre en una nova llista de reproducció" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Obre..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "Operació fallida" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "Optimitza la taxa de bits" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "Optimitza la qualitat" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "Opcions..." #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "Organitza fitxers" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "Organitza fitxers..." #: core/organise.cpp:65 msgid "Organising files" msgstr "Organitzant fitxers" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "Etiquetes originals" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Altres opcions" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "Sortida" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "Perifèric de sortida" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "Opcions de sortida" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "Connector de sortida" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "Sobreescriu-ho tot" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "Sobreescriu els fitxers existents" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "Sobreescriu només les més petites" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "Propietari" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "S’està analitzant el catàleg de Jamendo" #: ui/equalizer.cpp:124 msgid "Party" msgstr "Festa" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "Contrasenya" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Pausa" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "Pausa la reproducció" #: widgets/osd.cpp:156 msgid "Paused" msgstr "En pausa" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "Intèrpret" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "Píxel" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "Barra lateral senzilla" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Reprodueix" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "Reprodueix Artista o Etiqueta" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "Reprodueix la ràdio de l’artista…" #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "Comptador de reproduccions" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "Reproducció de ràdio personalitzada..." #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "Reprodueix si esta parat, pausa si esta reproduïnt" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "Reprodueix si encara no hi ha res reproduint-se" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "Reproduix la radio de l'etiqueta..." #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "Reprodueix la a cançó de la llista de reproducció" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "Reprodueix/Pausa" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Reproducció" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Opcions del reproductor" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "Llista de reproducció" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "Llista de reproducció finalitzada" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "Opcions de la llista de reproducció" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "Tipus de llista de reproducció" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "Llistes de reproducció" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "Tanqueu el navegador i torneu a Clementine." #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "Estat del connector" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "Podcasts" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Pop" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "Cançons populars" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "Cançons populars del mes" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "Cançons populars d'avui" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "Duració de la finestra emergent" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "Port" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "Preamplificador" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "Preferències" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "Preferències…" #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "Noms d'arxiu preferits per a les caràtules dels àlbums (separats per comes)" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "Format d’àudio preferit" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "Taxa de bits preferida" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "Format preferit" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "Tipus d’àudio premium" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "Predefinició:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "Premeu una combinació de tecles per" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "Pulsa una tecla" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Pressionar una combinació de tecles per utilitzar el %1..." #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "Opcions de l'OSD bonic" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "Previsualitza" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "Anterior" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "Pista anterior" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Mostra la informació de la versió" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "Perfil" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "Progrés" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 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:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "Qualitat" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "S'està consultant el dispositiu..." #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "Gestor de la cua" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "Afegeix les pistes seleccionades a la cua" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "Afegeix la pista a la cua" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "Ràdio (mateix volum per a totes les peces)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "Ràdios" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "Pluja" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "Visualització al·leatòria" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "Puntua la cançó actual amb 0 estrelles" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "Puntua la cançó actual amb 1 estrella" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "Puntua la cançó actual amb 2 estrelles" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "Puntua la cançó actual amb 3 estrelles" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "Puntua la cançó actual amb 4 estrelles" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "Puntua la cançó actual amb 5 estrelles" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "Puntuació" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "Realment voleu cancel·lar?" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "S’ha excedit el límit de redireccions, comproveu la configuració del servidor." #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "Actualitza" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "Actualitzar catàleg" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "Actualitzar canals" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "Actualitza la llista d’amics" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "Actualitza la llista d’emissores" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "Refresca els fluxes" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Reggae" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "Recorda el moviment del Wiimote" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "Recorda de l'últim cop" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Suprimeix" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "Elimina acció" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "Esborra els duplicats de la llista de reproducció" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "Suprimeix carpeta" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "Esborra-ho de La meva música" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "Esborreu dels favorits" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "Suprimeix de la llista de reproducció" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "Esborra la llista de reproducció" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "Suprimeix llestes de reproducció" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "S'estan esborrant cançons de La meva música" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "S'estan treient les cançons dels preferits" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "Reanomena la llista de reproducció «%1»" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "Reanomena una llista de reproducció de Grooveshark" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "Renombra de la llista de reproducció" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "Renombra de la llista de reproducció..." #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "Recordar pistes en aquest ordre..." #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Repeteix" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "Repeteix àlbum" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "Repeteix la llista de reproducció" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "Repeteix la pista" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Substitueix la llista de reproducció actual" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "Substitueix la llista de reproducció" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "Reemplaça els espais amb guions baixos" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "Replay Gain" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "Mode de l’Replay Gain" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "Reomple" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "Sol·licita un codi d’autenticació" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "Posa a zero" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" msgstr "Posa a zero el comptador de reproduccions" #: core/commandlineoptions.cpp:164 msgid "" "Restart the track, or play the previous track if within 8 seconds of start." msgstr "Reinicia la pista, o canvia a l’anterior si no han transcorregut 8 segons des de l’inici." #: ../bin/src/ui_organisedialog.h:206 msgid "Restrict to ASCII characters" msgstr "Limitar als caràcters ASCII" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "Reprèn la reproducció en l’inici" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "S'estan obtenint les cançons de La meva música de Grooveshark" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "S’estan obtenint les cançons favorites de Grooveshark" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "S’estan obtenint les llistes de reproducció de Grooveshark" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "Torna a Clementine" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "Dreta" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "Executa" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "Proxy SOCKS" #: internet/subsonicsettingspage.cpp:122 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:202 msgid "Safely remove device" msgstr "Treure el dispositiu amb seguretat" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "Treure el dispositiu amb seguretat després de copiar" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "Freqüència de mostreig" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "Freqüència de mostreig" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "Desa fitxers .mood en la vostra col·lecció musical" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "Desa la caràtula de l’àlbum" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "Desa la caràtula al disc dur…" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "Desa la imatge" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "Desa la llista de reproducció" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "Desa la llista de reproducció..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "Desa els valors" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "Desa les valoracions en etiquetes de fitxers quan sigui possible" #: ../bin/src/ui_librarysettingspage.h:197 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:115 msgid "Save this stream in the Internet tab" msgstr "Salva aquest flux a la pestanya d'Internet" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "S’estan desant les estadístiques en els fitxers de les cançons" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "S'estan desant les pistes" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "Perfil de freqüència de mostreig escalable (SSR)" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "Mida de l’escala" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "Puntuació" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "Envia les pistes que escolto" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "Cerca" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "Cerca emissores Icecast" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "Cerca a Jamendo" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Cerca al Magnatune" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "Cerca a Subsonic" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "Cerca la caràtula del àlbum…" #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "Cerca a tot arreu" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "Cerca a gpodder.net" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "Cerca a iTunes" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "Mode de cerca" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "Opcions de cerca" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "Resultats de la cerca" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "Termes de cerca" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "Cercant a Grooveshark" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "Segon nivell" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "Cerca enrere" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "Cerca cap endavant" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "Mou-te per la pista en reproducció a una posició relativa" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "Mou-te per la pista en reproducció a una posició absoluta" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "Seleccionar-ho tot" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "No selecciones res" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "Seleccioneu el color de fons:" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "Seleccioneu la imatge de fons" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "Selecciona la millor coincidència possible" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "Seleccioneu el color de primer pla:" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "Seleccioneu visualitzacions" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "Seleccioneu visualitzacions..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "Número de sèrie" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "URL del servidor" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "Detalls del servidor" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "Servei fora de línia" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Estableix %1 a «%2»…" #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "Estableix el volum al percent" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "Estableix valor per totes les pistes seleccionades..." #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "Paràmetres" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Drecera" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "Drecera per «%1»" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Ja existeix la drecera per a «%1»" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Mostrar" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "Mostra l'OSD" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "Mostra una animació destacant la pista actual" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "Mostra una barra d’ànim en el progrés de la pista" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "Mostra una notificació nativa d'escriptori" #: ../bin/src/ui_notificationssettingspage.h:442 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:441 msgid "Show a notification when I change the volume" msgstr "Mostra una notificació quan canvia el volum" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "Mostra una finestra emergent de la safata de sistema" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "Mostra un OSD bonic" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "Mostra sota la barra d'estat" #: ui/mainwindow.cpp:460 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:209 msgid "Show cover art in library" msgstr "Mostra les caràtules a la col·lecció" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "Mostra els separadors" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "Mostra a mida completa..." #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "Mostra al gestor de fitxers" #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "Mostra en Artistes diversos" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "Mostra les barres d’ànim" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "Mostra només els duplicats" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "Mostra només les pistes sense etiquetar" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "Mostra suggeriments de cerca" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "Mostra els botons «M’agrada» i «Veta»" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "Mostra el botó de compartir a la finestra principal" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "Mostrar la icona a la safata" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "Mostra quina orígens estan activats i desactivats" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "Mostra/amaga" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Aleatori" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "Remena els àlbums" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "Remena-ho tot" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "Llista de reproducció aleatòria" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "Remena les pistes d'aquest àlbum" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "Inicieu la sessió" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "Tancar la sessió" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "S’està iniciant la sessió…" #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "Artistes similars" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "Mida" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "Mida:" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "Salta enrere en la llista de reproducció" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "Comptador d’omissions" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "Salta endavant en la llista de reproducció" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "Caràtula petita" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "Barra lateral petita" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "Llista de reproducció intel·ligent" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "Llistes de reproducció intel·ligents" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Suau" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "Rock suau" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "Informació de la cançó" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "Inf. cançó" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "Sonograma" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "Ho lamentem" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "Ordena per gènere (alfabèticament)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "Ordena per gènere (segons la popularitat)" #: ../bin/src/ui_icecastfilterwidget.h:77 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ó" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "Font" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "Fonts" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "Error en iniciar sessió a Spotify" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "Connector d'Spotify" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "No s’ha instal·lat el connector de Spotify" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "Estàndard" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "Destacat" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "Inicia la llista de reproducció que s'està reproduint" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "Inicia la conversió" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 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:405 #, qt-format msgid "Starting %1" msgstr "Començarà %1" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "Iniciant..." #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "Emissores" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Atura" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "Atura desprès" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "Atura després d’aquesta pista" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Atura la reproducció" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "Atura la reproducció després de la pista actual" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "Aturat" #: core/song.cpp:341 msgid "Stream" msgstr "Flux de dades" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "Per fer «streaming» des d’un servidor de Subsonic es requereix una llicència de servidor vàlida, una vegada transcorreguts 30 dies." #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "Membresía para streaming" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "Llestes de reproducció subscrites" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "Subscriptors" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "Correcte!" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "Escrit satisfactòriament %1" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "Etiquetes suggerides" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "Resum" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "Molt alta (%1 fps)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "Molt alta (2048 × 2048)" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "Formats suportats" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "Sincronitza estadístiques als fitxers ara" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "S'està sincronitzant la safata d'entrada de Spotify" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "S'està sincronitzant la llista de reproducció de Spotify" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "S'estan sincronitzant les pistes destacades de Spotify" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "Colors del sistema" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "Pestanyes a dalt de tot" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Etiqueta" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "Recolector d'etiquetes" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "Ràdio d'etiquetes" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "Taxa de bits desitjada" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "Opcions del text" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Gràcies a" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "No s’ha pogut iniciar l’ordre «%1»." #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "La caràtula de l’àlbum de la cançó en reproducció" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "El directori %1 no es vàlid" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "La llista de reproducció «%1» està buida o no s’ha pogut carregar." #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "L’adreça que heu sol·licitat no conté cap imatge." #: internet/subsonicsettingspage.cpp:98 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:2083 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ó degut a que incorpora les següents característiques noves:" #: library/libraryview.cpp:529 msgid "There are other songs in this album" msgstr "Hi ha altres cançons en aquest àlbum" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "S'ha produit un error en comunicar-se amb gpodder.net" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Hi ha hagut un problema rebent la meta-informació de Magnatune" #: podcasts/itunessearchpage.cpp:76 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:56 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "Hi ha hagut problemes copiant algunes cançons. Els següents fitxers 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:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "S’eliminaran aquests fitxers del dispositiu, esteu segur que voleu continuar?" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 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:187 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:174 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:151 msgid "Third level" msgstr "Tercer nivell" #: internet/jamendoservice.cpp:171 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/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "Aquest àlbum no està disponible en el format demanat" #: ../bin/src/ui_deviceproperties.h:381 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 Clementine pugui veure amb quins formats de fitxer és compatible." #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "Aquest dispositiu és compatible amb els següents formats d’fitxer:" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Aquest dispositiu no funcionarà correctament" #: devices/devicemanager.cpp:567 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "Aquest és un dispositiu MTP, però heu compilat el Clementine sense suport 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:324 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 connectes aquest dispositiu. Clementine analitzarà el dispositiu per trobar arxius de música - això pot trigar un mica." #: playlist/playlisttabbar.cpp:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Podeu modificar aquesta opció a la pestanya «Comportament» a Preferències" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "Aquest flux es sol per als subscriptors que paguen" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "Aquest tipus de dispositiu no esta suportat: %1" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "Temps d'espera" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Títol" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "Per iniciar la ràdio de Grooveshark, hauríeu de reproduir abans unes quantes cançons de Grooveshark" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "Avui" #: core/globalshortcuts.cpp:59 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:1369 msgid "Toggle queue status" msgstr "Commuta l’estat de la cua" #: ../bin/src/ui_mainwindow.h:718 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:143 msgid "Tomorrow" msgstr "Demà" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "Massa redireccions" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "Millors cançons" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "Total d’àlbums:" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "Bytes totals transferits" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "Total de sol·licituds de xarxa fetes" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Pista" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "Converteix música" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "Registre del convertidor" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "Conversió" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "S’estan convertint %1 fitxers emprant %2 fils" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "Opcions de conversió" #: core/song.cpp:338 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "Turbina" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "Atura" #: devices/giolister.cpp:161 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "URL(s)" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "Contrasenya de l’Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "Nom d’usuari de l’Ubuntu One" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "Banda ultra ampla (UWB)" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "No es pot baixar %1 (%2)" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Desconegut" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "Tipus de contingut desconegut" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Error desconegut" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "Esborra'n la portada" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "Canceleu la subscripció" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "Propers concerts" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "Actualitza la llista de reproducció de Grooveshark" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "Actualitza tots els podcasts" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "Actualitza les carpetes de la col·lecció amb canvis" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "Actualitza la col·lecció quan Clementine arranqui" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "Actualitza aquest podcast" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "S’està actualitzant" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Actualitzant %1" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "Actualitzant %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "S’està actualitzant la col·lecció" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "Forma d'ús" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "Utilitza l’etiqueta Artista de l’àlbum quan estigui disponible" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "Utilitza les tecles de mètode abreujat de Gnome" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "Utilitza les metadades Replay Gain si estan disponibles" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "Utilitza SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "Utilitza el comandament remot Wii" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "Empra un conjunt de colors personalitzat" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "Utilitza un missatge personalitzat per les notificacions" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "Usa un control remot de xarxa" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "Empra autentificació" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "Usa el motor de gestió de flux de bits" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "Empra el mode dinàmic" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "Utilitza les notificacions per informar sobre l'estat del Wiimote" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "Usa el modelatge de soroll temporal" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "Utilitza el valor per defecte del sistema" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "Utilitza el conjunt de colors del sistema" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "Utilitza la configuració de servidor intermediari del sistema" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "Empra la normalització de volum" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "Usat" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "L’usuari %1 no té un compte Grooveshark Anywhere" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "Interfície d’usuari" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Nom d’usuari" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "En emprar el menú per afegir una cançó…" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "Taxa de bits variable" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "Artistes diversos" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "Versió %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "Vista" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "Mode de visualització" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "Visualitzacions" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "Paràmetres de visualització" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "Detecció de veu" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "Volumen %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "Avisa’m abans de tancar una pestanya de llista de reproducció" #: core/song.cpp:337 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "Lloc web" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "Setmanes" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "Quan s’inicia el Clementine" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "Quan la llista sigui buida..." #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "Perquè no proveu..." #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "Banda ampla (WB)" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "Comandament remot Wii %1: activat" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "Comandament remot Wii %1: connectat" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Comandament remot Wii %1: bateria crítica (%2%) " #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Comandament remot Wii %1: desactivat" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Comandament remot Wii %1: desconnectat" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Comandament remot Wii %1: bateria baixa (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "Audio Windows Media" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "Sense caràtula:" #: library/libraryview.cpp:530 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:2088 msgid "Would you like to run a full rescan right now?" msgstr "Voleu fer de nou un escaneig complet ara?" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "Escriu totes les estadístiques en els fitxers de les cançons" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "Nom d’usuari o contrasenya incorrectes." #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "Any" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "Any - Àlbum" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "Anys" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "Ahir" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "Sou a punt de baixar els següents àlbums" #: playlist/playlistlistcontainer.cpp:311 #, 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 favorits?" #: playlist/playlisttabbar.cpp:177 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ó s’esborrarà (aquesta acció és irreversible).\nEsteu segur que voleu continuar?" #: ../bin/src/ui_loginstatewidget.h:172 msgid "You are not signed in." msgstr "No heu iniciat la sessió." #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "Heu iniciat la sessió com a %1." #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "Heu iniciat la sessió." #: ../bin/src/ui_groupbydialog.h:123 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/digitallyimportedsettingspage.cpp:46 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/magnatunesettingspage.cpp:53 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 pista." #: ../bin/src/ui_backgroundstreamssettingspage.h:57 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." #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "Podeu enviar de forma gratuïta la informació de les cançons escoltades, però solament els subscriptors de pagament poden escoltar la ràdio de Last.fm des de Clementine." #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "No disposeu d'un compte Grooveshark Anywhere" #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "No disposeu d'un compte Spotify Premium" #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "No teniu una subscripció activa" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "S’ha tancat la vostra sessió de l’Spotify, torneu a introduir la contrasenya al diàleg de configuració." #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "S’ha tancat la vostra sessió de l’Spotify, torneu a introduir la contrasenya." #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "Us encanta aquesta pista" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "Necessita llançar les Preferències del Sistema i activar \"Habilita l'accés per dispositivos d'ajuda \", per utilitzar dreceres globals a Clementine." #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "Si canvieu l'idioma haureu de reiniciar el Clementine." #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "No podreu reproduir estacions de radi de Last.fm, tret que sigueu un subscriptor." #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "La vostra adreça IP:" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Les teves credencials de Last.fm son incorrectes" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "Les vostres credencials de Magnature eren incorrectes" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "La vostra col·lecció està buida." #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "Els vostres fluxos de ràdio" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "Els vostres «scrobblings»: %1" #: visualisations/visualisationcontainer.cpp:152 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/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "El vostre nom usuari o la contrasenya són incorrectes" #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Zero" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "afegeix %n cançons" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "després" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "fa" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "i" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "automàtic" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "abans" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "entre" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "els més grans primer" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "Tempo" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "conté" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "deshabilitat" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "disc %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "no conté" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "acaba amb" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "és igual a" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "gpodder.net" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "Directori de gpodder.net" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "més gran que" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "en el últims" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "més petit que" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "el més llarg primer" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "mou %n cançons" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "els més recents primer" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "és diferent de" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "no en els últims" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "no pas a" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "els més antics primer" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "a" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "opcions" #: ../bin/src/ui_networkremotesettingspage.h:203 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:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "elimina %n cançons" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "els més curts primer" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "barrejar les cançons" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "els més petits primer" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "ordena les cançons" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "comença amb" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "atura" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "peça %1" clementine-1.2.0+dfsg/src/translations/cs.po000066400000000000000000004706501223327513400210470ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # jui , 2012 # arnaudbienner , 2011 # David Kolibáč , 2011 # Pavel Fric , 2010 # Pavel Fric , 2004,2010 # fri , 2011-2012 # fri , 2013 # fri , 2011-2012 # mandarinki , 2011 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:48+0000\n" "Last-Translator: fri \n" "Language-Team: Czech (http://www.transifex.com/projects/p/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:39 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ůžete seznamy skladeb 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:246 msgid " days" msgstr "dnů" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " kb/s" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " bodů" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " sekund" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " písně" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 alb" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 dnů" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "před %1 dny" #: podcasts/gpoddersync.cpp:79 #, 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:413 #, qt-format msgid "%1 selected of" msgstr "%1 vybráno z" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 píseň" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 písní" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "Bylo nalezeno %1 písní" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "Bylo nalezeno %1 písní (zobrazeno %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 skladeb" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 přeneseno" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: modul Wiimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "nepodařilo se %n" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "dokončeno %n" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "Vl&astní" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "Doplňky" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "Nápo&věda" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "Skrýt %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "Skrýt..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Vlevo" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "Hudba" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "Žád&né" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "Seznam skladeb" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Ukončit" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "Režim opakování" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Vpravo" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "Režim míchání" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "Roztáhnout sloupce tak, aby se vešly do okna" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "Nástroje" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(liší se u jednotlivých písní)" #: ui/about.cpp:77 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:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "0 px" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 den" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 stopa" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "127.0.0.1" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "40%" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 náhodných skladeb" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "Povýšit na Premium" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "Vytvořit nový účet nebo nastavit heslo znovu" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "Je požadován účet Grooveshark Anywhere." #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "Je požadován účet Spotify Premium." #: ../bin/src/ui_networkremotesettingspage.h:189 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:78 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:153 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:297 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "VŠECHNU SLÁVU HYPNOŽÁBĚ" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "Přerušit" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "O %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "O Clementine..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "O Qt..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Podrobnosti o účtu" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "Podrobnosti k účtu (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Činnost" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Zapnout/Vypnout Wiiremote" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "Přidat podcast" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Přidat proud" #: ../bin/src/ui_notificationssettingspage.h:425 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:193 msgid "Add action" msgstr "Přidat činnost" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Přidat další proud..." #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Přidat složku..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "Přidat soubor" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "Přidat soubor k překódování" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "Přidat soubor(y) k překódování" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Přidat soubor..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Přidat soubory pro překódování" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Přidat složku" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Přidat složku..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Přidat novou složku..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "Přidat podcast" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "Přidat podcast..." #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Přidat hledaný výraz" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "Přidat značku album písně" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "Přidat značku umělec alba písně" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "Přidat značku umělec písně" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "Přidat automatický výsledek písně" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "Přidat značku skladatel písně" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "Přidat značku disk písně" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "Přidat název souboru písně" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "Přidat značku žánr písně" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "Přidat značku seskupení písně" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "Přidat značku délka písně" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "Přidat značku účinkující písně" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "Přidat počet přehrání písně" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "Přidat hodnocení písně" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "Přidat počet přeskočení písně" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "Přidat značku název písně" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "Přidat značku pořadí písně" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "Přidat značku rok písně" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Přidat proud..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "Přidat do oblíbených Grooveshark" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "Přidat do seznamu skladeb Grooveshark" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "Přidat do jiného seznamu skladeb" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Přidat do seznamu skladeb" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "Přidat do řady" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Přidat činnost wiimotedev" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Přidat..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Přidána tento měsíc" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Přidána tento týden" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Přidána tento rok" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Přidána dnes" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Přidána během tří měsíců" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "Přidává se píseň do Moje hudba" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "Přidává se píseň do oblíbených" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Pokročilé seskupování..." #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "Po " #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "Po zkopírování..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Album (ideální hlasitost pro všechny skladby)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Umělec alba" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "Obal alba" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Informace o albu na jamendo.com..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Alba s obaly" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Alba bez obalů" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Všechny soubory (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "Všechnu slávu hypnožábě!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Všechna alba" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Všichni umělci" #: ui/albumcoverchoicecontroller.cpp:47 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:74 msgid "All the translators" msgstr "Všichni překladatelé" #: library/library.cpp:84 msgid "All tracks" msgstr "Všechny skladby" #: ../bin/src/ui_networkremotesettingspage.h:194 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:196 msgid "Allow downloads" msgstr "Povolit stahování" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "Povolit kódování střed/kraj" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "Vedle původních" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Vždy skrýt hlavní okno" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Vždy zobrazit hlavní okno" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "Vždy začít přehrávat" #: internet/spotifyblobdownloader.cpp:60 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:61 msgid "An error occurred loading the iTunes database" msgstr "Při nahrávání databáze iTunes nastala chyba" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Při zápisu údajů do '%1' se vyskytla chyba" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "Vyskytla se neznámá chyba." #: ui/about.cpp:78 msgid "And:" msgstr "A:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "Rozlobená" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Vzhled" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Přidat soubory/adresy do seznamu skladeb" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "Přidat do současného seznamu skladeb" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "Přidat do seznamu skladeb" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "Použít kompresi, aby se zabránilo ořezávání zvuku (clippingu)" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Opravdu chcete smazat nastavení \"%1\"?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "Opravdu chcete smazat tento seznam skladeb?" #: ui/edittagdialog.cpp:769 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:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Umělec" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Umělec" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "Rádio umělce" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "Značky umělce" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "Iniciály umělce" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Zvukový formát" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Ověření selhalo" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "Autor" #: ui/about.cpp:65 msgid "Authors" msgstr "Autoři" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Automaticky" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Automatická aktualizace" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "Automaticky otevřít jednotlivé skupiny ve stromu sbírky" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "Dostupné" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "Průměrný datový tok" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "Průměrná velikost obrázku" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "Podcasty BBC" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "Proudy na pozadí" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Barva pozadí" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "Obrázek na pozadí" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Neprůhlednost pozadí" #: core/database.cpp:734 msgid "Backing up database" msgstr "Záloha databáze" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "Vyvážení" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Zakázat" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "Proužkový analyzátor" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Jednoduchá modrá" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "Základní typ zvuku" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Chování" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "Nejlepší" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "Životopis od %1" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Datový tok" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "Datový tok" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "Blokový analyzátor" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "Typ bloku" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "Velikost rozmazání" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "Tělo" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "Růstový analyzátor" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "Krabice" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Procházet…" #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "Délka vyrovnávací paměti" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "Ukládá se do vyrovnávací paměti" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "Ale tyto zdroje jsou zakázány:" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Tlačítka" #: core/song.cpp:339 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "Podpora pro list CUE" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "Zrušit" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Změnit obal" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Změnit velikost písma..." #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "Změnit režim opakování" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Změnit klávesovou zkratku..." #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "Změnit režim míchání" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Změnit jazyk" #: ../bin/src/ui_playbacksettingspage.h:330 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:228 msgid "Check for new episodes" msgstr "Podívat se po nových dílech" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Zkontrolovat aktualizace" #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "Vyberte název pro svůj chytrý seznam skladeb" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Vybrat automaticky" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Vybrat barvu..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "Vybrat písmo..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Vybrat ze seznamu" #: smartplaylists/querywizardplugin.cpp:155 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í." #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "Vyberte adresář pro stahžení podcastu" #: ../bin/src/ui_songinfosettingspage.h:188 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:115 msgid "Classical" msgstr "Klasická" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "Úklid" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Smazat" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Vyprázdnit seznam skladeb" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Chyba Clemetine" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Mandarinka klementina" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Vizualizace Clementine" #: ../bin/src/ui_deviceproperties.h:376 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_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine může přehrávat hudbu nahranou vámi do krabice" #: ../bin/src/ui_dropboxsettingspage.h:104 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:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine může přehrávat hudbu vámi nahranou na Google Drive" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "Clementine umí přehrát hudbu nahranou vámi do Ubuntu One" #: ../bin/src/ui_notificationssettingspage.h:431 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:250 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 předplatným s dalšími počítači a programy pro podcasty. Vytvořit účet." #: visualisations/projectmvisualisation.cpp:128 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ě." #: internet/lastfmsettingspage.cpp:110 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 "Clementine se nepodařilo natáhnout vaše předplatné, protože s vaším připojením jsou potíže. Přehrávané skladby se budou ukládat do vyrovnávací paměti a Last.fm budou poslány později." #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Prohlížeč obrázků pro Clementine" #: ../bin/src/ui_trackselectiondialog.h:206 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:210 msgid "Clementine will find music in:" msgstr "Clementine bude hledat hudbu v:" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Klepněte sem pro přidání nějaké hudby" #: playlist/playlisttabbar.cpp:293 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:72 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_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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 prohlížeč internetových stránek. Poté, co jste se přihlásili, se vraťte do Clementine." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Zavřít" #: playlist/playlisttabbar.cpp:54 msgid "Close playlist" msgstr "Zavřít seznam skladeb" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "Zavřít vizualizaci" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "Zavření tohoto okna zruší stahování." #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "Zavření tohoto okna zastaví hledání obalů alb." #: ui/equalizer.cpp:116 msgid "Club" msgstr "Klub" #: ../bin/src/ui_appearancesettingspage.h:272 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:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Poznámka" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "Doplnit značky automaticky" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "Doplnit značky automaticky..." #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Skladatel" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "Nastavit %1..." #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "Nastavit Grooveshark..." #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Nastavit Last.fm..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "Nastavit Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Nastavit klávesové zkratky" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "Nastavit Spotify..." #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "Nastavit Subsonic..." #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "Nastavit celkové hledání:" #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "Nastavit sbírku..." #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "Nastavit podcasty..." #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "Nastavit..." #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "Připojit dálkový ovladač Wii pomocí činnosti zapnout/vypnout" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "Připojit zařízení" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "Připojuje se k Spotify" #: internet/subsonicsettingspage.cpp:107 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/subsonicsettingspage.cpp:117 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/" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "Konzole" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "Stálý datový tok" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "Převést všechnu hudbu" #: ../bin/src/ui_deviceproperties.h:378 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" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "Kopírovat do schránky" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Zkopírovat do zařízení..." #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Zkopírovat do sbírky..." #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "Autorské právo" #: internet/subsonicsettingspage.cpp:81 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:64 #, 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" #: transcoder/transcoder.cpp:432 #, 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:426 #, 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/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "Rádio last.fm se nepodařilo načíst" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "Nepodařilo se otevřít výstupní soubor %1" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Správce obalů" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "Obal z vloženého obrázku" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Obal nahraný automaticky z %1" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "Obal zrušený ručně" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "Obal nenastaven" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "Obal nastaven z %1" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "Obaly od %1" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "Vytvořit nový seznam skladeb Grooveshark" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "Prolínání při automatické změně skladby" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "Prolínání při ruční změně skladby" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "Vlastní" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "Vlastní obrázek:" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "Nastavení vlastní zprávy" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "Vlastní rádio" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Vlastní..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "Cesta k DBus" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Taneční hudba" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Datum vytvoření" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Datum změny" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "Dny" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "&Výchozí" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "Snížit hlasitost o 4%" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "Snížit hlasitost o procent" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Snížit hlasitost" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "Výchozí obrázek na pozadí" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "Výchozí" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "Prodleva mezi vizualizacemi" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "Smazat" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "Smazat seznam skladeb Grooveshark" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "Smazat stažená data" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Smazat soubory" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Smazat ze zařízení..." #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Smazat z disku..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "Smazat přehrané díly" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "Smazat předvolbu" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "Smazat chytrý seznam skladeb" #: ../bin/src/ui_organisedialog.h:194 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:1363 msgid "Dequeue selected tracks" msgstr "Odstranit vybrané skladby z řady" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "Odstranit skladbu z řady" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Cíl" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Podrobnosti..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Zařízení" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Vlastnosti zařízení" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Název zařízení" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Vlastnosti zařízení..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Zařízení" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Mysleli jste" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "Heslo k Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "Uživatelské jméno u Digitally Imported" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "Přímé připojení k internetu" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Složka" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "Zakázat délku" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "Zakázat tvoření náladového proužku" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Zakázáno" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Disk" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "Nesouvislý přenos" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 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:715 msgid "Do a full library rescan" msgstr "Znovu kompletně prohledat sbírku" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "Nepřevádět žádnou hudbu" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "Nepřepisovat" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Neopakovat" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "Nezobrazovat pod různými umělci" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "Nemíchat" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "Nezastavovat!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "Darovat" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Klepnout dvakrát pro otevření" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "Dvojité klepnutí na píseň..." #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "Stáhnout %n dílů" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "Stáhnout složku" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "Stáhnout díly do" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "Stáhnout členství" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "Stáhnout nové díly automaticky" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "Stahování zařazeno" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "Stáhnout aplikaci Android" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Stáhnout toto album" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Stáhnout toto album..." #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "Stáhnout tento díl" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "Stáhnout..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "Stahuje se (%1%)..." #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "Stahuje se adresář Icecast" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "Stahuje se katalog Jamendo" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "Stahuje se katalog Magnatune" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "Stahuje se přídavný modul Spotify" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "Stahují se metadata" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "Tažením přemístěte" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "Dropbox" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "Je zapnut dynamický režim" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "Dynamický náhodný výběr" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "Upravit chytrý seznam skladeb..." #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Upravit značku \"%1\"..." #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "Upravit značku..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "Upravit značky" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Upravit informace o skladbě" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "Upravit informace o skladbě..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Upravit informace o skladbách..." #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Upravit..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "Povolit podporu dálkového ovládání Wii" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "Povolit ekvalizér" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "Povolit zkratky jen když je Clementine zaměřen" #: ../bin/src/ui_globalsearchsettingspage.h:147 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:62 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:235 msgid "Encoding complexity" msgstr "Složitost kódování" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "Kvalita kódovacího stroje" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "Režim kódování" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "Zadejte adresu (URL)" #: ../bin/src/ui_coverfromurldialog.h:103 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:205 msgid "Enter a filename for exported covers (no extension):" msgstr "Zadejte souborový název pro uložené obaly (bez přípony):" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "Zadejte název tohoto seznamu skladeb" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Zadejte umělce nebo značku pro zahájení poslechu rádia Last.fm." #: ../bin/src/ui_globalsearchview.h:209 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:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Zadejte hledané výrazy pro nalezení podcastů v obchodu iTunes" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Zadejte hledané výrazy pro nalezení podcastů na gpodder.net" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "Zde zadejte hledané výrazy" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "Zadejte adresu (URL) proudu internetového rádia:" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "Zadejte název složky" #: ../bin/src/ui_networkremotesettingspage.h:198 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:87 msgid "Entire collection" msgstr "Celá sbírka" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Chyba" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Chyba při připojování zařízení MTP" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "Chyba při kopírování písní" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "Chyba při mazání písní" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "Chyba při stahování přídavného modulu Spotify" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "Chyba při nahrávání %1" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Chyba při nahrávání seznamu skladeb di.fm" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "Chyba při zpracovávání %1: %2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "Chyba při nahrávání zvukového CD" #: library/library.cpp:63 msgid "Ever played" msgstr "Přehrané skladby" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "Každých 10 minut" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "Každých 12 hodin" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "Každé 2 hodiny" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "Každých 20 minut" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "Každých 30 minut" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "Každých 6 hodin" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "Každou hodinu" #: ../bin/src/ui_playbacksettingspage.h:303 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:208 msgid "Existing covers" msgstr "Stávající obaly" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "Rozbalit" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "Vyprší %1" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "Uložit obaly" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "Uložit obaly" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "Uložit stažené obaly" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "Uložit vložené obaly" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "Uložení dokončeno" #: ui/albumcovermanager.cpp:786 #, 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:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 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:300 msgid "Fade out when stopping a track" msgstr "Zeslabit při zastavování skladby" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "Slábnutí" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "Doba slábnutí" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "Nepodařilo se natáhnout adresář" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "Nepodařilo se natáhnout podcasty" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "Nepodařilo se nahrát podcast" #: podcasts/podcasturlloader.cpp:167 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:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "Rychlý" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "Oblíbené" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "Oblíbené skladby" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "Stáhnout chybějící obaly" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "Stáhnout automaticky" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "Stahování dokončeno" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "Natahuje se knihovna Subsonic" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Chyba při stahování obalu" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "Přípona souboru" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "Formáty souborů" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Název souboru" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "Název souboru bez cesty" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Velikost souboru" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Typ souboru" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Název souboru" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Soubory" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "Soubory k překódování" #: smartplaylists/querywizardplugin.cpp:90 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." #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "Určení písně" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "Dokončit" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "První úroveň" #: core/song.cpp:328 msgid "Flac" msgstr "FLAC" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Velikost písma" #: ../bin/src/ui_spotifysettingspage.h:213 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:204 msgid "Force mono encoding" msgstr "Vynutit jednokanálové kódování" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "Zapomenout zařízení" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Formulář" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "Formát" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Počet snímků" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "Snímků na vyrovnávací paměť" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Přátelé" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "Zmrzlá" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Plné basy" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "Plné basy + výšky" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "Plné výšky" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "Zvukový systém GStreamer" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "Obecné" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Obecná nastavení" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Žánr" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "Získat adresu pro sdílení tohoto seznamu skladeb Grooveshark" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "Získat adresu pro sdílení této písně Grooveshark" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "Získávají se oblíbené písně Grooveshark" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "Získávají se kanály" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "Získávají se proudy" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "Pojmenujte to:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "Jít" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "Jít na další kartu seznamu skladeb" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "Jít na předchozí kartu seznamu skladeb" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, 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:206 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_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "Chyba přihlášení Grooveshark" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "Adresa Grooveshark" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "Rádio Grooveshark" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "Adresa písně Grooveshark" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "Seskupovat v hudební sbírce podle..." #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "Seskupovat podle" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "Seskupovat podle alba" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "Seskupovat podle umělce" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "Seskupovat podle umělce/alba" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "Seskupovat podle umělce/roku - alba" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "Seskupovat podle žánru/alba" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "Seskupovat podle žánru/umělce/alba" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "Seskupení" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "Stránka HTML neobsahuje žádný kanál RSS" #: internet/subsonicsettingspage.cpp:135 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:163 msgid "HTTP proxy" msgstr "Proxy HTTP" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "Šťastná" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "Informace o vybavení" #: ../bin/src/ui_deviceproperties.h:372 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:202 msgid "High" msgstr "Vysoká" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "Vysoký (%1 fps)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "Vysoké (1024x1024)" #: internet/subsonicsettingspage.cpp:112 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:310 msgid "Hours" msgstr "Hodiny" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "Hypnožába" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "U Magnatune nemám účet" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Ikona" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "Ikony nahoře" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "Určuje se píseň" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 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:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Pokud znáte adresu (URL) podcastu, zadejte ji níže a stiskněte Jít." #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "Nevšímat si 'The' ve jménech umělců" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Obrázky (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "Za %1 dny(ů)" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "Za %1 týdny(ů)" #: ../bin/src/ui_wizardfinishpage.h:86 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/spotifyservice.cpp:360 msgid "Inbox" msgstr "Doručená pošta" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "Zahrnout obal alba do oznámení" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "Zahrnout všechny písně" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Nevhodná verze protokolu Subsonic REST. Klient se musí zaktualizovat." #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Nevhodná verze protokolu Subsonic REST. Server se musí zaktualizovat." #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Neúplné nastavení. Zajistěte se, prosím, že jsou všechna pole vyplněna." #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "Zvýšit hlasitost o 4 %" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "Zvýšit hlasitost o procent" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Zvýšit hlasitost" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "Rejstříkování %1" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "Informace" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "Vložit..." #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Nainstalován" #: core/database.cpp:673 msgid "Integrity check" msgstr "Ověření celistvosti" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "Internetoví poskytovatelé" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "Neplatný klíč API" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Neplatný formát" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "Neplatná metoda" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "Neplatné parametry" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "Zadán neplatný zdroj" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "Neplatná služba" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "Neplatný klíč sezení" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "Neplatné uživatelské jméno a/nebo heslo" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "Nejposlouchanější skladby na Jamendu" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "Nejlepší skladby na Jamendu" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "Nejlepší skladby měsíce na Jamendu" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "Nejlepší skladby týdne na Jamendu" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "Databáze Jamendo" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "Skočit na nyní přehrávanou skladbu" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Držet tlačítka po %1 sekundy..." #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Držet tlačítka po %1 sekund..." #: ../bin/src/ui_behavioursettingspage.h:193 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:193 msgid "Keep the original files" msgstr "Zachovat původní soubory" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "Koťátka" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Jazyk" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "Přenosný počítač/Sluchátka" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Velký sál" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "Velký obal alba" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "Velký postranní panel" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "Naposledy hrané" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "Vlastní rádio Last.fm: %1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Hudební sbírka Last.fm - %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "Rádio Mix Last.fm - %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Rádio sousedů na Last.fm - %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Rádio Last.fm - %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Podobný umělec Last.fm jako %1" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Rádio na Last.fm označené: %1" #: internet/lastfmservice.cpp:437 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:154 msgid "Last.fm password" msgstr "Heslo k Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "Počty přehrání na Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Značky Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Uživatelské jméno k Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Wiki pro Last.fm" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "Nejméně oblíbené skladby" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "Pro výchozí nastavení ponechte prázdné. Příklady: \"/dev/dsp\", \"front\", atd." #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "Vlevo" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Délka" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Sbírka" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "Pokročilé seskupování sbírky" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "Zpráva o prohledání sbírky" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "Hledání ve sbírce" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Omezení" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "Poslouchejte písně Grooveshark na základě toho, co jste poslouchali předtím" #: ui/equalizer.cpp:123 msgid "Live" msgstr "Živě" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Načíst" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "Nahrát obal z adresy (URL)" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "Nahrát obal z adresy (URL)..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "Nahrát obal z disku" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "Nahrát obal na disku..." #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "Nahrát seznam skladeb" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "Nahrát seznam skladeb..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Nahrává se rádio Last.fm" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Nahrává se zařízení MTP" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "Nahrává se databáze iPod" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "Nahrává se chytrý seznam skladeb" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "Nahrávají se písně" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "Nahrává se proud" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "Nahrávají se skladby" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "Nahrávají se informace o skladbě" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "Nahrává se..." #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "Nahraje soubory/adresy (URL), nahradí současný seznam skladeb" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Přihlášení" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "Přihlášení se nezdařilo" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "Dlouhodobý předpověďní profil" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "Oblíbit" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Nízký (%1 fps)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "Nízké (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "Nízkosložitostní profil" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "Texty písní" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "Texty písní z %1" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Stahování z Magnatune" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Stahování z Magnatune bylo dokončeno" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "Hlavní profil" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "Udělej to tak!" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "Zajistit, že seznam skladeb bude dostupný, i když počítač nebude připojen k internetu" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "Poškozená odpověď" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "Ruční nastavení proxy" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "Ručně" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "Výrobce" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "Označit jako poslechnuté" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "Označit jako nové" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "Porovnat všechny hledané výrazy (AND)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "Porovnat jeden nebo více hledaných výrazů (OR)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "Nejvyšší datový tok" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "Střední (%1 fps)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "Střední (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "Druh členství" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "Nejnižší datový tok" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "Chybí přednastavení projectM" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "Model" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "Sledovat změny ve sbírce" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "Jednokanálové přehrávání" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "Měsíce" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "Nálada" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "Styl náladového proužku" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "Náladové proužky" #: library/library.cpp:74 msgid "Most played" msgstr "Nejvíce hráno" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "Přípojný bod" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "Přípojné body" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "Posunout dolů" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "Přesunout do sbírky..." #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "Posunout nahoru" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "Hudba" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Hudební sbírka" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "Ztlumit" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "Moje sbírka Last.fm" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "Moje rádio Mix Last.fm" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "Moje okolí Last.fm" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "Moje doporučované rádio Last.fm" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "Moje rádio Mix" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "Moje hudba" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "Moje okolí" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "Mé rádio" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "Má doporučení" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Název" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "Volby pro pojmenování" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "Úzké pásmo" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "Sousedé" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "Síť" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "Síťová proxy" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "Síťové vzdálené ovládání" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "Nikdy" #: library/library.cpp:67 msgid "Never played" msgstr "Nikdy nehráno" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "Nikdy nezačít přehrávání" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "Nová složka" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "Nový seznam skladeb" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "Nový chytrý seznam skladeb..." #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "Nové písně" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "Nové písně budou přidány automaticky." #: library/library.cpp:80 msgid "Newest tracks" msgstr "Nejnovější skladby" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "Další" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Další skladba" #: core/utilities.cpp:147 msgid "Next week" msgstr "Příští týden" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "Žádný analyzátor" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "Žádný obrázek na pozadí" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "Žádné obaly k uložení" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "Žádné dlouhé bloky" #: playlist/playlistcontainer.cpp:366 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:145 msgid "No short blocks" msgstr "Žádné krátké bloky" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "Žádná" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 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:155 msgid "Normal" msgstr "Normální" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "Běžný typ bloku" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "Není dostupné během používání dynamického seznamu skladeb" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "Nepřipojeno" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "Nedostatek obsahu" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "Nedostatek nadšených obdivovatelů" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "Nedostatek členů" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "Nedostatek sousedů" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Nenainstalován" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "Nepřihlášen" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "Nepřipojeno - dvojitým klepnutím připojíte" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "Druh oznámení" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Oznámení" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Právě se přehrává" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "Náhled OSD" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Ogg FLAC" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "Neprůhlednost" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "Otevřít %1 v prohlížeči" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "Otevřít &zvukové CD..." #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "Otevřít soubor OPML" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "Otevřít soubor OPML..." #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "Otevřít zařízení" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "Otevřít soubor" #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "Otevřít v Google Drive" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "Otevřít v novém seznamu skladeb" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Otevřít..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "Operace se nezdařila" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "Optimalizovat s ohledem na datový tok" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "Optimalizovat s ohledem na kvalitu" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "Volby..." #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "Uspořádat soubory" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "Uspořádat soubory..." #: core/organise.cpp:65 msgid "Organising files" msgstr "Uspořádávají se soubory" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "Původní značky" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Další volby" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "Výstup" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "Výstupní zařízení" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "Možnosti výstupu" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "Výstupní modul" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "Přepsat vše" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "Přepsat existující soubory" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "Přepsat pouze menší" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "Vlastník" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "Zpracovává se katalog pro Jamendo" #: ui/equalizer.cpp:124 msgid "Party" msgstr "Oslava" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "Heslo" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Pozastavit" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "Pozastavit přehrávání" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Pozastaveno" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "Účinkující" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "Pixel" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "Prostý postranní panel" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Přehrát" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "Přehrát umělce nebo značku" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "Přehrát rádio umělce..." #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "Počet přehrání" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "Přehrát vlastní rádio..." #: core/commandlineoptions.cpp:152 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:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "Hrát, pokud se již něco nepřehrává" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "Přehrávat rádio se značkou..." #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "Přehrát . skladbu v seznamu se skladbami" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "Přehrát/Pozastavit" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Přehrávání" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Nastavení přehrávače" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "Seznam skladeb" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "Seznam skladeb dokončen" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "Nastavení seznamu skladeb" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "Typ seznamu skladeb" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "Seznamy skladeb" #: ../data/oauthsuccess.html:36 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:214 msgid "Plugin status:" msgstr "Stav přídavného modulu:" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "Podcasty" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Pop" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "Oblíbené písně" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "Oblíbené písně měsíce" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "Oblíbené písně dnes" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "Doba zobrazení oznámení" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "Port" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "Předzesílení" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "Nastavení" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "Nastavení..." #: ../bin/src/ui_librarysettingspage.h:202 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:167 msgid "Preferred audio format" msgstr "Upřednostňovaný zvukový formát" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "Upřednostňovaný datový tok" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "Upřednostňovaný formát" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "Typ zvuku Premium" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "Předvolba:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "Stiskněte klávesovou zkratku, která se použije pro" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "Stiskněte klávesu" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, 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_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "Možnosti vzhledu OSD" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "Náhled" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "Předchozí" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 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:131 msgid "Profile" msgstr "Profil" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "Průběh" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 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:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "Kvalita" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "Dotazování se zařízení..." #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "Správce řady" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "Přidat vybrané skladby do řady" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "Přidat skladbu do řady" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "Rádio (shodná hlasitost pro všechny skladby)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "Rádia" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "Déšť" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "Náhodná vizualizace" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "Ohodnotit současnou píseň nulou hvězdiček" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "Ohodnotit současnou píseň jednou hvězdičkou" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "Ohodnotit současnou píseň dvěma hvězdičkami" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "Ohodnotit současnou píseň třemi hvězdičkami" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "Ohodnotit současnou píseň čtyřmi hvězdičkami" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "Ohodnotit současnou píseň pěti hvězdičkami" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "Hodnocení" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "Opravdu zrušit?" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "Krajní mez na přesměrování překročena, ověřte nastavení serveru." #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "Obnovit" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "Obnovit katalog" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "Obnovit kanály" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "Obnovit seznam přátel" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "Obnovit seznam stanic" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "Obnovit proudy" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Reggae" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "Zapamatovat si výkyv vzdáleného ovládání Wii" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "Obnovit předchozí stav" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Odstranit" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "Odstranit činnost" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "Odstranit zdvojené ze seznamu skladeb" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "Odstranit složku" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "Odstranit z Moje hudba" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "Odstranit z oblíbených" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "Odstranit ze seznamu skladeb" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "Odstranit seznam skladeb" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "Odstranit seznamy skladeb" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "Odstraňují se písně z Moje hudba" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "Odstraňují se písně z oblíbených" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "Přejmenovat \"%1\" seznam skladeb" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "Přejmenovat seznam skladeb Grooveshark" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "Přejmenovat seznam skladeb" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "Přejmenovat seznam skladeb..." #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "Přečíslovat skladby v tomto pořadí..." #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Opakovat" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "Opakovat album" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "Opakovat seznam skladeb" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "Opakovat skladbu" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Nahradit současný seznam skladeb" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "Nahradit seznam skladeb" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "Nahradí mezery podtržítky" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "Zesílení přehrávaných skladeb" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "Režim zesílení přehrávaných skladeb" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "Znovu zaplnit" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "Vyžadovat ověřovací kód" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "Obnovit výchozí" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" msgstr "Vynulovat počty přehrání" #: 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:206 msgid "Restrict to ASCII characters" msgstr "Omezit na znaky &ASCII" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "Obnovit přehrávání při spuštění" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "Získávají se písně Moje hudba z Grooveshark" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "Získávají se oblíbené písně z Grooveshark" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "Získávají se seznamy skladeb z Grooveshark" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "Návrat do Clementine" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "Vpravo" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "Spustit" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "Proxy SOCKS" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "Chyba u SSL, ověřte nastavení serveru. Volba SSLv3 níže může některé potíže dočasně vyřešit." #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "Bezpečně odebrat zařízení" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "Po dokončení kopírování bezpečně odebrat zařízení" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "Vzorkovací kmitočet" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "Vzorkovací frekvence" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "Uložit soubory .mood v hudební sbírce" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "Uložit obal alba" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "Uložit obal na disk..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "Uložit obrázek" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "Uložit seznam skladeb" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "Uložit seznam skladeb..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "Uložit předvolbu" #: ../bin/src/ui_librarysettingspage.h:193 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:197 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:115 msgid "Save this stream in the Internet tab" msgstr "Uložit tento proud na kartě Internet" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "Ukládání statistiky písní do souborů písní" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "Ukládají se skladby" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "Profil škálovatelného vzorkovacího kmitočtu" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "Velikost měřítka" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "Výsledek" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "Odesílat informace o přehrávaných skladbách." #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "Hledat" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "Hledat stanice s Icecastem" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "Hledat na Jamendu" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Hledat na Magnatune" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "Vyhledat Subsonic" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "Hledat obaly alb..." #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "Hledat vše" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "Hledat na gpodder.net" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "Hledat na iTunes" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "Režim vyhledávání" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "Možnosti vyhledávání" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "Hledat výsledky" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "Hledané výrazy" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "Hledá se na Grooveshark" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "Druhá úroveň" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "Přetočit zpět" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "Přetočit vpřed" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "Přetočit v nyní přehrávané skladbě" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "Skočit v nyní přehrávané skladbě na určité místo" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "Vybrat vše" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "Nevybrat žádnou skladbu" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "Vybrat barvu pozadí:" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "Vybrat obrázek na pozadí" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "Vyberte nejlepší možnou shodu" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "Vybrat barvu popředí:" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "Vybrat vizualizace" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "Vybrat vizualizace..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "Sériové číslo" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "Adresa serveru (URL)" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "Podrobnosti o serveru" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "Služba není dostupná" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Nastavit %1 na \"%2\"..." #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "Nastavit hlasitost na procent" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "Nastavit hodnotu pro vybrané skladby..." #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "Nastavení" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Klávesová zkratka" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "Klávesová zkratka pro %1" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Klávesová zkratka pro %1 již existuje" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Ukázat" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "Ukázat OSD" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "Ukazovat zářící animaci nyní přehrávané skladby" #: ../bin/src/ui_appearancesettingspage.h:293 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:434 msgid "Show a native desktop notification" msgstr "Ukazovat systémová oznámení" #: ../bin/src/ui_notificationssettingspage.h:442 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:441 msgid "Show a notification when I change the volume" msgstr "Zobrazovat oznámení při změně hlasitosti" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "Ukazovat okno vyskakující z oznamovací části panelu" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "Ukazovat OSD" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "Ukazovat nad stavovým řádkem" #: ui/mainwindow.cpp:460 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:209 msgid "Show cover art in library" msgstr "Ukazovat obal ve sbírce" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "Ukazovat oddělovače" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "Ukázat v plné velikosti..." #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "Ukázat v prohlížeči souborů..." #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "Ukázat pod různými umělci" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "Ukázat náladový proužek" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "Ukázat pouze zdvojené" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "Ukázat pouze neoznačené" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "Ukázat návrhy hledání" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "Ukazovat tlačítka \"Oblíbit\" a \"Zakázat\"" #: ../bin/src/ui_lastfmsettingspage.h:158 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:192 msgid "Show tray icon" msgstr "Ukazovat ikonu v oznamovací oblasti" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "Ukázat, které zdroje jsou povoleny a které zakázány" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "Ukázat/Skrýt" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Zamíchat" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "Zamíchat alba" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "Zamíchat vše" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "Zamíchat seznam skladeb" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "Zamíchat skladby na tomto albu" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "Přihlásit se" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "Odhlásit" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "Přihlašuje se..." #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "Podobní umělci" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "Velikost" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "Velikost:" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "Předchozí skladba v seznamu skladeb" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "Počet přeskočení" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "Další skladba v seznamu skladeb" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "Malý obal alba" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "Malý postranní panel" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "Chytrý seznam skladeb" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "Chytré seznamy skladeb" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Měkké" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "Soft rock" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "Informace o písni" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "Píseň" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "Sonogram" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "Promiňte" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "Řadit podle žánru (abecedně)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "Řadit podle žánru (podle oblíbenosti)" #: ../bin/src/ui_icecastfilterwidget.h:77 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í" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "Zdroj" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "Zdroje" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "Chyba přihlášení k Spotify" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "Přídavný modul Spotify" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "Přídavný modul Spotify není nainstalován" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "Obvyklý" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "S hvězdičkou" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "Přehrát současnou skladbu v seznamu skladeb" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "Převést" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 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:405 #, qt-format msgid "Starting %1" msgstr "Spouští se %1" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "Spouští se..." #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "Stanice" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Zastavit" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "Zastavit po" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "Zastavit po této skladbě" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Zastavit přehrávání" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "Zastavit po současné skladbě" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "Zastaveno" #: core/song.cpp:341 msgid "Stream" msgstr "Proud" #: internet/subsonicsettingspage.cpp:30 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:160 msgid "Streaming membership" msgstr "bez stahování (pouze přehrávání)" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "Odebírané seznamy skladeb" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "Předplatitelé" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "Úspěch" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "%1 úspěšně zapsán" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "Navrhované značky" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "Shrnutí" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "Nadmíru vysoké (%1 fps)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "Hodně velké (2048x2048)" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "Podporované formáty" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "Seřídit statistiky se soubory nyní" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "Synchronizuje se schránka Spotify" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "Synchronizuje se seznam skladeb Spotify" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "Synchronizují se skladby označené hvězdičkou na Spotify" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "Systémové barvy" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "Karty nahoře" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Značka" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "Stahování značek" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "Rádio se značkou" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "Cílový datový tok" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "Volby pro text" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Poděkování" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Příkaz \"%1\" se nepodařilo provést." #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "Obal alba nyní přehrávané písně" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "Adresář \"%1\" je neplatný" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "Seznam skladeb \"%1\" je prázdný, nebo se jej nepodařilo nahrát." #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "Požadovaná stránka není obrázek!" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "Na tomto albu jsou další písně" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "Nastaly potíže se spojením s gpodder.net" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Při stahování metadat z Magnatune se vyskytly potíže." #: podcasts/itunessearchpage.cpp:76 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:56 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:389 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:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 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:187 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:174 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:151 msgid "Third level" msgstr "Třetí úroveň" #: internet/jamendoservice.cpp:171 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/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "Album není v požadovaném formátu dostupné" #: ../bin/src/ui_deviceproperties.h:381 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:375 msgid "This device supports the following file formats:" msgstr "Toto zařízení podporuje následující formáty souborů:" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Toto zařízení nebude pracovat správně" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Tuto volbu lze změnit v nastavení Chování" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "Tento proud je pouze pro předplatitele" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "Tento typ zařízení není podporován: %1" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "Časové omezení" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Název" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "Abyste začali poslouchat rádio Grooveshark, měli byste si nejprve poslechnout několik jiných písní Grooveshark" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "Dnes" #: core/globalshortcuts.cpp:59 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:1369 msgid "Toggle queue status" msgstr "Přepnout stav řady" #: ../bin/src/ui_mainwindow.h:718 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:143 msgid "Tomorrow" msgstr "Zítra" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "Příliš mnoho přesměrování" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "Nejlepší skladby" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "Alb celkem:" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "Celkem přeneseno bajtů" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "Celkem uskutečněno síťových požadavků" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Skladba" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "Převést hudbu" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "Záznam o převodu" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "Překódování" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Převádí se %1 souborů s %2 procesy" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "Volby překódování" #: core/song.cpp:338 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "Turbína" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "Vypnout" #: devices/giolister.cpp:161 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "Adresa (URL)" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "Heslo k Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "Uživatelské jméno pro Ubuntu One" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "Ultra široké pásmo" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Nepodařilo se stáhnout %1 (%2)" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Neznámý" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "Neznámý typ obsahu" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Neznámá chyba" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "Odebrat obal" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "Zrušit odběr" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "Připravované koncerty" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "Obnovit seznam skladeb Grooveshark" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "Obnovit všechny podcasty" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "Obnovit změněné složky sbírky" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "Při spuštění Clementine obnovit hudební sbírku" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "Obnovit tento podcast" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "Obnovuje se" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Obnovuje se %1" #: devices/deviceview.cpp:103 #, 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:150 msgid "Usage" msgstr "Zacházení" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "Použít značku Umělec alba, když je dostupná" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "Používat klávesové zkratky GNOME" #: ../bin/src/ui_playbacksettingspage.h:310 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:129 msgid "Use SSLv3" msgstr "Použít SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "Použít dálkové ovládání Wii" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "Použít vlastní sadu barev:" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "Použít vlastní zprávu pro oznámení" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "Použít síťové vzdálené ovládání" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "Použít ověření" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "Použít stroj na správu datového toku" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "Použít dynamický režim" #: ../bin/src/ui_wiimotesettingspage.h:188 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:139 msgid "Use temporal noise shaping" msgstr "Použít časové tvarování šumu" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "Použít výchozí nastavení systému" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "Použít systémovou výchozí sadu barev:" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "Použít systémové nastavení proxy" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "Použít normalizaci hlasitosti" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "Použito" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "Uživatel %1 nemá účet Grooveshark Anywhere" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "Uživatelské rozhraní" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Uživatelské jméno" #: ../bin/src/ui_behavioursettingspage.h:207 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:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "Proměnlivý datový tok MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "Proměnlivý datový tok" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "Různí umělci" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "Verze %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "Pohled" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "Režim vizualizací" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "Vizualizace" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "Nastavení vizualizací" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "Zjištění hlasové činnosti" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "Hlasitost %1 %" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "Varovat při zavření karty se seznamem skladeb" #: core/song.cpp:337 msgid "Wav" msgstr "WAV" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "Stránky" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "Týdny" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "Při spuštění Clementine" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "Když je seznam prázdný..." #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "Proč nezkusit" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "Široké pásmo" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii Remote %1: zapnuto" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii Remote %1: připojeno" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii Remote %1: vážný stav baterie (%2%) " #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii Remote %1: vypnuto" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii Remote %1: odpojeno" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Remote %1: nízká hladina baterie (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "Windows Media Audio" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "Bez obalu:" #: library/libraryview.cpp:530 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:2088 msgid "Would you like to run a full rescan right now?" msgstr "Chcete spustit toto úplné nové prohledání hned teď?" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "Zapsat všechny statistiky písní do souborů písní" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "Nesprávné uživatelské jméno nebo heslo." #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "Rok" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "Rok - Album" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "Roky" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "Včera" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "Chystáte se stáhnout následující alba" #: playlist/playlistlistcontainer.cpp:311 #, 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 jistý?" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "Nejste přihlášen." #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "Jste přihlášen jako %1." #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "Jste přihlášen." #: ../bin/src/ui_groupbydialog.h:123 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/digitallyimportedsettingspage.cpp:46 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/magnatunesettingspage.cpp:53 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:57 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." #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "Statistické funkce Last.fm je možné používat zdarma. Poslouchání rádia je však přístupné pouze předplatitelům." #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "Nemáte účet Grooveshark Anywhere." #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Nemáte účet Spotify Premium." #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "Nemáte aktivní předplatné" #: internet/spotifyservice.cpp:170 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/spotifysettingspage.cpp:158 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:87 msgid "You love this track" msgstr "Tato skladba patří mezi vaše oblíbené" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" 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 zapnout \"Povolit přístup pro podpůrná zařízení\"." #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "Pokud změníte jazyk, budete muset Clementine spustit znovu." #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "Nebudete moci přehrávat rádiové stanice Last.fm, protože nejste předplatitelem Last.fm." #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "Vaše adresa IP:" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Vaše přihlašovací údaje k Last.fm byly nesprávné" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "Vaše přihlašovací údaje k Magnatune byly nesprávné" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "Vaše hudební sbírka je prázdná!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "Vaše rozhlasové proudy" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "Váš počet přehrání: %1" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Ve vašem systém chybí podpora pro OpenGL. Vizualizace jsou nedostupné." #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "Uživatelské jméno nebo heslo bylo nesprávné." #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Vynulovat" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "přidat %n písní" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "po" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "před" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "a" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "automaticky" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "před" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "mezi" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "nejprve největší" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "obsahuje" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "zakázáno" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "disk %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "neobsahuje" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "končí na" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "rovná se" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "gpodder.net" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "Adresář pro gpodder.net" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "větší než" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "za posledních" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "kb/s" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "méně než" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "nejprve nejdelší" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "Přesunout %n písní" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "nejprve nejnovější" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "nerovná se" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "ne za posledních" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "ne na" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "nejprve nejstarší" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "Na" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "volby" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "nebo sejmout QRkód!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "stiskněte Enter" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "odstranit %n písní" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "nejprve nejkratší" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "Zamíchat písně" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "nejprve nejmenší" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "Třídit písně" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "začíná na" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "zastavit" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "skladba %1" clementine-1.2.0+dfsg/src/translations/cy.po000066400000000000000000003605571223327513400210610ustar00rootroot00000000000000# 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" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:08+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Welsh (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr "" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "" #: podcasts/gpoddersync.cpp:79 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "" #: playlist/playlistmanager.cpp:413 #, qt-format msgid "%1 selected of" msgstr "" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, qt-format msgid "%L1 other listeners" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "" #: transcoder/transcodedialog.cpp:192 #, c-format msgid "%n remaining" msgstr "" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "&Custom" msgstr "" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "" #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "" #: core/utilities.cpp:108 msgid "1 day" msgstr "" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "" #: library/library.cpp:60 msgid "50 random tracks" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "" #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:78 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:153 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "A-Z" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "" #: core/song.cpp:336 msgid "AIFF" msgstr "" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "" #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "" #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "" #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "" #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "" #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "" #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "" #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "" #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "" #: ui/about.cpp:74 msgid "All the translators" msgstr "" #: library/library.cpp:84 msgid "All tracks" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "" #: internet/spotifyblobdownloader.cpp:60 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:61 msgid "An error occurred loading the iTunes database" msgstr "" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:78 msgid "And:" msgstr "" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "" #: ui/about.cpp:65 msgid "Authors" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "" #: core/database.cpp:734 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "" #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "" #: core/song.cpp:339 msgid "CDDA" msgstr "" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "" #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "" #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "" #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "" #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "" #: ui/equalizer.cpp:115 msgid "Classical" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: internet/lastfmsettingspage.cpp:110 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 "" #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "" #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:116 msgid "Club" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "" #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "" #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "" #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "" #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "" #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "" #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "" #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "" #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:64 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: transcoder/transcoder.cpp:432 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "" #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "" #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "" #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "" #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "" #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "" #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "" #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "" #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "" #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "" #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:63 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "" #: core/song.cpp:328 msgid "Flac" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:43 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "" #: core/database.cpp:673 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "" #: internet/lastfmservice.cpp:437 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:154 msgid "Last.fm password" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "" #: ui/equalizer.cpp:123 msgid "Live" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "" #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "" #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "" #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "" #: core/song.cpp:330 msgid "MPC" msgstr "" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "" #: library/library.cpp:74 msgid "Most played" msgstr "" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "" #: library/library.cpp:67 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:80 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "" #: core/utilities.cpp:147 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:366 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "" #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "" #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "" #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "" #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "" #: core/organise.cpp:65 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:124 msgid "Party" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "" #: widgets/osd.cpp:156 msgid "Paused" msgstr "" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "" #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "" #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" 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:206 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "" #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "" #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:460 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "" #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "" #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 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 "" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "" #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "" #: core/song.cpp:341 msgid "Stream" msgstr "" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "" #: ui/about.cpp:70 msgid "Thanks to" msgstr "" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "" #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:56 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:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:174 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:151 msgid "Third level" msgstr "" #: internet/jamendoservice.cpp:171 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "" #: core/song.cpp:338 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "" #: devices/giolister.cpp:161 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "" #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "" #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "" #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "" clementine-1.2.0+dfsg/src/translations/da.po000066400000000000000000004512521223327513400210230ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # FIRST AUTHOR , 2010 # Runkeldunk , 2012 # Jens E. Jensen , 2012 # GoatRider1505 , 2013 # Morten Anton Bach Sjøgren , 2010 # Peter Jespersen , 2012-2013 # tommycarstensen , 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:08+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Danish (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr "dage" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " pt" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " sekunder" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " sange" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 album" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 dage" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 dage siden" #: podcasts/gpoddersync.cpp:79 #, 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:413 #, qt-format msgid "%1 selected of" msgstr "%1 valgt ud af" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 sang" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 sange" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 sange fundet" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 sange fundet (viser %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 numre" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 overført" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimotedev modul" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "%filnavn%" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n fejlede" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n færdige" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "&Brugervalgt" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "&Extra" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "Hjælp" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "Skjul %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "Skjul..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Venstre" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "Musik" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Ingen" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "Spilleliste" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Afslut" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "Gentagelsestilstand" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Højre" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "Tilfældig-tilstand" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "&Udvid søjler til at passe til vindue" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "Værktøjer" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(forskelligt over flere sange)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "...og alle Amarok-bidragsyderne" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "0px" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 dag" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 nummer" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "127.0.0.1" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 tilfældige numre" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "Opgrader til Premium nu" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "En Grooveshark Anywhere konto er påkrævet" #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "En Spotify Premium konto er påkrævet." #: ../bin/src/ui_networkremotesettingspage.h:189 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:78 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:153 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:297 msgid "A-Z" msgstr "A-Å" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "AL ÆRE TIL HYPNOTUDSEN" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "Afbryd" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "Om %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "Om Clementine..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "Om Qt..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Kontodetaljer" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "Kontodetaljer (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Handling" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Aktiver/deaktiver Wiiremote" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "Tilføj Podcast" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Tilføj stream" #: ../bin/src/ui_notificationssettingspage.h:425 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:193 msgid "Add action" msgstr "Tilføj handling" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Henter streams" #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Tilføj mappe..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "Tilføj fil" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Tilføj fil..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Tilføj fil til omkodning" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Tilføj mappe" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Tilføj mappe..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Tilføj ny mappe..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "Tilføj podcast" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "Tilføj podcast..." #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Tilføj søgeterm" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "Tilføj album-mærke" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "Tilføj albumkunstner-mærke" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "Tilføj kunstner-mærke" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "Tilføj komponist-mærke" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "Tilføj disc-mærke" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "Tilføj sang filnavn" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "Tilføj genre-mærke" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "Tilføj sanglængde-mærke" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "Tilføj antal afspilninger" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "Tilføj antal overspringninger" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "Tilføj sangtitel-mærke" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "Tilføj sangnummer-mærke" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "Tilføj sangår-mærke" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Genopfrisk streams" #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "Føj til Grooveshark favoritter" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "Føj til Grooveshark afspilningsliste" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "Tilføj til en anden playliste" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Føj til spilleliste" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "Tilføj til køen" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Tilføj wiimotedev handling" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Tilføj..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Tilføjet i denne måned" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Tilføjet i denne uge" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Tilføjet i år" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Tilføjet i dag" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Tilføjet indenfor de seneste tre måneder" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "Tilføj sang til Min Musik" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "Tilføj sang til favoritter" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Avanceret gruppering..." #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "Efter" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "Efter kopiering..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Album (ideel lydstyrke for alle spor)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Albummets kunstner" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "Pladeomslag" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Album info på jamendo.com" #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Albummer med omslag" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Albummer uden omslag" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Alle Filer (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "Al ære til Hypnotudsen!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Alle albummer" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Alle kunstnere" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "Alle filer (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Alle spillelister (%1)" #: ui/about.cpp:74 msgid "All the translators" msgstr "Alle oversætterne" #: library/library.cpp:84 msgid "All tracks" msgstr "Alle numre" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "Tillad mid/side kodning" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "Ved siden af originalerne" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Skjul altid hovedvinduet" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Vis altid hovedvinduet" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "Start altid afspilning" #: internet/spotifyblobdownloader.cpp:60 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:61 msgid "An error occurred loading the iTunes database" msgstr "En fejl opstod under hentning af iTunes-databasen" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "En fejl opstod under skrivning af metadata til '%1'" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "En uspecifik fejl er opstået." #: ui/about.cpp:78 msgid "And:" msgstr "Og:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "Vred" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Udseende" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Tilføj filer/URL'er til spillelisten" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "Tilføj til nuværende playliste" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "Tilføj til playlisten" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "Påfør kompression for at undgå klipping" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Vil du slettet \"%1\"-forudindstilling?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "Er du sikker på at du vil slette denne spilleliste?" #: ui/edittagdialog.cpp:769 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:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Kunstner" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Kunstnerinfo" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "Kunstnerradio" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "Kunstner-mærker" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "Kunstners initial" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Lydformat" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Autentificering mislykkedes" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "Forfatter" #: ui/about.cpp:65 msgid "Authors" msgstr "Forfattere" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Auto" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Automatisk opdatering" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "Åbn automatisk enkelte kategorier i bibliotekstræet" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "Til rådighed" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "Gns. bitrate" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "Gns. billedstørrelse" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "BBC Podcasts" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 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:453 msgid "Background color" msgstr "Baggrundsfarve" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "Baggrundsbillede" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Baggrundsgennemsigtighed" #: core/database.cpp:734 msgid "Backing up database" msgstr "Sikkerhedskopierer database" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Bandlys" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "Bar analytiker" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Basal blå" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "Basal lydtype" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Adfærd" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "Bedst" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "Biografi fra %1" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Bitrate" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "Bitrate" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "Blok-analyzer" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "Blok type" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "Krop" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "Boom-analyzer" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Gennemse..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "Buffering" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "Men disse kilder er slået fra:" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Knapper" #: core/song.cpp:339 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "Understøttelse af indeksark" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "Annuller" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Skift omslag" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Skift størrelse på skrifttype" #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "Ændr gentagelsestilstand" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Ændrer smutvej..." #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "Ændr blandingstilstand" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Skift sprog" #: ../bin/src/ui_playbacksettingspage.h:330 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:228 msgid "Check for new episodes" msgstr "Søg efter nye episoder" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Tjek efter opdateringer..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "Vælg et navn til den smarte spilleliste" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Vælg automatisk" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Vælg farve..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "Vælg skrifttype..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Vælg fra listen" #: smartplaylists/querywizardplugin.cpp:155 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." #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "Vælg podcast download bibliotek" #: ../bin/src/ui_songinfosettingspage.h:188 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:115 msgid "Classical" msgstr "Klassisk" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "Rydder op" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Ryd" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Ryd spilleliste" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Clementine Fejl" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Klementin orange" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Clementine visualisering" #: ../bin/src/ui_deviceproperties.h:376 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_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:104 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:104 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_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "Clementine kan afspille musik, som du har uploadet til Ubuntu One" #: ../bin/src/ui_notificationssettingspage.h:431 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:250 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:128 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." #: internet/lastfmsettingspage.cpp:110 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 "Clementine kunne ikke hente din abonnementsstatus på grund af problemer med forbindelsen. Information om afspillede spor bliver cached og sendt til Last.fm senere." #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Clementine billedfremviser" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "Clementine kunne ikke finde resultater for denne fil" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "Clementine vil finde musik i:" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Klik her for at tilføje musik" #: playlist/playlisttabbar.cpp:293 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:72 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_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "Luk spilleliste" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "Luk visualisering" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "Lukning af dette vindue will aflyse hentningen." #: ui/albumcovermanager.cpp:216 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:116 msgid "Club" msgstr "Club" #: ../bin/src/ui_appearancesettingspage.h:272 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:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Kommentar" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "Fuldfør mærker automatisk" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "Fuldfør mærker automatisk..." #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Komponist" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "Konfigurer %1..." #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "Indstil Grooveshark..." #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Konfigurér Last.fm..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "Konfigurér Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Konfigurér Genveje" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "Indstil Spotify..." #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "Konfigurér Subsonic..." #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "Indstil Global søgning ..." #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "Indstil bibliotek..." #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "Konfigurer podcasts ..." #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "Indstil..." #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "Forbind til Wii Remotes med aktiver/deaktiver handling" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "Forbind til enhed" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "Forbinder til Spotify" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "Konsol" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "Fast bitrate" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "Konverter al musik" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "Konverter musik som enheden ikke kan afspille" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "Kopier til udklipsholder" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Koper til enhed..." #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Kopiér til bibliotek..." #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "Copyright" #: internet/subsonicsettingspage.cpp:81 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:64 #, 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" #: transcoder/transcoder.cpp:432 #, 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:426 #, 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/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "Kunne ikke indlæse Last.fm-radiokanalen" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "Kunne ikke åbne output fil %1" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Omslagshåndtering" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "Omslag fra indlejret billede" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Omslag blev indlæst automatisk fra %1" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "Omslag manuelt fjernet" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "Omslag er ikke angivet" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "Omslag angivet fra %1" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "Omslag fra %1" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "Opret ny Grooveshark afspilningsliste" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "Fade over når der automatisk skiftes spor" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "Fade over når der manuelt skiftes spor" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "Selvvalgt" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "Brugerdefineret billede:" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "Selvvalgte meddelelsesindstillinger" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "Selvvalgt radio" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Tilpasset..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "DBus sti" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Dance" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Oprettelsesdato" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Ændringsdato" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "Dage" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "Standard" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "Sænk lydstyrken med 4%" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "Nedsæt lydstyrken med procent" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Dæmp lydstyrke" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "Standard baggrundsbillede" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "Standarder" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "Pause mellem visualiseringer" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "Slet" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "Slet Grooveshark afspilningsliste" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "Sletter hentet data" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Slet filer" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Slet fra enhed..." #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Slet fra disk..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "Slet afspillede episoder" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "Slet forudindstilling" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "Slet smart spilleliste" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "Slet de originale filer" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Sletter filer" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "Fjern valgte spor fra afspilningskøen" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "Fjern sporet fra afspilningskøen" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Destination" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Detaljer..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Enhed" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Enhedsindstillinger" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Enhedsnavn" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Enhedsindstillinger..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Enhed" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Mente du" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "Digitally Imported adgangskode" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "Digitally Imported brugernavn" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "Koblet direkte til internettet" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Bibliotek" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "Slå varighed fra" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "Deaktiver generering af stemningslinje" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Deaktiveret" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Disk" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "Afbrudt transmission" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 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:715 msgid "Do a full library rescan" msgstr "Genindlæs hele biblioteket" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "Konverter ikke noget musik" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Gentag ikke" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "Vis ikke under diverse kunstnere" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "Bland ikke" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "Stop ikke" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Dobbeltklik for at åbne" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "Når jeg dobbeltklikker på en sang..." #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "Hent %n episoder" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "Hent bibliotek" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "Hent episoder til" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "Hent medlemskab" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "Hent automatisk nye episoder" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "Hent filer i downloadkø" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Hent dette album" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Hent dette album..." #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "Hent denne episode" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "Henter..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "Henter (%1%)..." #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "Henter Icecast bibliotek" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "Henter Jamendo katalog" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "Henter Magnatune katalog" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "Henter Spotify plugin" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "Hent metadata" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "Træk for at skifte position" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "Dropbox" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "Dynamisk tilstand er aktiveret" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "Dynamisk tilfældig mix" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "Rediger smart spilleliste..." #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Redigér mærke \"%1\"..." #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "Redigér mærke..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "Rediger mærker" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Redigér sporinformation" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "Redigér sporinformation..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Rediger information om sporet" #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Rediger..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "Aktiver støtte for Wii Remote" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "Aktivér equalizer" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "Brug kun genveje når Clementine har fokus" #: ../bin/src/ui_globalsearchsettingspage.h:147 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:62 msgid "Enable/disable Last.fm scrobbling" msgstr "Aktiver/deaktiver Last.fm scrobbling" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "Indkodningskompleksitet" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "Indkodningskvalitet" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "Indkodningstilstand" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "Indtast en URL" #: ../bin/src/ui_coverfromurldialog.h:103 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:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "Giv denne spilleliste et nyt navn" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Indtast en kunstner eller et mærke for a begynde at lytte til Last.fm-radio." #: ../bin/src/ui_globalsearchview.h:209 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:77 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:77 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:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "Indtast søgeudtryk her" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "Indtast URL'en til en internetradiostream:" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "Indtast foldernavn" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "Hele samlingen" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Fejl" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Kunne ikke koble til MTP-enhed" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "Fejl ved kopiering af sang" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "Fejl ved sletning af sang" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "Fejl ved hentning af Spotify plugin" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "Kunne ikke indlæse %1" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Kunne ikke indlæse spilleliste fra di.fm" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "Kunne ikke behandle %1: %2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "Kunne ikke indlæse lyd-CD" #: library/library.cpp:63 msgid "Ever played" msgstr "Nogensinde afspillet" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "Hver 10 minut" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "Hver 12 time" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "Hver 2 time" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "Hver 20 minut" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "Hver 30 minut" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "Hver 6 time" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "Hver time" #: ../bin/src/ui_playbacksettingspage.h:303 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:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "Udvid" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "Udløber den %1" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "Fade ud når et spor stoppes" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "Fading" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "Varighed af fade" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "Kunne ikke hente bibliotek" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "Kunne ikke hente podcasts" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "Kunne ikke indlæse podcast" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "Kunne fortolke XML til dette RSS-feed" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "Hurtig" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "Favoritter" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "Favoritspor" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "Hent manglende omslag" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "Hent automatisk" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "Hentning fuldført" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "Henter Subsonic bibliotek" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Kunne ikke hente omslag" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "File suffiks" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "Filformater" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Filnavn" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "Filnavn (uden sti)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Filstørrelse" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Filtype" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Filnavn" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Filer" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "Filer som skal omkodes" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "Find sange i biblioteket, baseret på de kriterier du opgiver." #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "Giver sangen fingeraftryk" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "Afslut" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "Første niveau" #: core/song.cpp:328 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Skriftstørrelse" #: ../bin/src/ui_spotifysettingspage.h:213 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:204 msgid "Force mono encoding" msgstr "Gennemtving monolyd-indkodning" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "Glem enhed" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Formular" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "Format" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Billedrate" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "Billeder per buffer" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Venner" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "Frosset" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Fuld bas" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "Fuld bas + diskant" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "Fuld diskant" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "GStreamer lydmotor" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "Generelt" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Generelle indstillinger" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Genre" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "Få en webadresse til at dele denne Grooveshark afspilningsliste" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "Få en webadresse til at dele denne Grooveshark sang" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "Henter populære Grooveshark sange" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "Henter kanaler" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "Henter strømme" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "Giv det et navn:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "Start" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "Gå til næste faneblad på spillelisten" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "Gå til forrige faneblad på spillelisten" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "Google Drev" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "Hentede %1 af %2 omslag (%3 mislykkedes)" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "Giv ikke-eksisterende sange gråtone i mine spillelister" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "Kunne ikke logge ind på Grooveshark" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "Webadresse til Grooveshark afspilningsliste" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "Grooveshark radio" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "URL til Grooveshark sange" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "Gruppér bibliotek efter..." #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "Grupper efter" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "Gruppér efter album" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "Gruppér efter kunstner" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "Gruppér efter kunstner/album" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "Gruppér efter kunstner/år - album" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "Gruppér efter genre/album" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "Gruppér efter genre/kunstner/album" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "HTML-side indeholder ingen RSS-feeds" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "HTTP proxy" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "Glad" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "Hardwareinformation" #: ../bin/src/ui_deviceproperties.h:372 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:202 msgid "High" msgstr "Høj" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "Høj (%1 billeder/sekund)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "Høj (1024x1024)" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "Timer" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "Hypnotudsen" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "Jeg har ikke nogen Magnatune-konto" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Ikon" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "Ikoner på toppen" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "Identificerer sang" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 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:77 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:204 msgid "Ignore \"The\" in artist names" msgstr "Ignorer \\\"The\\\" i kunstnernavn" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Billeder (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "Om %1 dage" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "Om %1 uger" #: ../bin/src/ui_wizardfinishpage.h:86 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/spotifyservice.cpp:360 msgid "Inbox" msgstr "Indboks" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "Inkludér albumkunst i bekendtgørelsen" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "Inkluder alle sange" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Inkompatibel Subsonic REST protokol version. Klienten skal opgraderes." #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Inkompatibel Subsonic REST protokol version. Serveren skal opgraderes." #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "Forøg lydstyrken med 4%" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "Skru op for lyden med procent" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Forøg lydstyrke" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "Indekserer %1" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "Information" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "Indsæt..." #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Installeret" #: core/database.cpp:673 msgid "Integrity check" msgstr "Integritetskontrol" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "Internet udbydere" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "Ugyldig API-nøgle" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Ugyldig format" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "Ugyldig metode" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "Ugyldige parametre" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "Ugyldig resource angivet" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "Ugyldig tjeneste" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "Ugyldig sessionsnøgle" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "Ugyldigt brugernavn og/eller adgangskode" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "Mest afspillede på Jamendo" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "Favoritlisten på Jamendo" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "Månedens favoritter på Jamendo" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "Ugens favoritter på Jamendo" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "Jamendo database" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "Gå til sporet som afspilles nu" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Hold knappen nede i %1 sekund(er)..." #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Hold knappen nede i %1 sekund(er)..." #: ../bin/src/ui_behavioursettingspage.h:193 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:193 msgid "Keep the original files" msgstr "Behold de originale filer" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "Killinger" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Sprog" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "Bærbar/hovedtelefoner" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Stor sal" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "Stort omslag" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "Stort sidepanel" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "Sidst afspillet" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "Selvvalgt radio på Last.fm: %1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Last.fm bibliotek - %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "Last.fm mixradio: %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Last.fm naboradio - %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Last.fm-radiokanal - %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Last.fm kunstnere der minder om %1" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Last.fm mærkeradio: %1" #: internet/lastfmservice.cpp:437 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:154 msgid "Last.fm password" msgstr "Last.fm-adgangskode" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "Antal afspilninger fra Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Last.fm-mærker " #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Last.fm-brugernavn" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Last.fm wiki" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "Spor med færreste stemmer" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "Lad stå blank for standard. Eksempler: \"/dev/dsp\", \"front\", osv." #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Længde" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Bibliotek" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "Avanceret bibliotektsgruppering" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "Meddelelse om genindlæsning af biblioteket" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "Søg i biblioteket" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Grænser" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "Lyt til sange på Grooveshark, baseret på din lyttehistorik" #: ui/equalizer.cpp:123 msgid "Live" msgstr "Live" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Hent" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "Hent omslag fra URL" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "Hent omslag fra URL..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "Hent omslag fra disk" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "Hent omslag fra disk" #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "Åbn spilleliste" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "Åbn spilleliste..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Indlæser Last.fm-radio" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Åbner MTP-enhed" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "Åbner iPod-database" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "Åbner smart spilleliste" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "Åbner sange" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "Indlæser stream" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "Åbner spor" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "Henter information om spor" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "Åbner..." #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "Indlæser filer/URL'er og erstatter nuværende spilleliste" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Log ind" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "Login mislykkedes" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "Long term prediction-profil (LTP)" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "Elsker" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Lav (%1 billeder/sekund)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "Lav (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "Low complexity-profil (LC)" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "Sangtekster" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "Sangtekster fra %1" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Download fra Magnatune" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Download fra Magnatune fuldført" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "Main profile (MAIN)" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "Sæt igang!" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "Gør spillelisten tilgængelig offline" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "Misdannet svar" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "Manuel proxy-indstilling" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "Manuelt" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "Fabrikant" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "Marker som aflyttet" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "Marker som ny" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "Match alle søgeord (OG)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "Match på hvilket som helst søgeord (ELLER)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "Højeste bitrate" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "Medium (%1 billeder/sekund)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "Medium (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "Medlemskabstype" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "Minimal bitrate" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "Manglende projectM-forvalg" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "Model" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "Overvåg ændringer i biblioteket" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "Mono afspilning" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "Måneder" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "Humør" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "Stemningslinje stil" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "Stemningslinier" #: library/library.cpp:74 msgid "Most played" msgstr "Mest afspillede" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "Monteringspunkt" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "Monteringspunkter" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "Flyt ned" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "Flyt til bibliotek..." #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "Flyt op" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "Musik" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Musikbibliotek" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "Slå lyden fra" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "Mit Last.fm-bibliotek" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "Min Last.fm mix radio" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "Mit Last.fm-nabolag" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "Min anbefalede radio på Last.fm" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "Min mix radio" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "Min Musik" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "Mit nabolag" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "Min radiokanal" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "Mine anbefalinger" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Navn" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "Navnevalg" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "Smalbånd (SB)" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "Naboer" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "Netværk" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "Netværksproxy" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "Netværks Remote" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "Aldrig" #: library/library.cpp:67 msgid "Never played" msgstr "Aldrig afspillet" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "Begynd aldrig afspilning" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "Ny folder" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "Ny spilleliste" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "Ny smart spilleliste..." #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "Nye sange" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "Nye spor vil automatisk blive tilføjet." #: library/library.cpp:80 msgid "Newest tracks" msgstr "Nyeste spor" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "Næste" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Næste spor" #: core/utilities.cpp:147 msgid "Next week" msgstr "Næste uge" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "Ingen analyzer" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "Intet baggrundsbillede" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "Ingen lange blokke" #: playlist/playlistcontainer.cpp:366 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:145 msgid "No short blocks" msgstr "Ingen korte blokke" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "Ingen" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 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:155 msgid "Normal" msgstr "Almindelig" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "Normal bloktype" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "Ikke tilgængelig sammen med dynamiske spillelister" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "Ikke forbundet" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "Ikke nok indhold" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "Ikke nok fans" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "Ikke nok medlemmer" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "Ikke nok naboer" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Ikke installeret" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "Ikke logget ind" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "Ikke monteret - dobbeltklik for at montere" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "Bekendtgørelsestype" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Bekendtgørelser" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Nu afspilles" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "Forhåndsvisning af OSD" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Ogg FLAC" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 msgid "Only allow connections from the local network" msgstr "" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Vis kun den første" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "Opacity" msgstr "" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "Åben %1 i web browser" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "Åbn lyd-&CD" #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "Åben OPML fil" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "Åben OPML fil" #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "Åbn enhed" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "Åben fil..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "Åbn på Google Drev" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "Åbn i ny spilleliste" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Åben..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "Operation mislykkedes" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "Optimer for bitrate" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "Optimer for kvalitet" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "Indstillinger..." #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "Organiser filer" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "Organiser filer..." #: core/organise.cpp:65 msgid "Organising files" msgstr "Organiserer filer" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "Oprindelige mærker" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Andre valgmuligheder" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "Output-indstillinger" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "Overskriv eksisterende filer" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "Ejer" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "Behandler Jamendo-kataloget" #: ui/equalizer.cpp:124 msgid "Party" msgstr "Party" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "Kodeord" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Pause" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "Pause i afspilning" #: widgets/osd.cpp:156 msgid "Paused" msgstr "På pause" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "Simpelt sidepanel" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Afspil" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "Spil kunstner eller mærke" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "Spil kunstnerradio..." #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "Antal gange afspillet" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "Afspil selvvalgt radio..." #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "Spil hvis der er stoppet, hold pause hvis der spilles" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "Afspil hvis der ikke er noget andet som afspilles i øjeblikket" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "Spil mærkeradio..." #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "Afspil det . spor i spillelisten" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "Afspil/Pause" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Afspilning" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Afspiller indstillinger" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "Spilleliste" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "Spilleliste afsluttet" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "Indstillinger for spilleliste" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "Spillelistetype" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "Afspilningslister" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "Luk venligst din hjemmesidelæser, og returner til Clementine" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "Status for udvidelsesmodulen" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "Podcasts" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Pop" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "Populære sange" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "Mådedens populære sange" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "Dagens populære sange" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "Popup varighed" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "Port" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "For-forstærker" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "Indstillinger" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "Indstillinger..." #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "Foretrukne omslag-filnavn (separeret med komma)" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "Foretrukket lydformat" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "Foretrukken bithastighed" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "Foretrukket format" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "Premium lydtype" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "Forudindstilling:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "Tryk på en tastekombination at bruge til" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "Tryk på en tast" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Tryk på en tastekombination at bruge til %1..." #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "Indstillinger for køn OSD" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "Forhåndsvisning" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "Forrige" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "Forrige spor" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Vis versionsinformation" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "Profil" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "Fremgang" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 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:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "Kvalitet" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "Forespørger enhed..." #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "Køhåndterer" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "Sæt valgte spor i kø" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "Sæt spor i kø" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "Radio (samme loudness for alle spor)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "Radioer" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "Regn" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "Tilfældig visualisering" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "Giv 0 stjerner til denne sang" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "Giv 1 stjerne til denne sang" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "Giv 2 stjerner til denne sang" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "Giv 3 stjerner til denne sang" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "Giv 4 stjerner til denne sang" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "Giv 5 stjerner til denne sang" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "Pointgivning" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "Vil du virkelig afbryde?" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "Ajourfør" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "Genopfrisk kataloget" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "Genopfrisk kanaler" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "Hent kanaler på ny" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "Genopfrisk kanallisten" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "Genopfrisk bakgrunnslyder" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Reggae" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "Husk Wii-remote-bevægelse" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "Husk fra sidste gang" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Fjern" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "Fjern handling" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "Fjerner dupletter fra afspilningsliste" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "Fjern mappe" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "Fjern fra Min Musik" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "Fjern fra favoritter" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "Fjern fra spilleliste" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "Fjerner sange fra Min Musik" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "Fjerner sange fra favoritter" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "Omdøb \"%1\" afspilningsliste" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "Omdøb Grooveshark afspilningsliste" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "Giv spillelisten et nyt navn" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "Giv spillelisten et nyt navn..." #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "Omnummerér spor i denne rækkefølge..." #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Gentag" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "Gentag album" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "Gentag spilleliste" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "Gentag spor" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Erstat nuværende spilleliste" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "Erstat spillelisten" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "Erstat mellemrum med understregninger" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "Replay Gain" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "Genudfyld" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "Nulstil" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" msgstr "Nulstil afspilningstæller" #: 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:206 msgid "Restrict to ASCII characters" msgstr "Begræns til ASCII-tegn" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "Genoptag afspilning ved programstart" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "Henter sange fra Grooveshark Min Musik" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "Henter Grooveshark favoritsange" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "Henter Grooveshark afspilningslister" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "Retur til Clementine" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "Kør" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "SOCKS proxy" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "Sikker fjernelse af enhed" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "Sikker fjernelse af enhed efter kopiering" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "Samplingsrate" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "Samplingsfrekvens" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "Gem .mood filer i dit musikbibliotek." #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "Gem omslag" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "Gem omslag til disk..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "Gem billede" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "Gem spilleliste" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "Gem spilleliste..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "Gem forudindstilling" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "Gem denne kanal i et Internet-faneblad" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "Gemmer spor" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "Skalerbar samplingsfrekvens-profil (SSR)" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "Karakter" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "Scrobble-spor som jeg lytter til" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "Søg" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "Søg i Icecast-kanaler" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "Søg i Jamendo" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Søg i Magnatune" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "Søg Subsonic" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "Søg efter omslag" #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "Søg efter noget" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "Søg på gpodder.net" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "Søg på iTunes" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "Søgetilstand" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "Søgeindstillinger" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "Søgeresultater" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "Søgekriterier" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "Søg på Grooveshark" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "Andet niveau" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "Spol tilbage" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "Spol frem" #: core/commandlineoptions.cpp:163 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:162 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" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "Vælg alle" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "Vælg ingen" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "Vælg baggrundsfarve:" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "Vælg baggrundsbillede" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "Vælg det bedste match" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "Vælg forgrundsfarve:" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "Vælg visualiseringer" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "Vælg visualiseringer..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "Serienummer" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "Server-URL" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "Server detaljer" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "Tjeneste offline" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Sæt %1 til \"%2\"..." #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "Sæt lydstyrken til percent" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "Sæt værdi på alle valgte spor..." #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Genvejstast" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "Genvejstast for %1" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Der findes allerede en genvejstast for %1" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Vis" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "Vis OSD" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "Vis en lysende animation på det nuværende spor" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "Vis en moodbar i nummeret's fremskridts-bar." #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "Vis en native skrivebordsbekendtgørelse" #: ../bin/src/ui_notificationssettingspage.h:442 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:441 msgid "Show a notification when I change the volume" msgstr "Vis en bekendtgørelse når jeg skifter lydstyrke" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "Vis en pop-up fra statusområdet" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "Vis en køn OSD" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "Vis over statuslinjen" #: ui/mainwindow.cpp:460 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:209 msgid "Show cover art in library" msgstr "Vis omslag i biblioteket" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "Vis adskillere" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "Vis i fuld størrelse..." #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "Vis i filbrowser" #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "Vis under Diverse kunstnere" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "Vis stemningslinie" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "Vis kun dubletter" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "Vis kun filer uden mærker" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "Vis søgeforslag" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "Vis \"elsker\" og \"bandlys\"-knapperne" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "Vis scrobble-knappen i hovedvinduet" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "Vis statusikon" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "Vis hvilke kilder der er aktiveret og deaktiveret" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "Vis/skjul" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Bland" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "Bland albummer" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "Bland alle" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "Bland spilleliste" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "Bland spor i dette album" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "Log ind" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "Log ud" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "Logger på..." #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "Lignende kunstnere" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "Skip tilbage i spillelisten" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "Antal gange sprunget over" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "Skip fremad i spillelisten" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "Lille omslagsbillede" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "Lille sidepanel" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "Smart spilleliste" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "Smarte spillelister" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "Information om sangen" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "Info om sangen" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "Sonogram" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "Beklager" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "Sorter alfabetisk efter genre" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "Sorter efter genrens popularitet" #: ../bin/src/ui_icecastfilterwidget.h:77 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" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "Kilde" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "Kilder" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "Kunne ikke logge på Spotify" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "Spotify-udvidelsesmodul" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "Spotify-udvidelsesmodulet er ikke installeret" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "Standard" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "Har stjerner" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "Start den spilleliste der afspiller nu" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "Start omkodning" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 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:405 #, qt-format msgid "Starting %1" msgstr "Starter %1" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "Starter…" #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "Kanaler" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Stop" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "Stop efter" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "Stop efter dette spor" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Stop afspilning" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "Stop afspilning efter nuværende spor" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "Stoppet" #: core/song.cpp:341 msgid "Stream" msgstr "Stream" #: internet/subsonicsettingspage.cpp:30 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:160 msgid "Streaming membership" msgstr "Streaming-medlemskab" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "Tilmeldte afspilningslister" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "Abonnenter" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "Succes!" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "Skrev %1" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "Foreslåede mærker" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "Sammendrag" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "Super-høj (%1 billeder/sekund)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "Super high (2048x2048)" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "Understøttede formater" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "Synkroniserer Spotify indbox" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "Synkroniser Spotify afspilningsliste" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "Synkroniserer stjernemarkerede spor i Spotify" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "Systemfarver" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "Faneblade i toppen" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Mærke" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "Mærke-henter" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "Mærkeradio" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "Ønsket bitrate" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "Tekst indstillinger" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Tak til" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Kunne ikke starte kommandoen \\\"%1\\\"" #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "Nuværende sangs pladeomslag" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "Biblioteket %1 er ugyldigt" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "Spillelisten '%1' var tom, eller kunne ikke indlæses" #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "Siden du søgte efter er ikke et billede!" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "Der er andre sange i dette album" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "Der var et kommunikationsproblem med gpodder.net" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Kunne ikke hente metadata fra Magnatune" #: podcasts/itunessearchpage.cpp:76 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:56 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:389 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:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 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:174 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:151 msgid "Third level" msgstr "Tredje niveau" #: internet/jamendoservice.cpp:171 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/magnatunedownloaddialog.cpp:175 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_deviceproperties.h:381 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:375 msgid "This device supports the following file formats:" msgstr "Enheden understøtter følgende filformater:" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Enheden vil ikke fungere korrekt" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "Denne stream er kun for betalende abonnenter" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "Denne enhedstype (%1) er ikke understøttet." #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "Tidsudløb" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Titel" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "For at starte Grooveshark radio, skal du først lytte til et par andre Grooveshark sange" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "Idag" #: core/globalshortcuts.cpp:59 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:1369 msgid "Toggle queue status" msgstr "Slå køstatus til/fra" #: ../bin/src/ui_mainwindow.h:718 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:143 msgid "Tomorrow" msgstr "I morgen" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "For mange omdirigeringer" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "Bedste musiknumre" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "Totalt antal bytes overført" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "Totalt antal forespørgsler over nettet" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Spor" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "Omkod musik" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "Omkoder-log" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "Omkodning" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Omkoder %1 filer i %2 tråde" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "Indstillinger for omkodning" #: core/song.cpp:338 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "Turbine" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "Slå fra" #: devices/giolister.cpp:161 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "URL'er" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "Ultra wide band (UWB)" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Kunne ikke downloade %1 (%2)" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Ukendt" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "Ukendt indholdstype" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Ukendt fejl" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "Fravælg omslag" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "Opsig abonnement" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "Kommende Koncerter" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "Opdater Grooveshark afspilningslister" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "Ajourfør alle podcasts" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "Opdater ændrede bibliotekskataloger" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "Opdater biblioteket når Clementine starter" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "Ajourfør denne podcast" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "Ajourfører" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Ajourfører %1" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "Opdaterer %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Opdaterer bibliotek" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "Brug" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "Brug Album Artist mærke, når det er muligt" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "Brug Gnome genvejstaster" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "Brug Replay Gain-metadata hvis tilgængelig" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "Brug Wii Remote" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "Brug et brugerdefineret farvesæt" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "Brug en selvvalgt meddelelse til beskeder" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "Brug godkendelse" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "Brug kontrolleret bitrate" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "Brug dynamisk tilstand" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "Vis meddelelser om Wii Remote-status" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "Brug midlertidig larm formning" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "Brug systemstandarder" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "Brug systemets standard farvesæt" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "Brug standard proxy-indstillinger" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "Brug volumen normalisering" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "Brugt" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "Brugeren %1 har ikke en Grooveshark Anywhere-konto" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "Brugergrænseflade" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Brugernavn" #: ../bin/src/ui_behavioursettingspage.h:207 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:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "Variabel bitrate" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "Diverse kunstnere" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "Version %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "Vis" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "Visualiseringstilstand" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "Visualiseringer" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "Indstilling af visualiseringer" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "Stemmeaktivitet opdaget" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "Lydstyrke %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "Hjemmeside" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "Uger" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "Når Clementine starter" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "Når listen er tom ..." #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "Hvor ikke prøve..." #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "Wide band (WB)" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii Remote %1: aktiveret" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii Remote %1: tilsluttet" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii Remote %1: kritisk batteristatus (%2%) " #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii Remote %1: deaktiveret" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii Remote %1: frakoblet" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Remote %1: lavt batteri-niveau (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "Windows Media audio" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:530 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:2088 msgid "Would you like to run a full rescan right now?" msgstr "Vil du genindlæse hele biblioteket nu?" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "Forkert brugernavn og/eller password." #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "År" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "År - Album" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "Årstal" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "I går" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "Du er ved at downloade følgende albums" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "Du er ikke logget ind." #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "Du er logget på som %1." #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "Du er logget ind." #: ../bin/src/ui_groupbydialog.h:123 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/digitallyimportedsettingspage.cpp:46 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/magnatunesettingspage.cpp:53 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:57 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." #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "Du kan scrobble numre gratis, men det er kun betalende abonnenter der kan streame fra Last.fm radioen til Clementine." #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "Du har ikke en Grooveshark Anywhere konto" #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Du har ikke en Spotify Premium konto" #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "Du har ikke et aktivt abonnement" #: internet/spotifyservice.cpp:170 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/spotifysettingspage.cpp:158 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:87 msgid "You love this track" msgstr "Du elsker dette musiknummer" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "I Systemindstillinger er du nødt til at slå \"Adgang til hjælpemidler\" til, for at kunne bruge globale genveje i Clementine." #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "For at skifte sprog, skal du genstarte Clementine" #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "Da du ikke er en Last.fm-abonnent, kan du ikke høre Last.fm-radiokanaler." #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "Din IP adresse:" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Dine Last.fm login-oplysninger var forkerte" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "Dine Magnatune legitimationsoplysninger var forkerte" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "Dit bibliotek er tomt!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "Dine radiostreams" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "Dine scrobbles: %1" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Systemet mangler OpenGL-understøttelse, visualiseringer er utilgængelige." #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "Dit brugernavn eller kodeord var ukorrekt." #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Nul" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "tilføj %n sange" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "efter" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "siden" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "og" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "automatisk" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "før" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "imellem" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "største først" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "indeholder" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "slået fra" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "disk %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "indeholder ikke" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "slutter med" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "lig" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "gpodder.net" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "gpodder.net bibliotek" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "større end" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "i den sidste" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "mindre end" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "længste først" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "flyt %n sange" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "nyeste først" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "er ikke lig med" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "ikke i den sidste" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "ikke på" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "ældste først" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "på" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "indstillinger" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "tast retur" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "fjern %n sange" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "korteste først" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "bland sange" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "mindste først" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "sorter sange" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "starter med" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "stop" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "spor %1" clementine-1.2.0+dfsg/src/translations/de.po000066400000000000000000004715141223327513400210320ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Asfaloth , 2013 # Ankorath , 2013 # Mariaki , 2013 # Bartosz Dotryw , 2013 # Christian Sturm , 2011, 2012 # Claudius Henrichs , 2011 # daschuer , 2012 # FIRST AUTHOR , 2010 # geroldmittelstaedt , 2012 # santy , 2012 # janlaymann , 2012 # Jonas Mueller , 2013 # Lenzitsch , 2013 # Lenzitsch , 2012 # Martin Herkt , 2011 # Martin Herkt , 2010 # Paul E. <>, 2012 # quick_wango , 2013 # robfloop , 2012 # Robin Cornelio Thomas , 2012 # Mosley , 2011 # El_Zorro_Loco , 2011, 2012 # Vulgrim , 2013 # Wasilis , 2013 # Wasilis Mandratzis , 2013 # Wilhelm Einstein <>, 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-11 10:21+0000\n" "Last-Translator: Asfaloth \n" "Language-Team: German (http://www.transifex.com/projects/p/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:39 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 Playlists zu ihren Favoriten hinzufügen, indem sie den Stern neben dem Namen der Playlist anklicken\n\nFavorisierte Playlists werden hier gespeichert" #: ../bin/src/ui_podcastsettingspage.h:246 msgid " days" msgstr "Tage" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr "Kb/s" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " pt" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " Sekunden" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "Titel" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 Alben" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 Tage" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "vor %1 Tagen" #: podcasts/gpoddersync.cpp:79 #, 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:413 #, qt-format msgid "%1 selected of" msgstr "%1 ausgewählt von" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 Titel" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 Titel" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 Titel gefunden" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 Titel gefunden (zeige %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 Stücke" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 übertragen" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimotedev-Modul" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, qt-format msgid "%L1 other listeners" msgstr "%L1 andere Zuhörer" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "Insgesamt %L1 mal abgespielt" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n fehlgeschlagen" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n abgeschlossen" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "&Benutzerdefiniert" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "Extras" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "Hilfe" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "%1 ausblenden" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "&Ausblenden..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Links" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "Musik" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Keine" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "Wiedergabeliste" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Beenden" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "&Wiederholung" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Rechts" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "&Zufallsmodus" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "Spalten an Fenstergröße anpassen" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "&Werkzeuge" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(unterschiedlich für mehrere Titel)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "...und alle Amarok-Entwickler" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "0px" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 Tag" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 Stück" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "127.0.0.1" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "40%" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 zufällige Stücke" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "Jetzt auf Premium erweitern" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "Ein neues Konto erstellen oder Ihr Passwort zurücksetzen" #: ../bin/src/ui_librarysettingspage.h:195 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, Ratings 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_librarysettingspage.h:199 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 Datenbank in die Tags der Titel-Dateien 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "Ein Grooveshark-Anywhere-Konto wird benötigt." #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "Ein Spotify-Premium-Konto ist erforderlich." #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "Ein Client kann sich nur verbinden, falls der korrekte Code eingegeben wurde." #: smartplaylists/wizard.cpp:78 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 Musiksammlung stammen. Es gibt mehrere Arten von intelligenten Wiedergabelisten, die unterschiedliche Möglichkeiten bieten, eine Auswahl von Titeln zu treffen." #: smartplaylists/querywizardplugin.cpp:153 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:297 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "ALL GLORY TO THE HYPNOTOAD" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "Abbrechen" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "Über %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "Über Clementine..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "Über Qt…" #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Benutzerkonto" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "Kontodetails (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Aktion" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Wii-Fernbedienung aktivieren/deaktivieren" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "Podcast hinzufügen" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Stream hinzufügen" #: ../bin/src/ui_notificationssettingspage.h:425 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:193 msgid "Add action" msgstr "Aktion hinzufügen" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Einen weiteren Stream hinzufügen" #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Verzeichnis hinzufügen..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "Datei hinzufügen" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "Datei zum Transcoder hinzufügen" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "Datei(en) zum Transcoder hinzufügen" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Datei hinzufügen..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Zu konvertierende Dateien hinzufügen" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Ordner hinzufügen" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Ordner hinzufügen..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Ordner hinzufügen" #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "Podcast hinzufügen" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "Podcast hinzufügen..." #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Suchbegriff hinzufügen" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "Album des aktuellen Titels" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "Album-Interpret des aktuellen Titels" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "Interpret des aktuellen Titels" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "Automatischen Score hinzufügen" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "Komponist des aktuellen Titels" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "CD-Nr. des aktuellen Titels" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "Dateiname des aktuellen Titels" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "Genre des aktuellen Titels" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "Titelgruppierung hinzufügen" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "Länge des aktuellen Titels" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "Interpret hinzufügen" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "Abspielzähler des aktuellen Titels" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "Rating hinzufügen" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "Sprungzähler des aktuellen Titels" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "Name des aktuellen Titels" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "Nummer des aktuellen Titels" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "Erscheinungsjahr des aktuellen Titels" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Stream hinzufügen..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "Zu Grooveshark-Favoriten hinzufügen" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "Zu Grooveshark-Wiedergabelisten hinzufügen" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "Zu anderer Wiedergabeliste hinzufügen" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Zur Wiedergabeliste hinzufügen" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "In die Warteschlange einreihen" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Aktion für Wii-Fernbedienung hinzufügen" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Hinzufügen..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Diesen Monat hinzugefügt" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Diese Woche hinzugefügt" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Dieses Jahr hinzugefügt" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Heute hinzugefügt" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "In den letzten drei Monaten hinzugefügt" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "Titel werden zu \"Meine Musik\" hinzugefügt" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "Füge Titel zu den Favoriten hinzu" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Benutzerdefiniert" #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "Nach " #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "Nach dem Kopieren..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Album (idealer Pegel für alle Stücke)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Album-Interpret" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "Albumcover" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Albuminformationen auf jamendo.com..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Alben mit Cover" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Alben ohne Cover" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Alle Dateien (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "All Glory to the Hypnotoad!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Alle Alben" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Alle Interpreten" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "Alle Dateien (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Alle Wiedergabelisten (%1)" #: ui/about.cpp:74 msgid "All the translators" msgstr "Alle Übersetzer" #: library/library.cpp:84 msgid "All tracks" msgstr "Alle Stücke" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "Clients erlauben, Musik von diesem Computer herunterzuladen." #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "Downloads erlauben" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "Mid/Side Encoding zulassen" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "Zu den Originalen" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Clementine immer verstecken" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Clementine immer anzeigen" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "Immer mit der Wiedergabe beginnen" #: internet/spotifyblobdownloader.cpp:60 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "Ein zusätzlich Plugin ist benötigt, um Spotify in Clementine zu benutzen. Möchten Sie es jetzt herunterladen und installieren?" #: devices/gpodloader.cpp:61 msgid "An error occurred loading the iTunes database" msgstr "Beim Laden der iTunes-Datenbank ist ein Fehler aufgetreten" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Beim Schreiben der Metadaten für '%1' trat ein Fehler auf" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "Ein unspezifizierter Fehler ist aufgetreten." #: ui/about.cpp:78 msgid "And:" msgstr "Und:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "Wütend" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Erscheinungsbild" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Dateien/URLs an die Wiedergabeliste anhängen" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "Zur aktuellen Wiedergabeliste hinzufügen" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "Zur Wiedergabeliste hinzufügen" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "Komprimieren um Clippingfehler zu vermeiden" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Profil \"%1\" wirklich löschen?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "Möchten Sie diese Wiedergabeliste wirklich löschen?" #: ui/edittagdialog.cpp:769 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:152 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 alle Titel-Statistiken aller Titel der Datenbank in die Dateien der Titel schreiben wollen?" #: playlist/playlist.cpp:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Interpret" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Infos zum Interpreten" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "Künstler-Radio" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "Stichworte zum Interpreten" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "Initialen des Interpreten" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Audioformat" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Authentifizierung fehlgeschlagen" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "Author" #: ui/about.cpp:65 msgid "Authors" msgstr "Autoren" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Automatisch" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Automatisches Aktualisieren" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "Sofern einem Künstler nur ein Album zugeordnet ist, dieses bei Klick auf den Künstler automatisch ausklappen" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "Verfügbar" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "Durchschnittliche Bitrate" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "Durchschnittliche Bildgröße" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "BBC Podcasts" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "Hintergrundstreams" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Hintergrundfarbe:" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "Hintergrundbild" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Deckkraft:" #: core/database.cpp:734 msgid "Backing up database" msgstr "Sichere die Datenbank" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "Balance" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Bannen" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "Balken" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Standardblau" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "Normales Streaming-Format:" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Verhalten" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "Optimal" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "Biografie von %1" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Bitrate" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "Bitrate" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "Blöcke" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "Blocktyp" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "Unschärfe" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "Textkörper:" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "Boom" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Durchsuchen…" #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "Zwischenspeicher (Buffer) Dauer" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "Puffern" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "Aber diese Quellen sind deaktiviert" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Tasten" #: core/song.cpp:339 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "Unterstützung von Cuesheets" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "Abbrechen" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Cover ändern" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Schriftgröße ändern..." #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "Wiederholungsmodus ändern" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Tastenkürzel ändern..." #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "Zufallsmodus ändern" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Sprache ändern" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "Die Mono-Wiedergabe-Einstellung wird für den nächsten Titel wirksam." #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "Nach neuen Episoden suchen" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Suche nach Aktualisierungen..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "Wählen Sie einen Namen für Ihre intelligente Wiedergabeliste" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Automatisch auswählen" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Farbe wählen..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "Schriftart wählen..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Von der Liste wählen" #: smartplaylists/querywizardplugin.cpp:155 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." #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "Wählen Sie ein Downloadverzeichnis für Podcasts" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Internetseiten, welche von Clementine zur Liedtextsuche verwendet werden sollen:" #: ui/equalizer.cpp:115 msgid "Classical" msgstr "Klassisch" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "Bereinigen" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Leeren" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Wiedergabeliste leeren" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Clementine-Fehler" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Clementineorange" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Clementine-Visualisierung" #: ../bin/src/ui_deviceproperties.h:376 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 konvertieren, welches das Gerät abspielen kann." #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine kann Musik abspielen, die Sie auf Box hochgeladen haben." #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine kann Musik abspielen, die Sie auf Dropbox hochgeladen haben" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine kann Musik abspielen, die Sie auf Google Drive hochgeladen haben." #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "Clementine kann Musik abspielen, die Sie auf Ubuntu One hochgeladen haben" #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "Clementine kann beim Stückwechsel Benachrichtigungen anzeigen" #: ../bin/src/ui_podcastsettingspage.h:250 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 Computern und Podcast-Anwendungen abgleichen. Ein Konto erstellen." #: visualisations/projectmvisualisation.cpp:128 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." #: internet/lastfmsettingspage.cpp:110 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 "Clementine konnte Ihren Abo-Status nicht erhalten aufgrund von Problemen mit Ihrer Verbindung." #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Clementine-Bildbetrachter" #: ../bin/src/ui_trackselectiondialog.h:206 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:210 msgid "Clementine will find music in:" msgstr "Clementine wird Musik finden in:" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Klicken Sie hier um das zu ändern" #: playlist/playlisttabbar.cpp:293 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 Playlist zu speichern und unterm dem Reiter \"Playlists\" auf dem Panel auf der linken Seitenleiste zugänglich zu machen" #: ../bin/src/ui_trackslider.h:72 msgid "Click to toggle between remaining time and total time" msgstr "Klicken Sie um zwischen verbleibender und Gesamtzeit zu wechseln" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "Durch Klicken auf die Schaltfläche wird ein Webbrowser geöffnet. Bitte kehren Sie nach dem Einloggen zu Clementine zurück." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Schließen" #: playlist/playlisttabbar.cpp:54 msgid "Close playlist" msgstr "Wiedergabeliste schließen" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "Visualisierung schließen" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "Das Schließen des Fensters bricht den Download ab." #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "Das Schließen dieses Fensters bricht das Suchen nach Covern ab." #: ui/equalizer.cpp:116 msgid "Club" msgstr "Club" #: ../bin/src/ui_appearancesettingspage.h:272 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:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Kommentar" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "Tags automatisch vervollständigen" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "Tags automatisch vervollständigen..." #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Komponist" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "Konfiguriere %1..." #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "Grooveshark einrichten..." #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Last.fm einrichten..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "Magnatune einrichten...." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Tastenkürzel einrichten" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "Spotify konfigurieren..." #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "Subsonic wird konfiguriert..." #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "Globale Suche konfigurieren" #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "Musiksammlung einrichten..." #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "Podcasts einrichten..." #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "Einrichten..." #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "Wii-Fernbedienungen mittels Aktivieren/deaktivieren-Aktion verbinden" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "Gerät verbinden" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "Verbindung mit Spotify wird aufgebaut" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "Verbindung verweigert vom Server, Server-URL überprüfen. Beispiel: http://localhost:4040/" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Zeitüberschreitung, überprüfen Sie die Server-URL. Beispiel: http://localhost:4040/" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "Konsole" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "Konstante Bitrate" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "Gesamte Musik konvertieren" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "Musik konvertieren, die das Gerät nicht abspielen kann" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "Kopieren" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Auf das Gerät kopieren..." #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Zur Musiksammlung kopieren..." #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "Urheberrecht" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Konnte nicht mit Subsonic verbinden, bitte Server-URL überprüfen. Beispiel: http://localhost:4040/" #: transcoder/transcoder.cpp:64 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Konnte GStreamer-Element \"%1\" nicht erstellen. Stellen Sie sicher, dass alle nötigen GStreamer-Plugins installiert sind." #: transcoder/transcoder.cpp:432 #, 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-Plugins installiert sind." #: transcoder/transcoder.cpp:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Es konnte kein Encoder für %1 gefunden werden. Prüfen Sie ob die erforderlichen GStreamer-Plugins installiert sind." #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "Konnte die last.fm-Radiostation nicht laden." #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "Ausgabedatei %1 konnte nicht geöffnet werden" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Coververwaltung" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "Cover aus eingebettetem Bild" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Automatsch geladenes Albencover von %1" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "Cover manuell entfernt" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "Cover nicht ausgewählt" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "Das Cover wird von %1 gesetzt" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "Cover von %1" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "Neue Grooveshark-Wiedergabeliste erstellen" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "Überblenden bei automatischem Stückwechsel" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "Überblenden bei manuellem Stückwechsel" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "Strg + Shift + T" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "Benutzerdefiniert" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "Benutzerdefiniertes Bild:" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "Benutzerdefinierte Benachrichtigungseinstellungen" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "Benutzerdefiniertes Radio" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Eigene..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "DBus Pfad" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Dance" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Erstellt" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Geändert" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "Tage" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "S&tandard" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "Lautstärke um 4% verringern" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "Lautstärke um Prozent verringern" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Lautstärke verringern" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "Standard Hintergrundbild" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "Standard" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "Verzögerung zwischen Visualisierungen" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "Löschen" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "Grooveshark-Wiedergabeliste löschen" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "Heruntergeladene Dateien löschen" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Dateien löschen" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Vom Gerät löschen..." #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Vom Datenträger löschen..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "Gehörte Episoden löschen" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "Voreinstellung löschen" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "Lösche intelligente Wiedergabeliste" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "Originale löschen" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Dateien werden gelöscht" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "Stücke aus der Warteschlange nehmen" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "Stück aus der Warteschlange nehmen" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Ziel:" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Details..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Gerät" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Geräteeinstellungen" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Gerätename" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Geräteeinstellungen..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Geräte" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Meinten Sie" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "Passwort:" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "Benutzername:" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "Direkte Verbindung zum Internet" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Ordner" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "Permanente Anzeige" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "Erzeugung des Stimmungsbarometers deaktivieren" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Deaktiviert" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "CD-Nr." #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "Unterbrochene Übertragung" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "Anzeigeoptionen" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "OSD anzeigen" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "Musiksammlung erneut einlesen" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "Nichts konvertieren" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "Nicht überschreiben" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Wiederholung aus" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "Nicht unter \"Verschiedene Interpreten\" anzeigen" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "Zufallsmodus aus" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "Nicht anhalten!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "Spende" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Zum Öffnen doppelklicken" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "Beim Doppelklick auf einen Titel diesen..." #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "%n Episoden herunterladen" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "Downloadverzeichnis" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "Episoden herunterladen nach" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "Downloadmitgliedschaft" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "Neue Episoden automatisch herunterladen" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "Download an die Warteschlange angehängt" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "Die Android App herunterladen" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Dieses Album herunterladen" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Album herunterladen..." #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "Diese Episode herunterladen" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "Herunterladen..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "Herunterladen (%1%)..." #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "Lade Icecast-Verzeichnis herunter" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "Jamendo-Katalog herunterladen" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "Magnatune-Katalog wird geladen" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "Spotify-Plugin wird heruntergeladen" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "Metadaten werden heruntergeladen" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "Klicken und ziehen um die Position zu ändern" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "Dropbox" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "Dynamischer Modus ist an" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "Dynamischer Zufallsmix" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "Intelligente Wiedergabelist bearbeiten..." #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "%1 bearbeiten" #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "Tag bearbeiten..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "Tags bearbeiten" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Metadaten bearbeiten" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "Metadaten bearbeiten..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Metadaten bearbeiten..." #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Bearbeiten..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "Unterstützung für Wii-Fernbedienungen aktivieren" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "Equalizer aktivieren" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "Tastenkürzel nur aktivieren, wenn Clementine fokussiert ist" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Aktivieren Sie Quellen um sie in den Suchergebnissen anzuzeigen. Ergebnisse werden in dieser Reihenfolge angezeigt." #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "Last.fm Scrobbling aktivieren/deaktivieren" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "Encodierungskomplexität" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "Encoder-Qualität" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "Encodierungsmodus" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "Geben Sie eine URL ein" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "URL eingeben um Cover aus dem Internet zu laden" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "Dateiname für exportierte Cover eingeben (ohne Dateierweiterung):" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "Neuer Name für diese Wiedergabeliste" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Geben Sie einen Interpreten oder ein Stichwort ein, um Last.fm-Radio zu hören." #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Geben Sie Suchbegriffe ein um Musik auf Ihrem Computer und im Internet zu finden" #: ../bin/src/ui_itunessearchpage.h:77 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:77 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:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "Sammlung durchsuchen" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "Geben Sie die URL eines Internetradios ein:" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "Geben Sie den Namen des Ordners ein" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "Gib diese IP in der App ein um dich mit Clementine zu verbinden." #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "Gesamte Sammlung" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Fehler" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Fehler beim Verbinden zum MTP-Gerät" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "Fehler beim Kopieren der Titel" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "Fehler beim Löschen der Titel" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "Fehler beim herunterladen von Spotify-Plugin" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "Fehler beim Laden von %1" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Fehler beim Laden der di.fm-Wiedergabeliste" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "Fehler bei %1: %2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "Fehler beim Laden der Audio-CD" #: library/library.cpp:63 msgid "Ever played" msgstr "Irgendwann gespielt" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "Alle 10 Minuten" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "Alle 12 Stunden" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "Alle 2 Stunden" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "Alle 20 Minuten" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "Alle 30 Minuten" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "Alle 6 Stunden" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "Stündlich" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Außer für Stücke des gleichen Albums oder des gleichen Cuesheets." #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "Existierende Cover" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "Erweitern" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "Läuft aus am %1" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "Cover exportieren" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "Cover exportieren" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "Heruntergeladene Cover expoertieren" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "Eingebettete Cover exportieren" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "Export beendet" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "%1 von %2 Cover exportiert (%3 übersprungen)" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "Ausblenden bei Pause / Einblenden beim Fortsetzen" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "Ausblenden wenn ein Stück gestoppt wird" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "Überblenden" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "Dauer:" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "Holen des Verzeichnisses fehlgeschlagen" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "Abholen der Podcasts fehlgeschlagen" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "Laden der Podcasts fehlgeschlagen" #: podcasts/podcasturlloader.cpp:167 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:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "Schnell" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "Favoriten" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "Lieblingsstücke" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "Fehlende Cover holen" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "Cover automatisch holen" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "Abholen abgeschlossen" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "Subsonic-Bibliothek wird abgerufen" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Holen des Covers fehlgeschlagen" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "Dateiendung" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "Dateiformate" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Dateiname" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "Dateiname (ohne Dateipfad)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Dateigröße" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Dateityp" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Dateiname" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Dateien" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "Zu konvertierende Dateien" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "Titel in Ihrer Musiksammlung finden, die den Kriterien entsprechen." #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "Titel analysieren" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "Beenden" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "Erste Stufe" #: core/song.cpp:328 msgid "Flac" msgstr "FLAC" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Schriftgröße:" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Aus lizenzrechtlichen Gründen ist die Spotify-Unterstützung in einem separaten Plugin enthalten." #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "Mono-Encoding erzwingen" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "Gerät vergessen" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Formular" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "Format" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Bildwiederholrate" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "Frames pro Puffer" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Freunde" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "Eingefroren" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Maximale Tiefen" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "Maximale Tiefen und Höhen" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "Maximale Höhen" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "GStreamer Audio Engine" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "Allgemein" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Allgemeine Einstellungen" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Genre" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "Erstelle eine URL um diese Wiedergabeliste auf Grooveshark zu teilen." #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "Erstelle eine URL um diesen Titel auf Grooveshark zu teilen." #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "Empfange \"Beliebte Titel\" von Grooveshark" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "Kanäle laden" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "Streams laden" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "Namen angeben:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "Start" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "Zum nächsten Wiedergabeliste-Tab wechseln" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "Zum vorherigen Wiedergabeliste-Tab wechseln" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "%1 Cover von %2 wurden gefunden (%3 fehlgeschlagen)" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "Nicht gefundene Titel in meinen Wiedergabelisten ausgrauen" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "Grooveshark-Anmeldefehler" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "Grooveshark Wiedergabelisten URL" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "Grooveshark-Radio" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "Grooveshark-URL des Titels" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "Gruppieren nach..." #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "Gruppieren nach" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "Album" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "Nach Interpreten Sortieren" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "Interpret/Album" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "Interpret/Jahr" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "Genre/Album" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "Genre/Interpret/Album" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "Gruppierung" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "Die angegebene HTML-Seite enthält keine RSS-Feeds" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "HTTP 3xx status code ohne URL erhalten, überprüfen Sie bitte die Server Einstellungen" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "HTTP Proxy" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "Fröhlich" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "Hardwareinformationen" #: ../bin/src/ui_deviceproperties.h:372 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:202 msgid "High" msgstr "Hoch" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "Hoch (%1 fps)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "Hoch (1024x1024)" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "Host nicht gefunden, überprüfen Sie die Server-URL. Beispiel: http://localhost:4040/" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "Stunden" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "Hypnosekröte" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "Ich habe kein Magnatune-Konto" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Symbol" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "Icons oben" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "Musiktitel erkennen" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 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:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Wenn Sie die URL eines Podcasts kennen, geben Sie sie unten ein und drücken Sie Start." #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "Ignoriere \"The\" in den Künstlernamen" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Bilder (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "In %1 Tagen" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "In %1 Wochen" #: ../bin/src/ui_wizardfinishpage.h:86 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/spotifyservice.cpp:360 msgid "Inbox" msgstr "Posteingang" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "Cover in der Benachrichtigung anzeigen" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "Alle Titel einbeziehen" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Inkompatible \"Subsonic REST protocol version\". Der Client braucht ein Upgrade." #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Inkompatible \"Subsonic REST protocol version\". Der Server braucht ein Upgrade." #: internet/subsonicsettingspage.cpp:127 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:158 msgid "Increase the volume by 4%" msgstr "Lautstärke um 4% erhöhen" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "Lautstärke um Prozent erhöhen" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Lautstärke erhöhen" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "Indizierung %1" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "Information" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "Einfügen..." #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Installiert" #: core/database.cpp:673 msgid "Integrity check" msgstr "Integritätsprüfung" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "Internetdienstanbieter" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "Ungültiger API-Schlüssel" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Ungültiges Format" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "Ungültige Methode" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "Ungültige Parameter" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "Ungültige Quelle angegeben" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "Ungültiger Dienst" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "Ungültiger Sitzungsschlüssel" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "Benutzername und/oder Passwort ungültig" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "Jamendos beliebteste Stücke" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "Jamendos Top-Titel" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "Jamendos Top-Titel des Monats" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "Jamendos Top-Titel der Woche" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "Jamendo-Datenbank" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "Zum aktuellen Stück springen" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Knöpfe für %1 Sekunde halten..." #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Knöpfe für %1 Sekunden halten..." #: ../bin/src/ui_behavioursettingspage.h:193 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:193 msgid "Keep the original files" msgstr "Originale behalten" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "Kätzchen" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Sprache" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "Laptop/Kopfhörer" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Großer Raum" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "Großes Albumcover" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "Große Seitenleiste" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "Zuletzt gespielt" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "Benutzerdefiniertes Radio auf Last.fm: %1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Last.fm-Sammlung - %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "Last.fm Mix Radio - %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Last.fm-Nachbarschaft - %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Last.fm Radio Station %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Last.fm Ähnliche Interpreten wie %1" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Last.fm Tag Radio: %1" #: internet/lastfmservice.cpp:437 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:154 msgid "Last.fm password" msgstr "Passwort:" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "Last.fm-Abspielzähler" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Last.fm tags" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Benutzername:" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Last.fm Wiki" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "Am wenigsten gemochte Stücke" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "Beispiele: \"/dev/dsp\" , \"front\", usw. Leer lassen für Standardeinstellung." #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "Links" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Länge" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Sammlung" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "Benutzerdefinierte Gruppierung" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "Hinweis beim Neueinscannen der Bibliothek" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "Musiksammlung durchsuchen" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Begrenzungen" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "Titel auf Grooveshark aufgrund von Ihren bisherigen Hörgewohnheiten auswählen." #: ui/equalizer.cpp:123 msgid "Live" msgstr "Live" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Laden" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "Cover aus URL-Adresse laden" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "Cover aus URL-Adresse laden..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "Cover aus Datei laden" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "Cover von Datenträger wählen..." #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "Wiedergabeliste laden" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "Wiedergabeliste laden..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Last.fm-Radio wird geladen" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Lade MTP-Gerät" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "Lade iPod-Datenbank" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "Intelligente Wiedergabeliste wird geladen" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "Lade Titel" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "Lade Stream" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "Lade Stücke" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "Lade Stückinfo" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "Wird geladen ..." #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "Öffne Dateien/URLs und ersetze die Wiedergabeliste" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Anmelden" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "Anmeldung fehlgeschlagen" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "Langzeitvorhersage-Profil (LTP)" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "Lieben" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Niedrig (%1 fps)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "Niedrig (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "Geringe Komplexität - Profil (LC)" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "Liedtexte" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "Liedtexte von %1" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Magantune-Download" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Magnatune-Download beendet" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "Standard-Profil (MAIN)" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "Make it so!" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "Wiedergabeliste für die Offlinebenutzung verfügbar machen" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "Ungültige Antwort" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "Manuelle Proxy-Konfiguration" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "Manuell" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "Hersteller" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "Als gehört markieren" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "Als ungehört markieren" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "Alle Suchbegriffe kommen vor (UND)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "Mindestens ein Suchbegriff kommt vor (ODER)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "Maximale Bitrate" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "Mittel (%1 fps)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "Mittel (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "Art der Mitgliedschaft:" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "Minimale Bitrate" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "projectM-Voreinstellungen fehlen" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "Modell" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "Musiksammlung auf Änderungen hin überwachen" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "Mono-Wiedergabe" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "Monate" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "Stimmung" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "Stimmungsbarometer-Style" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "Stimmungsbarometer" #: library/library.cpp:74 msgid "Most played" msgstr "Meistgespielt" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "Einhängepunkt" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "Einhängepunkte" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "Nach unten" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "Zur Musiksammlung verschieben..." #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "Nach oben" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "Musik" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Musiksammlung" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "Stumm" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "Meine Last.fm-Musiksammlung" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "Mein Last.fm Mix Radio" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "Meine Last.fm-Nachbarn" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "Meine Last.fm-Empfehlungen" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "Mein Mix-Radio" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "Meine Musik" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "Meine Nachbarn" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "Meine Radiostation" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "Meine Empfehlungen" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Name" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "Benennungsoptionen" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "Schmal-Band (NB)" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "Nachbarn" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "Netzwerk" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "Netzwerk-Proxy" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "Netzwerk Fernsteuerung" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "Niemals" #: library/library.cpp:67 msgid "Never played" msgstr "Nie gespielt" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "Nie mit der Wiedergabe beginnen" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "Neuer Ordner" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "Neue Wiedergabeliste" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "Neue intelligente Wiedergabeliste" #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "Neue Titel" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "Neue Musiktitel werden automatisch hinzugefügt." #: library/library.cpp:80 msgid "Newest tracks" msgstr "Neueste Stücke" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "Weiter" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Nächstes Stück" #: core/utilities.cpp:147 msgid "Next week" msgstr "Nächste Woche" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "Keine Visualisierung" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "Kein Hintergrundbild" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "Keine Covers zum Exportieren." #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "Keine langen Blöcke" #: playlist/playlistcontainer.cpp:366 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:145 msgid "No short blocks" msgstr "Keine kurzen Blöcke" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "Nichts" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 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:155 msgid "Normal" msgstr "Standard" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "Normaler Blocktyp" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "Nicht verfügbar während eine dynamische Wiedergabeliste benutzt wird" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "Nicht verbunden" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "Nicht genug Inhalt" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "Nicht genug Fans" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "Nicht genug Mitglieder" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "Nicht genug Nachbarn" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Nicht installiert" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "Nicht angemeldet" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "Nicht eingehängt – doppelklicken zum Einhängen" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "Art der Benachrichtigung" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Benachrichtigungen" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Aktueller Musiktitel" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "OSD-Vorschau" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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 "Akzeptiere nur Verbindungen der folgenden IP Bereiche:\n10.x.x.x\n172.16.0.0 - 172.31.255.255\n192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:187 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:290 msgid "Opacity" msgstr "Deckkraft" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "%1 im Browser öffnen" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "&Audio-CD öffnen..." #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "OPML-Datei öffnen" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "Öffne OPML-Datei..." #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "Gerät öffnen" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "Datei öffnen..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "In Google Drive öffnen" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "In einer neuen Wiedergabeliste öffnen" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Öffnen..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "Aktion fehlgeschlagen" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "Auf Bitrate optimieren" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "Auf Qualität optimieren" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "Einstellungen..." #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "Dateien organisieren" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "Dateien organisieren..." #: core/organise.cpp:65 msgid "Organising files" msgstr "Dateien organisieren" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "Original Tags" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Weitere Optionen" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "Ausgabe" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "Ausgabegerät" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "Ausgabeoptionen" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "Ausgabe-Plugin" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "Alles überschreiben" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "Bestehende Dateien überschreiben" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "Nur kleinere überschrieben" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "Besitzer" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "Jamendo-Katalog wird eingelesen" #: ui/equalizer.cpp:124 msgid "Party" msgstr "Party" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "Passwort:" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Pause" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "Wiedergabe pausieren" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Pausiert" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "Interpret" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "Pixel" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "Einfache Seitenleiste" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Wiedergabe" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "Wiedergabe nach Interpret oder Stichwort" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "Spiele Künstler-Radio..." #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "Abspielzähler" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "Benutzerdefiniertes Radio abspielen..." #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "Wiedergeben wenn angehalten, pausieren bei Wiedergabe" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "Mit der Wiedergabe beginnen, falls gerade nichts anderes abgespielt wird" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "Spiele Tag-Radio..." #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "Spiele Stück Nummer der Wiedergabeliste" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "Abspielen/Pause" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Wiedergabe" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Player Einstellungen" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "Wiedergabeliste" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "Wiedergabeliste beendet" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "Wiedergabeliste einrichten" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "Art der Wiedergabeliste" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "Wiedergabelisten" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "Bitte Browser schließen und zu Clementine zurückkehren" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "Plugin-Status:" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "Podcasts" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Pop" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "Beliebte Titel" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "Beliebte Titel diesen Monat" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "Beliebte Titel Heute" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "Anzeigedauer:" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "Port" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "Vorverstärkung:" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "Einstellungen" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "Einstellungen..." #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "Bevorzugte Dateinamen für Cover (durch Komma getrennt):" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "Bevorzugtes Dateiformat:" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "Bevorzugte Bitrate:" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "Bevorzugtes Format" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "Premium-Streaming-Format:" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "Profil:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "Drücken Sie eine Knopfkombination für" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "Taste drücken" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Drücken Sie eine Tastenkombination für %1..." #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "Einstellungen für das Clementine-OSD" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "Vorschau" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "Vorheriger" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "Vorheriges Stück" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Versionsinformationen anzeigen" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "Profil" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "Fortschritt" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 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:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "Qualität" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "Gerät wird abgefragt..." #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "Warteschlangenverwaltung" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "Stücke in die Warteschlange einreihen" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "Stück in die Warteschlange einreihen" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "Radio (gleicher Pegel für alle Stücke)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "Radios" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "Regen" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "Zufällige Visualisierung" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "Bewerten Sie den aktuellen Titel 0 Sterne" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "Bewerten Sie den aktuellen Titel 1 Stern" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "Bewerten Sie den aktuellen Titel 2 Sterne" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "Bewerten Sie den aktuellen Titel 3 Sterne" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "Bewerten Sie den aktuellen Titel 4 Sterne" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "Bewerten Sie den aktuellen Titel 5 Sterne" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "Bewertung" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "Wirklich abbrechen?" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "Das \"Redirect Limit\" wurde überschritten, bitte überprüfen Sie die Server Einstellungen" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "Aktualisieren" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "Katalog neu laden" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "Kanäle aktualisieren" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "Freundesliste aktualisieren" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "Senderliste aktualisieren" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "Streams aktualisieren" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Reggae" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "Bewegung der Wii-Fernbedienung merken" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "Clementine starten wie es beendet wurde" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Entfernen" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "Aktion entfernen" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "Duplikate aus der Wiedergabeliste entfernen" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "Ordner entfernen" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "Von \"Meine Musik\" entfernen" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "Von Favoriten entfernen" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "Aus der Wiedergabeliste entfernen" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "Wiedergabeliste entfernen" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "Wiedergabeliste entfernen" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "Titel werden von \"Meine Musik\" entfernt" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "Titel werden von Favoriten entfernt" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "Die Wiedergabeliste \"%1\" umbenennen" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "Grooveshark-Wiedergabeliste umbenennen" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "Wiedergabeliste umbenennen" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "Wiedergabeliste umbenennen..." #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "Musiktitel in dieser Reihenfolge neu nummerieren..." #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Wiederholung" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "Album wiederholen" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "Wiedergabeliste wiederholen" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "Stück wiederholen" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Wiedergabeliste ersetzen" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "Die Wiedergabeliste ersetzen lassen" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "Ersetze Leerzeichen mit Unterstrichen" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "Replay Gain" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "Raplay Gain Modus" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "Neu bestücken" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "Authentifizierungs-Code erzwingen" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "Zurücksetzen" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" msgstr "Abspielzähler zurücksetzen" #: 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:206 msgid "Restrict to ASCII characters" msgstr "Nur ASCII-Zeichen benutzen" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "Wiedergabe beim Start fortsetzten" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "Abrufen von Grooveshark-\"Meine Musik\"-Titel" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "Rufe favorisierte Titel von Grooveshark ab" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "Rufe Grooveshark-Wiedergabelisten ab" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "Zu Clementine zurückkehren" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "Rechts" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "Ausführen" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "SOCKS-Proxy" #: internet/subsonicsettingspage.cpp:122 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:202 msgid "Safely remove device" msgstr "Gerät sicher entfernen" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "Das Gerät nach dem Kopiervorgang sicher entfernen" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "Abtastrate" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "Abtastrate" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr ".mood-Datei in Ihrer Musiksammlung speichern" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "Albumcover speichern" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "Cover auf Datenträger speichern..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "Bild speichern" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "Wiedergabeliste speichern" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "Wiedergabeliste speichern..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "Voreinstellung speichern" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "Speichere wenn möglich Bewertungen in Datei-Tags" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "Speichere wenn möglich Statistiken in Datei-Tags" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "Diesen Stream im Internet-Tab sichern" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "Speichere Titel-Statistiken in die Titel-Datei" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "Titel werden gespeichert" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "Scalable-Sampling-Rate-Profil (SSR)" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "Bildgröße anpassen" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "Rating" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "Stücke, die ich höre, \"scrobbeln\"" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "Suche" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "Suche nach Icecast-Sendern" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "Suche in Jamendo" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Magnatune durchsuchen" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "Suche Subsonic" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "Nach Covern suchen..." #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "Suche in allen Quellen" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "gpodder.net durchsuchen" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "iTunes durchsuchen" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "Suchmodus" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "Suchoptionen" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "Suchergebnisse" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "Suchbegriffe" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "Suche auf Grooveshark" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "Zweite Stufe" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "Zurückspulen" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "Vorspulen" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "Im aktuellen Stück vorspulen" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "Im aktuellen Stück zu einer Position springen" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "Alle auswählen" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "Auswahl aufheben" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "Hintergrundfarbe:" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "Hintergrundbild wählen" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "Wähle bestmögliche Übereinstimmung" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "Schriftfarbe:" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "Visualisierungen auswählen" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "Visualisierungen auswählen..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "Seriennummer" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "Server-URL" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "Server-Details" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "Dienst nicht verfügbar" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Setze %1 zu \"%2\"..." #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "Setze Lautstärke auf %" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "Wert für ausgewählte Stücke benutzen..." #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "Einstellungen" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Tastenkürzel" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "Tastenkürzel für %1" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Kürzel für %1 existiert bereits" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Anzeigen" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "Benachrichtigung anzeigen" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "Das aktuelle Stück mit einem animierten Glühen hervorheben" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "Stimmungsbarometer im Fortschrittsbalken anzeigen" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "Benachrichtigungen des Systems benutzen" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Zeige eine Benachrichtigung bei Änderung der Wiederholungsart bzw. des Zufallsmodus" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "Zeige eine Benachrichtigung bei Lautstärkenänderung" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "Blase aus dem Benachrichtigungsfeld" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "Clementine-OSD benutzen" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "Oberhalb der Statusleiste zeigen" #: ui/mainwindow.cpp:460 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:209 msgid "Show cover art in library" msgstr "Cover in Musiksammlung zeigen" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "Trenner anzeigen" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "In Originalgröße zeigen..." #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "Im Dateibrowser anzeigen" #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "Unter \"Verschiedene Interpreten\" anzeigen" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "Stimmungsbarometer anzeigen" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "Nur Duplikate anzeigen" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "Nur Stücke ohne Metadaten zeigen" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "Suchvorschläge anzeigen" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "\"Lieben\"- und \"Bannen\"-Knöpfe anzeigen" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "Das Scrobble-Zeichen im Hauptfenster zeigen" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "Clementine im Benachrichtigungsfeld anzeigen" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "Anzeigen, welche Quellen aktiviert und deaktiviert sind" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "Anzeigen/Ausblenden" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Zufallsmodus" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "Zufällige Albenreihenfolge" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "Zufällige Titelreihenfolge" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "Wiedergabeliste mischen" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "Zufällige Titelreihenfolge innerhalb eines Albums" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "Anmelden" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "Abmelden" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "Anmelden..." #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "Ähnliche Interpreten" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "Größe" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "Größe:" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "Voriges Stück in der Wiedergabeliste" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "Sprungzähler" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "Nächstes Stück in der Wiedergabeliste" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "Kleines Albumcover" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "schmale Seitenleiste" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "Intelligente Wiedergabeliste" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "Intelligente Wiedergabelisten" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "Titelinformationen" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "Titelinfo" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "Sonogramm" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "Sorry" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "Sortiert nach Genre (Alphabetisch)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "Sortiert nach Genre (nach Popularität)" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Sort by station name" msgstr "Sortiere 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" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "Quelle" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "Quellen" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "Fehler beim Anmelden bei Spotify" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "Spotify-Plugin" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "Spotify-Plugin nicht installiert" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "Standard" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "Markiert" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "Spiele das aktuelle Stück in der Wiedergabeliste ab" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "Konvertieren" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 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:405 #, qt-format msgid "Starting %1" msgstr "Starte %1" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "Starte..." #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "Sender" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Anhalten" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "Anhalten nach" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "Wiedergabe nach diesem Stück beenden" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Wiedergabe anhalten" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "Wiedergabe nach Stück anhalten" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "Angehalten" #: core/song.cpp:341 msgid "Stream" msgstr "Stream" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "Um von einem Subsonic-Server streamen zu können, wird nach Ablauf der 30-tägigen Versuchsperiode eine gültige Server-Lizenz benötigt." #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "Streamingmitgliedschaft" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "Abonnierte Wiedergabelisten" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "Abonnenten" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "Erfolg!" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "%1 erfolgreich geschrieben" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "Vorgeschlagene Tags" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "Kopfzeile:" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "Sehr hoch (%1 fps)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "Sehr hoch (2048x2048)" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "Unterstützte Formate" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "Jetzt die Statistiken mit den Dateien synchronisieren" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "Synchronisiere Spotify-Postfach" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "Synchronisiere Spotify-Wiedergabeliste" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "Synchronisiere markierte Stücke von Spotify" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "Systemfarben" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "Tabs oben" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Stichwort" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "Tag-Sammler" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "Tag-Radio" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "Ziel-Bitrate" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "Texteinstellungen" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Dank an" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Der Befehl \"%1\" konnte nicht ausgeführt werden." #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "Das Albumcover des gerade abgespielten Titels" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "Ordner %1 ist ungültig" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "Die Wiedergabeliste \"%1\" ist leer oder konnte nicht geladen werden." #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "Die angeforderte Seite ist kein Bild!" #: internet/subsonicsettingspage.cpp:98 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:2083 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 Musiksammlung, damit die folgenden neuen Funktionen genutzt werden können:" #: library/libraryview.cpp:529 msgid "There are other songs in this album" msgstr "Dieses Album enthält auch andere Titel" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "Bei der Kommunikation mit gpodder.net trat ein Fehler auf" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Beim Holen der Metadaten von Magnatune ist ein Fehler aufgetreten" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Es gab Probleme, die Antwort von iTunes auszulesen" #: ui/organiseerrordialog.cpp:56 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:389 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:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 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:187 msgid "These folders will be scanned for music to make up your library" msgstr "Diese Ordner werden für Ihre Musiksammlung durchsucht:" #: ../bin/src/ui_transcodersettingspage.h:174 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 konvertieren\"-Fenster und beim Konvertieren von Musik vor der Übertragung auf ein Gerät verwendet." #: ../bin/src/ui_groupbydialog.h:151 msgid "Third level" msgstr "Dritte Stufe" #: internet/jamendoservice.cpp:171 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/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "Das Album ist im gewünschten Format nicht verfügbar" #: ../bin/src/ui_deviceproperties.h:381 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:375 msgid "This device supports the following file formats:" msgstr "Dieses Gerät unterstützt die folgenden Dateiformate:" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Dieses Gerät wird nicht ordnungsgemäß funktionieren" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Diese Einstellung kann in den \"Verhalten\" Einstellungen geändert werden" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "Dieser Stream ist nur für zahlende Kunden verfügbar" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "Diese Geräteart wird nicht unterstützt: %1" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "Zeitüberschreitung:" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Titel" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "Bevor Sie das Grooveshark-Radio verwenden, sollten Sie zuerst ein paar andere Titel auf Grooveshark hören." #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "Heute" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "Clementine-OSD anzeigen" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Vollbild an/aus" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "Einreihungsstatus ändern" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "Scrobbeln ein- oder ausschalten" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Sichtbarkeit des Clementine-OSD anpassen" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "Morgen" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "Zu viele Umleitungen" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "Top-Titel" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "Gesammte Alben:" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "Insgesamt übertragene Bytes" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "Insgesamt gestellte Netzwerkanfragen" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Stück" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "Musik konvertieren" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "Log" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "Konvertierung" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Konvertiere %1 Dateien mit %2 Prozessen" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "Konvertierungsoptionen" #: core/song.cpp:338 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "Turbine" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "Ausschalten" #: devices/giolister.cpp:161 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "URL(s)" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "Ubuntu One passwort" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "Ubuntu One benutzername" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "Ulte Weit Band (UWB)" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Konnte %1 nicht herunterladen (%2)" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Unbekannt" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "Unbekannter Inhalt" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Unbekannter Fehler" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "Cover entfernen" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "Abonnement kündigen" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "Nächste Konzerte" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "Aktualisiere Grooveshark-Wiedergabelisten" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "Alle Podcasts aktualisieren" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "Musiksammlung aktualisieren" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "Musiksammlung beim Programmstart aktualisieren" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "Diesen Podcast aktualisieren" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "Aktualisieren" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Aktualisiere %1" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "Aktualisiere %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Aktualisiere Musiksammlung" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "Benutzung" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "Wenn verfügbar Album-Interpret benutzen" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "Gnome-Tastenkürzel verwenden" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "Benutze Replay-Gain-Metadaten wenn verfügbar" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "SSLv3 verwenden" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "Wii-Fernbedienung benutzen:" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "Ein benutzerdefiniertes Farbschema verwenden" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "Einen benutzerdefinierten Text für Benachrichtigungen benutzen" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "Eine Netzwerk Fernsteuerung verwenden" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "Authentifizierung verwenden" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "Bit-Raten-Management verwenden" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "Benutze dynamischen Modus" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "Benachrichtigungen zum Anzeigen des Status der Wii-Fernbedienung benutzen" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "\"Temporal Noise-Shaping\" verwenden" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "Standardeinstellungen des Systems benutzen" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "Das Farbschema des Systems verwenden" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "Verwende Proxy-Einstellungen des Betriebssystems" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "Lautstärkepegel angleichen" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "Belegt" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "Der Benutzer %1 besitzt kein Grooveshark-Anywhere-Konto." #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "Benutzeroberfläche" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Benutzername:" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "Beim Hinzufügen eines Titels über das Kontextmenü..." #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "Variable Bitrate" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "Verschiedene Interpreten" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "Version %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "Ansicht" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "Art der Visualisierung" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "Visualisierungen" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "Visualisierungs-Einstellungen" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "Stimmen-Aktivitäts Erkennung" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "Lautstärke %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "Hinweis beim Schließen einer Wiedergabeliste anzeigen" #: core/song.cpp:337 msgid "Wav" msgstr "WAV" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "Internetseite" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "Wochen" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "Beim Programmstart" #: ../bin/src/ui_librarysettingspage.h:204 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 Cover-Bildern 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "Wenn die Liste leer ist..." #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "Versuchen Sie zum Beispiel:" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "Weit Band (WB)" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii-Fernbedienung %1 aktiviert" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii-Fernbedienung %1 verbunden" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii-Fernbedienung %1: Ladestand kritisch (%2%) " #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii-Fernbedienung %1 deaktiviert" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii-Fernbedienung %1 getrennt" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii-Fernbedienung %1: Ladestand niedirg (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "Windows Media Audio" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "Ohne Cover:" #: library/libraryview.cpp:530 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:2088 msgid "Would you like to run a full rescan right now?" msgstr "Möchten Sie jetzt Ihre Musiksammlung erneut einlesen?" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "Speichere alle Titel-Statistiken in die Titel-Dateien" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "Benutzername oder Passwort falsch." #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "Jahr" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "Jahr – Album" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "Jahre" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "Gestern" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "Die Folgenden Alben werden jetzt heruntergeladen" #: playlist/playlistlistcontainer.cpp:311 #, 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:177 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:172 msgid "You are not signed in." msgstr "Sie sind nicht angemeldet." #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "Sie sind angemeldet als %1." #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "Sie sind angemeldet." #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "Sie können hier einstellen, wie Ihre Musiksammlung sortiert wird." #: internet/digitallyimportedsettingspage.cpp:46 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 Streams mit höherer Audioqualität." #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "Sie können zur gleichen Zeit Hintergrundstreams und andere Musik hören." #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "Sie können Musik kostenlos \"scrobbeln\", aber nur zahlende Last.fm-Kunden können Last.fm-Radio mit Clementine hören." #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "Sie haben kein Grooveshark-Anywhere-Konto." #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Sie haben kein Spotify-Premium-Konto." #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "Sie haben kein aktives Abonnement." #: internet/spotifyservice.cpp:170 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 erneut in den Einstellungen für Spotify an." #: internet/spotifysettingspage.cpp:158 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:87 msgid "You love this track" msgstr "Sie lieben dieses Stück" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "Öffnen Sie die Systemeinstellungen und aktivieren Sie \"Zugriff für Hilfsgeräte aktivieren\" in \"Bedienhilfen\" um Clementines Tastenkürzel zu benutzen." #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "Sie müssen Clementine nach dem Ändern der Sprache neustarten." #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "Sie werden kein Last.fm-Radio abspielen können, da sie kein Last.fm-Abonnent sind." #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "Deine IP:" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Ihre Last.fm-Daten sind falsch" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "Ihre Magnatune-Anmeldedaten sind falsch" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "Ihre Musiksammlung ist leer!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "Meine Internetradios" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "Ihre Scrobbles: %1" #: visualisations/visualisationcontainer.cpp:152 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/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "Ihr Benutzername und/oder Passwort sind ungültig." #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Null" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "%n Titel hinzufügen" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "nach" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "vor" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "und" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "automatisch" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "vor" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "zwischen" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "größte zuerst" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "BPM" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "enthält" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "abgeschaltet" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "CD %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "enthält nicht" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "endet mit" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "entspricht" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "gpodder.net" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "gpodder.net Verzeichnis" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "größer als" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "in den letzten" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "Kb/s" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "kleiner als" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "längste zuerst" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "Verschiebe %n Titel" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "neueste zuerst" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "keine Übereinstimmungen" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "nicht in den letzten" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "nicht auf" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "älteste zuerst" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "am" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "Einstellungen" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "oder den QR code einscannen!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "Drücken Sie die Eingabetaste" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "%n Titel entfernen" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "kürzeste zuerst" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "Titel mischen" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "kleinste zuerst" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "Titel sortieren" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "beginnt mit" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "Anhalten" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "Stück %1" clementine-1.2.0+dfsg/src/translations/el.po000066400000000000000000005636621223327513400210500ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Antony_256 , 2011, 2012 # axil Pι , 2013 # axil Pι , 2012 # firewalker , 2013 # firewalker , 2011-2012 # Nisok Kosin , 2012 # Wasilis , 2013 # Wasilis Mandratzis , 2013 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-18 16:12+0000\n" "Last-Translator: firewalker \n" "Language-Team: Greek (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr " ημέρες" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " σημ" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " δευτερόλεπτα" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " τραγούδια" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 άλμπουμ" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 ημέρες" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "Πριν %1 ημέρες" #: podcasts/gpoddersync.cpp:79 #, 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:413 #, qt-format msgid "%1 selected of" msgstr "%1 επιλεγμένα από" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 τραγούδι" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 τραγούδια" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "βρέθηκαν %1 τραγούδια" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "βρέθηκαν %1 τραγούδια (εμφάνιση %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 κομμάτια" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 μεταφέρθηκε" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Άρθρωμα Wiimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n απέτυχε" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n ολοκληρώθηκε" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "&Προσωπική" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "&Extras" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "Βοήθεια" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "Απόκρυψη %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "Απόκρυψη..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Αριστερά" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "Μουσική" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Καμία" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "Λίστα αναπαραγωγής" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Έξοδος" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "Λειτουργία &επανάληψης " #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Δεξιά" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "Λειτουργία &ανακατέματος" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "Επέκταση των στηλών για να χωρέσει το παράθυρο" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "Εργαλεία" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(διαφορετικό ανάμεσα σε πολλαπλά τραγούδια)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "...και σε όλους τους συνεισφέροντες του Amarok" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "0px" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 ημέρα" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 κομμάτι" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "127.0.0.1" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "40%" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 τυχαία τραγούδια" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "Αναβάθμιση σε Premium τώρα" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "Δημιουργια νέου λογαριασμόυ ή επαναφορα του κωδικό πρόσβασής σας" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "Απαιτείτε ένας λογαρισμός Grooveshark Anywhere." #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "Απαιτείται premium λογαριασμός Spotify." #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "Ένας πελάτης μπορεί να συνδεθεί, μόνο αν έχει εισαχθεί ο σωστός κωδικός." #: smartplaylists/wizard.cpp:78 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:153 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Το τραγούδι θα συμπεριληφθεί στην λίστα αναπαραγωγής αν πληρεί αυτές τις συνθήκες." #: smartplaylists/searchterm.cpp:297 msgid "A-Z" msgstr "Α-Ω" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "ΟΛΗ Η ΔΟΞΑ ΣΤΟΝ HYPNOTOAD" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "Ματαίωση" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "Περί %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "Περί του Clementine..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "Περί του Qt..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Λεπτομέρειες λογαριασμού" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "Λεπτομέρειες λογαριασμού (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Ενέργεια" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Ενεργοποίηση/απενεργοποίηση Wiiremote" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "Προσθήκη Podcast" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Προσθήκη ροής" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "Προσθήκη νέας γραμμής αν υποστηρίζεται από τον τύπο ειδοποιήσεων" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "Προσθήκη ενέργειας" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Προσθήκη άλλης ροής..." #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Προσθήκη καταλόγου..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "Προσθήκη αρχείου" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "Προσθήκη αρχείου για επανακωδικοποίηση" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "Προσθήκη αρχείου(ων) για επανακωδικοποίηση" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Προσθήκη αρχείου..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Προσθήκη αρχείων για επανακωδικοποίηση" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Προσθήκη φακέλου" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Προσθήκη φακέλου" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Προσθήκη νέου φακέλου..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "Προσθήκη podcast" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "Προσθήκη podcast..." #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Προσθήκη όρου αναζήτησης" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "Προσθήκη ετικέτας άλμπουμ του τραγουδιού" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "Προσθήκη ετικέτας άλμπουμ-καλλιτέχνη του τραγουδιού" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "Προσθήκη ετικέτας καλλιτέχνη του τραγουδιού" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "Προσθήκη αυτόματου σκορ τραγουδιού" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "Προσθήκη ετικέτας συνθέτη του τραγουδιού" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "Προσθήκη ετικέτας δίσκου του τραγουδιού" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "Προσθήκη ονόματος αρχείου τραγουδιού" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "Προσθήκη ετικέτας είδους του τραγουδιού" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "Προσθήκη ετικέτας ομαδοποίησης τραγουδιού" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "Προσθήκη ετικέτας μήκους του τραγουδιού" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "Προσθήκη ετικέτας εκτελεστή τραγουδιού" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "Προσθήκη ετικέτας σειράς του τραγουδιού" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "Προσθήκη βαθμολογίας τραγουδιού" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "Προσθήκη τραγουδιού για παράληψη της σειράς" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "Προσθήκη ετικέτας τίτλου τραγουδιού" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "Προσθήκη ετικέτας αριθμού τραγουδιού" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "Προσθήκη ετικέτας χρονολογίας τραγουδιού" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Προσθήκη ροής..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "Προσθήκη στα αγαπημένα του " #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "Προσθήκη στη λίστα του " #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "Προσθήκη σε άλλη λίστα" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Προσθήκη στη λίστα" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "Προσθήκη στην λίστα αναμονής" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Προσθήκη ενέργειας wiimotedev" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Προσθήκη..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Προστέθηκε αυτόν τον μήνα" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Προστέθηκε αυτή την εβδομάδα" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Προστέθηκε φέτος" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Προστέθηκε σήμερα" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Προστέθηκε εντός τριών μηνών" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "Προστήθονται τραγούδια στην Μουσική Μου" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "Προσθήκη τραγουδιού στα αγαπημένα" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Προχωρημένη ομαδοποίηση..." #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "Μετά " #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "Μετά την αντιγραφή..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Άλμπουμ" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Άλμπουμ (ιδανική ένταση για όλα τα κομμάτια)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Καλλιτέχνης άλμπουμ" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "Εξώφυλλο άλμπουμ" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Πληρ. άλμπουμ στο jamendo.com..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Άλμπουμ με εξώφυλλα" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Άλμπουμ χωρίς εξώφυλλα" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Όλα τα αρχεία (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "Όλη η δόξα στον Hypnotoad!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Όλα τα άλμπουμ" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Όλοι οι καλλιτέχνες" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "Όλα τα αρχεία (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Όλες οι λίστες αναπαραγωγής (%1)" #: ui/about.cpp:74 msgid "All the translators" msgstr "Όλοι οι μεταφραστές" #: library/library.cpp:84 msgid "All tracks" msgstr "Όλα τα κομμάτια" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "Επιτρέψτε στον πελάτη να κατεβάσει μουσική από αυτόν τον υπολογιστή." #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "Επιτρέπονται λήψεις" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "Επιτρέψτε μέση/πλάγια κωδικοποίηση" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "Παράλληλα με τα πρωτότυπα" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Να κρύβεις πάντα το κύριο παράθυρο" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Να εμφανίζεις πάντα το κύριο παράθυρο" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "Έναρξη αναπαραγωγής πάντα" #: internet/spotifyblobdownloader.cpp:60 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:61 msgid "An error occurred loading the iTunes database" msgstr "Προέκυψε σφάλμα στην φόρτωση της βάσης δεδομένων iTunes" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Προέκυψε σφάλμα κατά την εγγραφή μεταδεδομένων στο '%1'" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "Προκλήθηκε ένα μη διευκρινισμένο σφάλμα." #: ui/about.cpp:78 msgid "And:" msgstr "Και:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "Angry" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Εμφάνιση" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Προσάρτηση αρχείων/URLs στην λίστα αναπαραγωγής" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "Προσάρτηση στην τρέχουσα λίστα αναπαραγωγής" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "Προσάρτηση στην λίστα αναπαραγωγής" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "Εφαρμογή συμπίεσης για αποφυγή κολλημάτων" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Είστε σίγουροι πως θέλετε να διαγράψετε τη ρύθμιση \"%1\";" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "Είστε σίγουρος πως θέλετε να διαγράψετε αυτή την λίστα αναπαραγωγής;" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "Είστε σίγουροι πως θέλετε να επαναφέρετε τα στατιστικά του τραγουδιού;" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Καλλιτέχνης" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Πληρ. καλλιτέχνη" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "Ραδιόφωνο καλλιτέχνη" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "Ετικέτες Καλλιτέχνη" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "Αρχικά του καλλιτέχνη" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Διαμόρφωση ήχου (format)" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Η πιστοποίηση απέτυχε" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "Συγγραφέας" #: ui/about.cpp:65 msgid "Authors" msgstr "Δημιουργοί" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Αυτόματα" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Αυτόματη ενημέρωση" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "Άνοιξε αυτόμα τις μόνες κατηγορίες του δέντρου της βιβλιοθήκης" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "Διαθέσιμα" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "Μέσος ρυθμός bit" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "Μέσο μέγεθος εικόνας" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "BBC Podcasts" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "Ροές Παρασκηνίου" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Χρώμα φόντου" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "Εικόνα φόντου" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Διαφάνεια φόντου" #: core/database.cpp:734 msgid "Backing up database" msgstr "Αντίγραφο ασφαλείας της βάσης δεδομένων" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "Ισορροπία" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Απαγόρευση" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "Μπάρες" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Βασικό μπλε" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "Βασικός τύπος ήχου" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Συμπεριφορά" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "Βέλτιστος" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "Βιογραφία από %1" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Ρυθμός bit" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "Ρυθμός bit" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "Block" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "Τύπος μπλοκ" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "Ποσοστό θολώματος" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "Σώμα" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "Boom" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Αναζήτηση..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "Διάρκεια του buffer" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "Αποθήκευση" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "Αλλά αυτές οι πηγές είναι απενεργοποιημένες:" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Κουμπιά" #: core/song.cpp:339 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "Υποστήριξη φύλλων CUE" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "Άκυρο" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Αλλαγή εξώφυλλου καλλιτέχνη" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Αλλαγή μεγέθους γραμματοσειράς..." #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "Αλλάξτε μέθοδο επανάληψης" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Αλλαγή συντόμευσης..." #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "Αλλάξτε μέθοδο ανάμιξης" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Αλλαγή γλώσσας" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "Η αλλαγή αναπαραγωγής mono θα ενεργοποιηθεί για τα επόμενα τραγούδια " #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "Έλεγχος για νέα επεισόδια" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Έλεγχος για ενημερώσεις" #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "Επιλέξτε ένα όνομα για την έξυπνη λίστα αναπαραγωγής" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Αυτόματη επιλογή" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Επέλεξε χρώμα..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "Επιλογή γραμματοσειράς..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Επιλογή από τη λίστα" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Επιλέξτε πως θα ταξινομηθεί η λίστα αναπαραγωγής και πόσα τραγούδια θα περιέχει." #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "Επιλογή φακέλου για αποθήκευση του podcast" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Επιλέξτε τις ιστοσελίδες που θέλετε να χρησιμοποιεί ο Clementine όταν ψάχνει για στοίχους." #: ui/equalizer.cpp:115 msgid "Classical" msgstr "Κλασσική" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "Καθάρισμα" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Καθαρισμός" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Καθαρισμός λίστας" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Σφάλμα του Clementine." #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Clementine πορτοκαλί" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Οπτικά εφέ Clementine" #: ../bin/src/ui_deviceproperties.h:376 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Ο Clementine μπορεί να μετατρέψει αυτόματα την μουσική που αντιγράφετε σε αυτή την συσκευή σε μία μορφή που μπορεί να αναπαράγει." #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "Ο Clementine μπορεί να αναπαράγει μουσική που έχετε μεταφορτώσει στο Box" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Ο Clementine μπορεί να αναπαράγει μουσική που έχετε ανεβάσει στο Dropbox. " #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Ο Clementine μπορεί να αναπαράγει μουσική που έχετε μεταφορτώσει στο Google Drive" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "Ο Clementine μπορεί να αναπαράγει μουσική που έχετε ανεβάσει στο Ubuntu One. " #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "Το Clementine μπορεί να δείχνει ένα μήνυμα όταν το κομμάτι αλλάζει." #: ../bin/src/ui_podcastsettingspage.h:250 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:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Ο Clementine δεν μπορεί να φορτώσει κάποιο projectM οπτικό εφέ. Βεβαιωθείτε πως έχετε εγκαταστήσει τον Clementine σωστά." #: internet/lastfmsettingspage.cpp:110 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 "Ο Clementine δεν μπόρεσε να βρει την κατάσταση της συνδρομή σας μιας και υπάρχει πρόβλημα με την σύνδεσή σας. Τα κομμάτια που παίξατε θα αποθηκευτούν προσωρινά και θα σταλούν στο Last.fm αργότερα." #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Προβολή εικόνων του Clementine" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "Ο Clementine δεν μπόρεσε να βρει αποτελέσματα για αυτό το αρχείο" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "Ο Clementine θα βρει μουσική στο:" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Κλικ εδώ για να προσθέσετε μουσική" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "\"Κλικ\" για εναλλαγή μεταξύ συνολικού και εναπομείναντα χρόνου" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "Κλείσιμο της λίστας αναπαραγωγής" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "Κλείσιμο οπτικών εφέ" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "Το κλείσιμο του παραθύρου θα ακυρώσει το \"κατέβασμα\"." #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "Το κλείσιμο του παραθύρου θα σταματήσει την αναζήτηση για εξώφυλλα άλμπουμ." #: ui/equalizer.cpp:116 msgid "Club" msgstr "Club" #: ../bin/src/ui_appearancesettingspage.h:272 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:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Σχόλια" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "Συμπλήρωση των ετικετών αυτόματα" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "Συμπλήρωση των ετικετών αυτόματα..." #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Συνθέτης" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "Ρύθμιση %1..." #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "Παραμετροποίηση του GrooveShark..." #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Παραμετροποίηση Last.fm..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "Ρύθμιση του Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Ρύθμιση συντομεύσεων" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "Ρύθμιση του Spotify..." #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "Ρύθμιση του Subsonic..." #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "Ρύθμιση καθολικής αναζήτησης..." #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "Παραμετροποίηση της βιβλιοθήκης" #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "Ρύθμιση των podcasts..." #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "Παραμετροποίηση..." #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "Σύνδεση των χειριστηρίων Wii χρησιμοποιώντας την ενέργεια ενεργοποίηση/απενεργοποίηση" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "Σύνδεση συσκευής" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "Σύνδεση στο Spotify" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "Ο διακομιστής αρνήθηκε τη σύνδεση, ελέγξτε το URL του διακομιστή. Παράδειγμα: http://localhost:4040/" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Η σύνδεση διακόπηκε, ελέγξτε το URL του διακομιστή. Παράδειγμα: http://localhost:4040/" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "Κονσόλα" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "Σταθερός ρυθμός bit" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "Μετατροπή όλης της μουσικής" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "Μετατροπή κάθε μουσικής που η συσκευή δεν μπορεί να αναπαράγει" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "Αντιγραφή στο πρόχειρο" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Αντιγραφή στην συσκευή..." #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Αντιγραφή στην βιβλιοθήκη..." #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "Πνευματικά δικαιώματα" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Δεν μπορεί να γίνει σύνδεση με το Subsonic, ελέγξτε το URL του διακομιστή. Παράδειγμα: http://localhost:4040/" #: transcoder/transcoder.cpp:64 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Δεν μπόρεσε να δημιουργηθεί το στοιχείο \"%1\" του GStreamer - βεβαιωθείτε ότι έχετε όλα τα απαραίτητα πρόσθετα του GStreamer εγκατεστημένα" #: transcoder/transcoder.cpp:432 #, 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:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Δεν βρέθηκε κάποιος κωδικοποιητής (encoder) για %1, ελέγξτε πως έχετε τα σωστά πρόσθετα του GStreamer εγκατεστημένα" #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "Δεν μπόρεσε να γίνει φόρτωση του ραδιοσταθμού last.fm" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "Δεν μπορεί να ανοίξει το αρχείο εξόδου %1" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Διαχείριση εξώφυλλων" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "Εξώφυλλο από ενσωματωμένη εικόνα" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Το εξώφυλλο φορτώθηκε αυτόματα από %1" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "Το εξώφυλλο αφαιρέθηκε χειροκίνητα" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "Δεν έχει οριστεί εξώφυλλο" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "Το εξώφυλλο ορίστηκε από %1" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "Εξώφυλλα από %1" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "Δημιουργία μίας νέας λίστας αναπαραγωγής " #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "Χρήση «Cross-Fade» κατά την αυτόματη αλλαγή του κομματιού" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "Χρήση «Cross-Fade» κατά την χειροκίνητη αλλαγή του κομματιού" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "Προσαρμοσμένο" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "Προσωπική εικόνα:" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "Προσαρμοσμένες ρυθμίσεις μηνύματος" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "Προσαρμοσμένο ράδιο" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Προσωπική..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "Διαδρομή του DBus" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Dance" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Ημερομηνία δημιουργίας" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Ημερομηνία τροποποίησης" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "Ημέρες" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "Προ&επιλογή" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "Μείωση της έντασης ήχου κατά 4%" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "Μείωση του ήχου κατά της εκατό" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Μείωση έντασης" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "Προεπιλεγμένη εικόνα φόντου" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "Προκαθορισμένα" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "Καθυστέρηση μεταξύ οπτικών εφέ" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "Διαγραφή" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "Διαγραφή της λίστας αναπαραγωγής " #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "Διαγραφή δεδομένων που έχουν \"κατέβει\"" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Διαγραφή αρχείων" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Διαγραφή από την συσκευή..." #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Διαγραφή από τον δίσκο..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "Διαγραφή επεισοδίων που έχουν αναπαραχθεί" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "Διαγραφή ρύθμισης" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "Διαγραφή έξυπνης λίστας αναπαραγωγής" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "Διαγραφή των αρχικών αρχείων" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Γίνεται διαγραφή αρχείων" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "Αφαίρεση των επιλεγμένων κομματιών από την λίστα αναμονής" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "Αφαίρεση του κομματιού από την λίστα αναμονής" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Προορισμός" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Λεπτομέρειες..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Συσκευή" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Ιδιότητες συσκευής" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Όνομα συσκευής" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Ιδιότητες συσκευής..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Συσκευές" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Εννοούσατε" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "Ψηφιακά εισηγμένο" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "Ψηφιακά εισηγμένο συνθηματικό" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "Ψηφιακά εισηγμένο όνομα χρήστη" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "Απευθείας σύνδεση στο διαδίκτυο" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Κατάλογος" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "Απενεργοποίηση διάρκειας" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "Απενεργοποίηση δημιουργίας moodbar " #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Απενεργοποιημένο" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Δίσκος" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "Διακεκομμένη μετάδοση" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "Επιλογές απεικόνισης" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Απεικόνιση της «απεικόνισης στην οθόνη»" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "Εκτελέστε μία πλήρη επανασάρωση της βιβλιοθήκης" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "Μην μετατρέπεις την μουσική" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "Να μην γίνει αντικατάσταση" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Χωρίς επανάληψη" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "Αφαίρεση από τους διάφορους καλλιτέχνες" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "Χωρίς ανακάτεμα" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "Μην σταματάς!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "Δωρεά" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Διπλό «κλικ» για άνοιγμα" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "Διπλό \"κλικ\" σε ένα τραγούδι θα..." #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "Λήψη %n επεισοδίων" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "Φάκελος λήψης" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "Αποθήκευση επεισοδίων στο" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "\"Κατέβασμα\" συνδρομής" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "Αυτόματη λήψη νέων επεισοδίων" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "Η λήψη μπήκε στην αναμονή" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "Λήψη της Android εφαρμογής" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Λήψη αυτού του άλμπουμ" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Μεταφόρτωση αυτού του άλμπουμ..." #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "Λήψη αυτού του επεισοδίου" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "Λήψη..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "Λήψη του (%1%)..." #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "Μεταφόρτωση καταλόγου Icecast" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "Μεταφόρτωση καταλόγου Jamendo" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "Μεταφόρτωση καταλόγου του Magnatune" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "Λήψη πρόσθετου για το Spotify" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "Λήψη μεταδεδομένων" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "Σύρετε για μετακίνηση" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "Dropbox" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "Η δυναμική λειτουργία είναι ενεργή" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "Δυναμική τυχαία ανάμιξη" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "Τροποποίηση έξυπνης λίστας αναπαραγωγής" #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Τροποποίηση ετικέτας \"%1\"..." #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "Τροποποίηση ετικέτας..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "Επεξεργασία ετικετών" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Τροποποίηση πληροφοριών κομματιού" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "Τροποποίηση πληροφοριών κομματιού..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Επεξεργασία πληροφοριών των κομματιών..." #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Επεξεργασία..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "Ενεργοποίηση της υποστήριξης χειριστηρίων Wii" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "Ενεργοποίηση του ισοσταθμιστή" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "Ενεργοποίηση των συντομεύσεων μόνο όταν ο Clementine είναι στο προσκήνιο" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Ενεργοποιήστε τις παρακάτω πηγές για να τις συμπεριλάβετε στα αποτελέσματα. Τα αποτελέσματα θα εμφανιστούν με αυτή την σειρά." #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "Ενεργοποίηση/απενεργοποίηση του Last.fm scrobbling" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "Περιπλοκότητα κωδικοποίησης" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "Ποιότητα μηχανής κωδικοποίησης" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "Ρυθμός κωδικοποίησης" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "Εισάγετε ένα URL" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "Εισάγετε μία διεύθυνση για να μεταφορτώσετε ένα εξώφυλλο από το διαδίκτυο:" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "Εισάγετε όνομα για τα εξαγώγιμα εξώφυλλα (χωρίς επέκταση):" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "Εισαγωγή νέου ονόματος για την λίστα αναπαραγωγής" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Εισάγετε έναν καλλιτέχνη ή ετικέτα για να ξεκινήσετε να ακούτε Last.fm." #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Εισάγετε όρους αναζήτησης παραπάνω για να βρείτε μουσική στον υπολογιστή σας και στο Διαδίκτυο." #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Εισάγετε τους όρους αναζήτησης παρακάτω για να βρείτε podcasts στο iTunes" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Εισάγετε τους όρους αναζήτησης παρακάτω για να βρείτε podcasts στο gpodder.net" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "Εισάγετε όρους αναζήτησης εδώ" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "Εισαγωγή της διεύθυνσης μιας ροής ραδιοφώνου:" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "Εισάγεται το όνομα του φακέλου" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "Εισάγετε αυτή την IP στο App για να συνδεθεί στον Clementine." #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "Ολόκληρη η συλλογή" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Σφάλμα" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Σφάλμα σύνδεσης συσκευής MTP" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "Σφάλμα κατά την αντιγραφή τραγουδιών" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "Σφάλμα κατά την διαγραφή τραγουδιών" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "Σφάλμα στην λήψη του πρόσθετου του Spotify" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "Σφάλμα φόρτωσης του %1" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Σφάλμα φόρτωσης λίστας από το di.fm" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "Σφάλμα επεξεργασίας %1: %2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "Σφάλμα κατά την φόρτωση CD ήχου" #: library/library.cpp:63 msgid "Ever played" msgstr "Ενίοτε έπαιξαν" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "Κάθε 10 λεπτά" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "Κάθε 12 ώρες" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "Κάθε 2 ώρες" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "Κάθε 20 λεπτά" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "Κάθε 30 λεπτά" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "Κάθε 6 ώρες" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "Κάθε ώρα" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Εκτός μεταξύ δύο κομματιών στο ίδιο άλμπουμ ή στο ίδιο φύλλο CUE" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "Υπάρχοντα εξώφυλλα" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "Επέκταση" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "Λίγει σε %1" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "Εξαγωγή Εξώφυλλων" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "Εξαγωγή εξώφυλλων" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "Εξαγωγή μεταφορτωμένων εξώφυλλων" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "Εξαγωγή ενσωματωμένων εξώφυλλων" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "Η εξαγωγή ολοκληρώθηκε" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "Εξαγωγή %1 εξώφυλλων από τα %2 (%3 παραλείφθηκαν)" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "Fade out κατά την παύση / fade in κατά τη συνέχιση" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "«Σβήσιμο» κατά την παύση του κομματιού" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "«Σβήσιμο»" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "Διάρκειας «Σβησίματος»" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "Αποτυχία λήψης του καταλόγου" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "Αποτυχία λήψης των podcasts" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "Αποτυχία φόρτωσης podcast" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "Αποτυχία ανάλυσης της XML από αυτό το RSS" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "Γρήγορη" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "Αγαπημένα" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "Αγαπημένα κομμάτια" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "Κατέβασμα εξώφυλλων που λείπουν" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "Αυτόματο κατέβασμα" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "Η ανάκτηση ολοκληρώθηκε" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "Μεταφόρτωση καταλόγου Subsonic" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Σφάλμα στο κατέβασμα του εξώφυλλου" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "Επέκταση αρχείου" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "Μορφή αρχείων" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Όνομα αρχείου" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "Όνομα αρχείου (χωρίς διαδρομή)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Μέγεθος αρχείου" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Τύπος αρχείου" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Όνομα αρχείου" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Αρχεία" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "Αρχεία για επανακωδικοποίηση" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "Εύρεση τραγουδιών στην βιβλιοθήκη που πληρούν τα κριτήρια που ορίσατε." #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "Αναγνώριση τραγουδιού" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "Τέλος" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "Πρώτο επίπεδο" #: core/song.cpp:328 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Μέγεθος γραμματοσειράς" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Για λόγους αδειοδότησης η υποστήριξη για το Spotify γίνεται ξεχωριστά." #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "Επιβολή κωδικοποίησης mono" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "«Ξέχνα» την συσκευή" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Μορφή" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "Μορφή" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Ρυθμός καρέ" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "Πλαίσια ανά απομονωτή (buffer)" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Φίλοι" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "Frozen" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Πλήρως μπάσα" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "Πλήρως μπάσα και πρίμα" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "Πλήρως πρίμα" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "GStreamer, μηχανή ήχου" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "Γενικά" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Γενικές ρυθμίσεις" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Είδος" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "Λήψη URL για να μοιραστείτε αυτή την Grooveshark λίστα" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "Λήψη URL για να μοιραστείτε αυτή το Grooveshark τραγούδι" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "Λήψη δημοφιλών τραγουδιών από το Grooveshark" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "Λήψη καναλιών" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "Λήψη ροών" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "Δώστε του ένα όνομα:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "Εκκίνηση" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "Πήγαινε στην επόμενη πινακίδα της λίστας" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "Πήγαινε στην προηγούμενη πινακίδα της λίστας" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "Έγινε λήψη %1 εξώφυλλων από τα %2 (%3 απέτυχαν)" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "Σκίαση στην λίστα τραγουδιών που δεν υπάρχουν" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "Σφάλμα εισόδου στο " #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "Το URL της λίστας αναπαραγωγής του Grooveshark" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "Ραδιόφωνο Grooveshark" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "URL του τραγουδιού στο " #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "Ομαδοποίηση βιβλιοθήκης κατά..." #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "Ομαδοποίηση κατά" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "Ομαδοποίηση κατά Άλμπουμ" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "Ομαδοποίηση κατά Καλλιτέχνη" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "Ομαδοποίηση κατά Καλλιτέχνη/Άλμπουμ" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "Ομαδοποίηση κατά Καλλιτέχνη/Έτος - Άλμπουμ" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "Ομαδοποίηση κατά Είδος/Άλμπουμ" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "Ομαδοποίηση κατά Είδος/Καλλιντέχνη/Άλμπουμ" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "Ομαδοποίηση" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "Η σελίδα HTML δεν περιέχει RSS" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "Ο HTTP κωδικός κατάστασης 3xx ληφθεί χωρίς URL, βεβαιωθείτε για την διαμόρφωση του διακομιστή." #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "Διαμεσολαβητής HTTP" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "Happy" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "Πληροφορίες υλικού" #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "Οι πληροφορίες υλικού είναι διαθέσιμες μόνο όταν η συσκευή είναι συνδεδεμένη." #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "Υψηλή" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "Υψηλή (%1 fps)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "Υψηλή (1024x1024)" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "O Host δεν βρέθηκε, ελέγξτε το URL του διακομιστή. Παράδειγμα: http://localhost:4040/" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "Ώρες" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "Δεν έχω λογαριασμό Magnatune" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Εικονίδιο" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "Εικονίδια στην κορυφή" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "Ταυτοποίηση τραγουδιού" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "Αν συνεχίσετε, η συσκευή αυτή θα λειτουργεί αργά και τα τραγούδια που θα αντιγραφούν σε αυτή ίσως δεν παίζουν." #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Αν γνωρίζετε το URL ενός podcast, εισάγετε το παρακάτω και πιέστε Εκκίνηση." #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "Αγνόηση του \"The\" στο όνομα των καλλιτεχνών" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Εικόνες (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "Σε %1 ημέρες" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "Σε %1 εβδομάδες" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "Στην δυναμική λειτουργία νέα κομμάτια θα επιλέγονται και τοποθετούνται στην λίστα κάθε φορά που ένα τραγούδι τελειώνει." #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "Εισερχόμενα" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "Εμφάνιση του άλμπουμ (εικόνα) στην ειδοποίηση" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "Συμπερίληψη όλων των τραγουδιών" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Ασύμβατη έκδοση πρωτοκόλλου REST. Η εφαρμογή πελάτη πρέπει να ενημερωθεί." #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Ασύμβατη έκδοση πρωτοκόλλου REST. Ο διακομιστής πρέπει να ενημερωθεί." #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Ατελής ρύθμιση, παρακαλώ βεβαιωθείτε πως όλα τα πεδία είναι συμπληρωμένα." #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "Αύξηση της έντασης ήχου κατά 4%" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "Αύξηση του ήχου κατά της εκατό" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Αύξηση έντασης" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "Δημιουργία ευρετηρίου %1" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "Πληροφορία" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "Εισαγωγή..." #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Εγκατεστημένο" #: core/database.cpp:673 msgid "Integrity check" msgstr "έλεγχος ακεραιότητας" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Διαδίκτυο" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "Παροχείς Internet" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "Εσφαλμένο κλειδί API" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Εσφαλμένη διαμόρφωση" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "Εσφαλμένη μέθοδος" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "Εσφαλμένοι παράμετροι" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "Καθορίστηκε εσφαλμένη πηγή" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "Εσφαλμένη υπηρεσία" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "Εσφαλμένο κλειδί συνεδρίας" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "Εσφαλμένο όνομα χρήστη και/ή συνθηματικό" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "Τα ποιο διάσημα κομμάτια του Jamendo" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "Τα κορυφαία κομμάτια του Jamendo" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "Τα κορυφαία κομμάτια Jamendo του μήνα" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "Τα κορυφαία κομμάτια Jamendo της εβδομάδας" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "Βάση δεδομένων Jamendo" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "Μετάβαση στο τρέχον κομμάτι που παίζει" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Κράτημα των κουμπιών για %1 δευτερόλεπτα..." #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Κράτημα των κουμπιών για %1 δευτερόλεπτα..." #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "Συνέχιση της εκτέλεσης στο παρασκήνιο όταν το παράθυρο κλείσει" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "Διατήρηση των αρχικών αρχείων" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "Γατάκια" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Γλώσσα" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "Φορητός/ακουστικά" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Μεγάλη αίθουσα" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "Μεγάλο εξώφυλλο άλμπουμ" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "Μεγάλη πλευρική μπάρα" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "Τελευταία εκτέλεση" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "Last.fm Προσαρμοσμένο ράδιο: %1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Βιβλιοθήκη του Last.fm - %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "Last.fm Mix Radio - %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Γειτονικό ραδιόφωνο του Last.fm - %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Ραδιοφωνικός σταθμός Last.fm - %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Καλλιτέχνες του Last.fm όμοιοι με %1" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Εττικέτες ραδιοφώνου του Last.fm: %1" #: internet/lastfmservice.cpp:437 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Το Last.fm είναι απασχολημένο, παρακαλώ δοκιμάστε σε λίγα λεπτά" #: ../bin/src/ui_lastfmsettingspage.h:154 msgid "Last.fm password" msgstr "Last.fm συνθηματικό" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "Αριθμός αναπαραγωγής Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Ετικέτες του Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Last.fm όνομα χρήστη" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Wiki του Last.fm" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "Λιγότερο αγαπημένα κομμάτια" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "Κενό για τα προεπιλεγμένα. Π.χ. \"/dev/dsp\", \"front\", κ.τ.λ." #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "Αριστερά" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Διάρκεια" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Βιβλιοθήκη" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "Προχωρημένη ομαδοποίηση βιβλιοθήκης" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "Ειδοποίηση σάρωσης βιβλιοθήκης" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "Έρευνα βιβλιοθήκης" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Όρια" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "Ακούστε τραγούδια από το Grooveshark παρόμοια με αυτά που έχετε ακούσει προηγουμένως" #: ui/equalizer.cpp:123 msgid "Live" msgstr "Ζωντανά" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Φόρτωση" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "Φόρτωμα εξώφυλλου από διεύθυνση (URL)" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "Φόρτωμα εξώφυλλου από διεύθυνση (URL)..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "Φόρτωση εξώφυλλου από τον δίσκο" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "Φόρτωση εξώφυλλου από τον δίσκο..." #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "Φόρτωση λίστας αναπαραγωγής" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "Φόρτωση λίστας αναπαραγωγής..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Φόρτωμα Last.fm" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Φόρτωση συσκευής MTP" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "Φόρτωση της βάσης δεδομένων iPod" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "Φόρτωση έξυπνης λίστας" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "Φόρτωση τραγουδιού" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "Φόρτωμα ροής (stream)" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "Φόρτωση κομματιών" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "Φόρτωση πληροφοριών κομματιού" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "Φόρτωση..." #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "Φορτώνει αρχεία/URLs, αντικαθιστώντας την τρέχουσα λίστα αναπαραγωγής" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Είσοδος" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "Αποτυχία εισόδου" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "Προφίλ χρόνιας πρόβλεψης (LTP)" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "Αγάπη" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Χαμηλή (%1 fps)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "Χαμηλή (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "Προφίλ χαμηλής πολυπλοκότητας (LC)" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "Στίχοι" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "Στίχοι από %1" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Λήψη Magnatune" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Η λήψη Magnatune ολοκληρώθηκε" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "Κύριο προφίλ (MAIN)" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "Κάνε το!" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "Η λίστα να είναι διαθέσιμη και εκτός σύνδεσης" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "Παραμορφωμένη απάντηση" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "Χειροκίνητη ρύθμιση διαμεσολαβητή" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "Χειροκίνητα" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "Κατασκευαστής" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "Επισήμανση ως έχει ακουστεί" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "Επισήμανση ως νέο" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "Ταίριασμα όλων των όρων αναζήτησης (λογικό ΚΑΙ)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "Ταίριασμα ενός ή περισσότερων όρων αναζήτησης (λογικό Ή)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "Μέγιστος ρυθμός bit" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "Μέση (%1 fps)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "Μέση (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "Τύπος συνδρομής" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "Ελάχιστος ρυθμός bit" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "Απόντες projectM προεπιλογές" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "Μοντέλο" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "Έλεγχος της βιβλιοθήκης για αλλαγές" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "Αναπαραγωγή Mono" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "Μήνες" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "Mood" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "Στυλ moodbar" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "Moodbars" #: library/library.cpp:74 msgid "Most played" msgstr "Έπαιξαν περισσότερο" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "Σημείο φόρτωσης (mount point)" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "Σημεία φόρτωσης (mount points)" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "Μετακίνηση κάτω" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "Μετακίνηση στην βιβλιοθήκη..." #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "Μετακίνηση πάνω" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "Μουσική" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Μουσική βιβλιοθήκη" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "Σίγαση" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "Η βιβλιοθήκη μου στο Last.fm" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "Το ραδιόφωνο των αγαπημένων μου στο Last.fm" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "Η γειτονιά μου στο Last.fm" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "Το ραδιόφωνο των προτεινόμενων μου στο Last.fm" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "Το δικό μου Mix Radio" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "Η Μουσική Μου" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "Η γειτονιά μου" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "Οι Σταθμοί μου" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "Οι Προτάσεις μου" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Όνομα" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "Επιλογές ονομασίας" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "Στενή ζώνη (NB)" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "Γείτονες" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "Δίκτυο" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "Διαμεσολαβητής Δικτύου" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "Τηλεχειριστήριο Δικτύου" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "Ποτέ" #: library/library.cpp:67 msgid "Never played" msgstr "Ποτέ δεν έπαιξαν" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "Ποτέ μην ξεκινά η αναπαραγωγή" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "Νέος φάκελος" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "Νέα λίστα" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "Νέα έξυπνη λίστα..." #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "Νέα τραγούδια" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "Νέα κομμάτια θα προστίθενται αυτόματα." #: library/library.cpp:80 msgid "Newest tracks" msgstr "Νεότερα κομμάτια" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "Επόμενο" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Επόμενο κομμάτι" #: core/utilities.cpp:147 msgid "Next week" msgstr "Την επόμενη εβδομάδα" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "Χωρίς αναλυτή" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "Χωρίς εικόνα φόντου" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "Κανενα καβερ δεν επιλεχθηκε για εξαγωγη." #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "Όχι μακρά μπλοκς" #: playlist/playlistcontainer.cpp:366 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Δεν βρέθηκαν. Καθαρίστε το πλαίσιο αναζήτησης να να εμφανιστεί ολόκληρη η λίστα αναπαραγωγής." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "Όχι βραχαία μπλοκς" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "Κανένα" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "Κανένα από τα επιλεγμένα τραγούδια δεν ήταν κατάλληλο για αντιγραφή σε μία συσκευή" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "Normal" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "Κανονικός τύπος μπλοκ" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "Δεν είναι διαθέσιμο κατά την χρήση Δυναμικής λίστας" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "Αποσυνδεμένο" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "Δεν υπάρχει αρκετό περιεχόμενο" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "Δεν υπάρχουν αρκετοί οπαδοί" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "Δεν υπάρχουν αρκετά μέλη" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "Δεν υπάρχουν αρκετοί γείτονες" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Μη εγκατεστημένο" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "Δεν είστε συνδεδεμένος" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "Δεν είναι φορτωμένο - διπλό \"κλικ\" για φόρτωση" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "Τύπος ειδοποίησης" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Ειδοποιήσεις" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Τρέχουσα αναπαραγωγή" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "Προ-επισκόπηση OSD" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "Αδιαφάνεια" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "Άνοιγμα του %1 στον περιηγητή" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "Άνοιγμα CD ή&χου..." #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "Άνοιγμα αρχείου OPML" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "Άνοιγμα αρχείου OPML..." #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "Άνοιγμα συσκευής" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "Άνοιγμα αρχείου..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "Άνοιγμα στο Google Drive" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "Άνοιγμα σε νέα λίστα" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Άνοιγμα..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "Η λειτουργία απέτυχε" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "Βελτιστοποίηση για ρυθμό bit" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "Βελτιστοποίηση για ποιότητα" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "Επιλογές..." #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "Οργάνωση Αρχείων" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "Οργάνωση αρχείων..." #: core/organise.cpp:65 msgid "Organising files" msgstr "Γίνετε οργάνωση αρχείων" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "Αρχικές ετικέτες" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Άλλες επιλογές" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "Έξοδος" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "Συσκευή εξόδου" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "Επιλογές εξόδου" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "Επέκταση εξόδου" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "Αντικατάσταση όλων" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "Εγγραφή και αντικατάσταση υπαρχόντων αρχείων" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "Αντικατάσταση των μικρότερων μόνο" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "Ιδιοκτήτης" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "Ανάλυση του καταλόγου Jamendo" #: ui/equalizer.cpp:124 msgid "Party" msgstr "Πάρτι" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "Συνθηματικό" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Παύση" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "Παύση αναπαραγωγής" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Σταματημένο" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "Εκτελεστής" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "Εικονοστοιχεία" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "Απλή πλευρική μπάρα" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Αναπαραγωγή" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "Αναπαραγωγή καλλιτέχνη ή ετικέτας" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "Αναπαραγωγή ραδιοφώνου καλλιτέχνη..." #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "Μετρητής εκτελέσεων" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "Αναπαραγωγή προσαρμοσμένου ραδιοφώνου..." #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "Αναπαραγωγή αν είναι σταματημένο, αλλιώς παύση" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "Αναπαραγωγή εάν δεν παίζει κάτι άλλο" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "Αναπαραγωγή ραδιοφώνου ετικετών..." #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "Αναπαραγωγή του ου κομματιού της λίστας αναπαραγωγής" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "Αναπαραγωγή/Παύση" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Αναπαραγωγή" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Επιλογές αναπαραγωγής" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "Λίστα" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "Η λίστα τελείωσε" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "Επιλογές λίστας αναπαραγωγής" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "Τύπος λίστας αναπαραγωγής" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "Λίστες" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "Παρακαλώ κλείστε τον περιηγητή σας και επιστρέψτε στον Clementine. " #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "Κατάσταση πρόσθετου:" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "Podcasts" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Pop" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "Δημοφιλή τραγούδια" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "Δημοφιλή τραγούδια του μήνα" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "Δημοφιλή τραγούδια σήμερα" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "Διάρκεια αναδυόμενου μηνύματος" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "Πόρτα" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "Προ-ενισχυμένο" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "Προτιμήσεις" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "Προτιμήσεις..." #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "Προτιμώμενα ονόματα αρχείων \"τέχνης\" (εξώφυλλα κ.τ.λ.) άλμπουμ (χωρισμένα με κόμμα)" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "Προτιμώμενη ηχητική διαμόρφωση" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "Προτιμώμενος ρυθμός bit " #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "Προτιμώμενη μορφή" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "Τύπος ήχου Premium" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "Ρυθμίσεις:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "Πιέστε ένα συνδιασμό πλήκτρων για χρήση σε" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "Πιέστε ένα πλήκτρο" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Πίεσε έναν συνδυασμό πλήκτρων για χρήση στο %1..." #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "Επιλογές Όμορφου OSD" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "Προεπισκόπηση" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "Προηγούμενο" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "Προηγούμενο κομμάτι" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Εκτύπωση πληροφοριών έκδοσης" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "Προφίλ" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "Πρόοδος" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 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:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "Ποιότητα" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "Ερώτηση συσκευής..." #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "Διαχειριστής λίστας αναμονής" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "Τοποθέτηση στη λίστας αναμονής τα επιλεγμένα κομμάτια" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "Τοποθέτηση στη λίστας αναμονής του κομματιού" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "Ραδιόφωνο (ίση ένταση για όλα τα κομμάτια)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "Ραδιόφωνα" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "Βροχή" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "Τυχαίο οπτικό εφέ" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "Βαθμολογία τρέχοντος τραγουδιού με 0 αστέρια" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "Βαθμολογία τρέχοντος τραγουδιού με 1 αστέρια" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "Βαθμολογία τρέχοντος τραγουδιού με 2 αστέρια" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "Βαθμολογία τρέχοντος τραγουδιού με 3 αστέρια" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "Βαθμολογία τρέχοντος τραγουδιού με 4 αστέρια" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "Βαθμολογία τρέχοντος τραγουδιού με 5 αστέρια" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "Βαθμολόγηση" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "Ακύρωση στ' αλήθεια;" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "Η ανακατεύθυνση υπέρβασης του ορίου, ελέγχει τη διαμόρφωση του διακομιστή." #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "Ανανέωση" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "Ανανέωση καταλόγου" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "Ανανέωση καναλιών" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "Ανανέωση της λίστας φίλων" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "ανανέωση της λίστας σταθμών" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "Ανανέωση ροών" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Reggae" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "Απομνημόνευσε την ταλάντευση του χειριστηρίου του Wii" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "Υπενθύμιση από την τελευταία φορά" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Αφαίρεση" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "Αφαίρεση ενέργειας" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "Αφαίρεση διπλότυπων από την λίστα" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "Αφαίρεση φακέλου" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "Αφαίρεση από την Μουσική Μου" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "Αφαίρεση από τα αγαπημένα" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "Αφαίρεση από την λίστα" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "Αφαίρεση λίστας αναπαραγωγής" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "Αφαίρεση λίστας αναπαραγωγής" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "Αφαιρούνται τα τραγούδια από την Μουσική Μου" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "Αφαιρούνται τα τραγούδια από τα Αγαπημένα" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "Μετονομασία της λίστας \"%1\"" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "Μετονομασία της λίστας Grooveshark" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "Μετονομασία λίστας αναπαραγωγής" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "Μετονομασία λίστας αναπαραγωγής..." #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "Επαναρίθμησε τα κομμάτια κατά αυτή την σειρά..." #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Επανάληψη" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "Επανάληψη άλμπουμ" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "Επανάληψη λίστας" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "Επανάληψη κομματιού" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Αντικατάσταση της τρέχουσας λίστας αναπαραγωγής" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "Αντικατάσταση της λίστας αναπαραγωγής" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "Αντικαθιστά τα κενά με κάτω παύλα" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "Replay Gain" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "Λειτουργία Replay Gain" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "Επανασυμπλήρωση" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "Απαίτηση κωδικού επαλήθευσης" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "Επαναφορά" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" 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:206 msgid "Restrict to ASCII characters" msgstr "Περιορισμός σε χαρακτήρες ASCII" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "Συνέχιση της αναπαραγωγής στην εκκίνηση" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "Ανακτόνται τα τραγούδια της Μουσικής Μου από το Grooveshark" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "Ανάκτηση αγαπημένων τραγουδιών από το Grooveshark" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "Ανάκτηση λιστών αναπαραγωγής από το Grooveshark" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "Επιστροφή στον Clementine" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "Δεξιά" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "Εκτέλεση" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "Διαμεσολαβητής SOCKS" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "Σφάλμα SSL handshake, ελέγξτε την διαμόρφωση του διακομιστή. Η SSLv3 επιλογη μπορεί να λύση κάποια θέματα." #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "Ασφαλής αφαίρεση συσκευής" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "Ασφαλής αφαίρεση συσκευής μετά την αντιγραφή" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "Ρυθμός δειγματοληψίας" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "Δειγματοληψία" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "Αποθήκευση .mood αρχείων στην βιβλιοθήκη σας" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "Αποθήκευση του εξώφυλλου του άλμπουμ" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "Αποθ. εξώφυλλου στον δίσκο..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "Αποθήκευση εικόνας" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "Αποθήκευση λίστας αναπαραγωγής" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "Αποθήκευση λίστας αναπαραγωγής..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "Αποθήκευση ρύθμισης" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "Αποθήκευση βαθμολογίας σε αρχεία ετικετών όταν είναι εφικτό" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "Αποθήκευση στατιστικών σε αρχεία ετικετών όταν είναι εφικτό" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "Αποθήκευση της ροής στην καρτέλα Internet" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "Αποθήκευση των στατιστικών των τραγουδιών στα αρχεία των τραγουδιών" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "Αποθήκευση κομματιών" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "Προφίλ κλιμακούμενου ρυθμού δειγματοληψίας (SSR)" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "Διαβάθμιση μεγέθους" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "Σκορ" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "Κάνε \"srobble\" τα κομμάτια που ακούω" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "Αναζήτηση" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "Αναζήτηση σταθμών Icecast" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "Αναζήτηση Jamendo" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Εύρεση στο Magnatune" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "Αναζήτηση στο Subsonic" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "Αναζήτηση για εξώφυλλο άλμπουμ..." #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "Αναζήτηση για οτιδήποτε" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "Αναζήτηση στο gpodder.net" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "Αναζήτηση στο iTunes" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "Λειτουργία αναζήτησης" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "Επιλογές εύρεσης" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "Εύρεση αποτελεσμάτων" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "Όροι αναζήτησης" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "Αναζήτηση στο Grooveshark" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "Δεύτερο επίπεδο" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "Αναζήτηση πίσω" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "Αναζήτηση εμπρός" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "Άλμα στο τρέχον κομμάτι κατά ένα σχετικό ποσό." #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "Άλμα σε σε μια καθορισμένη θέση στο τρέχον κομμάτι." #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "Επιλογή όλων" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "Επιλογή κανενός" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "Επιλογή χρώματος φόντου:" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "Επιλογή εικόνας φόντου" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "Επιλέξτε το ποιο ταιριαστό" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "Επιλογή χρώματος προσκήνιου:" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "Επιλογή οπτικών εφέ" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "Επιλογή οπτικών εφέ..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "Σειριακός αριθμός" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "URL Εξυπηρετητή" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "Λεπτομέρειες διακομιστή" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "Υπηρεσία εκτός σύνδεσης" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Δώσε %1 στο \"%2\"..." #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "Ρύθμιση της έντασης ήχου στο της εκατό" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "Δώσε τιμή σε όλα τα επιλεγμένα κομμάτια..." #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "Ρυθμίσεις" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Συντόμευση" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "Συντόμευση για %1" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Η συντόμευση για το %1 υπάρχει" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Εμφάνιση" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "Εμφάνιση OSD" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "Εμφάνιση ενός φωτεινού σχεδίου στο τρέχον κομμάτι" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "Εμφάνιση μίας moodbar στην μπάρα προόδου του κομματιού" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "Εμφάνισε εγγενείς ειδοποιήσεις" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Εμφάνισε μία ειδοποίηση όταν αλλάζω την μέθοδο επανάληψης/ανάμιξης" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "Εμφάνιση ειδοποίησης κατα την αλλαγή του ήχου" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "Εμφάνισε αναδυόμενα μηνύματα από το εικονίδιο συστήματος" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "Εμφάνισε ένα όμορφο OSD" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "Εμφάνιση πάνω από την μπάρα κατάστασης" #: ui/mainwindow.cpp:460 msgid "Show all songs" msgstr "Εμφάνιση όλων των τραγουδιών" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Εμφάνιση όλλων των τραγουδιών" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show cover art in library" msgstr "Εμφάνιση του εξώφυλλου στην βιβλιοθήκη" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "Εμφάνιση διαχωριστών" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "Εμφάνισε σε πλήρες μέγεθος..." #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "Εμφάνιση στον περιηγητή αρχείων..." #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "Εμφάνιση στους διάφορους καλλιτέχνες" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "Εμφάνιση moodbar" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "Εμφάνιση μόνο διπλότυπων" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "Εμφάνιση μόνο μη επισημασμένων" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "Εμφάνιση προτάσεις αναζήτησης" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "Εμφάνισε τα κουμπιά \"αγάπη\"και \"απαγόρευση\"" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "Εμφάνισε του κουμπιού scrobble στο κυρίως παράθυρο" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "Εμφάνιση εικονιδίου συστήματος" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "Εμφάνιση πηγών που είναι ενεργοποιημένες και απενεργοποιημένες" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "Εμφάνιση/Απόκρυψη" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Ανακάτεμα" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "Ανακάτεμα άλμπουμ" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "Ανακάτεμα όλων" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "Ανακάτεμα λίστας" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "Ανακάτεμα των κομματιών σε αυτό το άλμπουμ" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "Είσοδος" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "Αποσύνδεση" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "Γίνεται είσοδος..." #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "Παρόμοιοι καλλιτέχνες" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "Μέγεθος" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "Μέγεθος:" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "Παράλειψη προς τα πίσω στη λίστα" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "Μετρητής παραλήψεων" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "Παράλειψη προς τα μπροστά στη λίστα" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "Μικρό εξώφυλλο άλμπουμ" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "Μικρή πλευρική μπάρα" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "Έξυπνη λίστα αναπαραγωγής" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "Έξυπνες λίστες αναπαραγωγής" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Απαλή" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "Απαλή Rock" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "Πληρ. τραγουδιού" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "Πληρ. τραγουδιού" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "Sonogram" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "Συγνώμη" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "Ταξινόμηση κατά γένος (αλφαβητικά)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "Ταξινόμηση κατά γένος (κατά δημοτικότητα)" #: ../bin/src/ui_icecastfilterwidget.h:77 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 "Ταξινόμηση" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "Πηγή" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "Πηγές" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "Σφάλμα εισόδου στο Spotify" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "Πρόσθετο Spotify" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "Το πρόσθετο του Spotify μη εγκατεστημένο" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "Κανονικό" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "Με αστέρι" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "Εκκίνηση της λίστας αναπαραγωγής που παίζει τώρα" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "Εκκίνηση επανακωδικοποίησης" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Ξεκίνα να γράφεις κάτι στο κουτί εύρεσης παραπάνω για να γεμίσει αυτή η λίστα εύρεσης αποτελεσμάτων" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "Εκκίνηση %1" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "Εκκίνηση..." #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "Σταθμοί" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Σταμάτημα" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "Στοπ μετά" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "Σταμάτημα μετά από αυτό το κομμάτι" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Διακοπή αναπαραγωγής" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "Παύση αναπαραγωγής μετά το τρέχον κομμάτι" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "Σταματημένο" #: core/song.cpp:341 msgid "Stream" msgstr "Stream" #: internet/subsonicsettingspage.cpp:30 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:160 msgid "Streaming membership" msgstr "Συνδρομή ροής" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "Λίστες συνδρομής" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "Συνδομητές" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "Επιτυχία!" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "Επιτυχία εγγραφής του %1" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "Προτεινόμενες ετικέτες" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "Σύνοψη" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "Υπέρ υψηλή (%1 fps)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "Υπέρ υψηλή (2048x2048)" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "Υποστηριζόμενες μορφές" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "Συγχρονισμός των στατιστικών σε αρχεία τώρα" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "Συγχρονισμός εισερχομένων του Spotify" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "Συγχρονισμός λίστας του Spotify" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "Συγχρονισμός κομματιών επισημασμένων με αστέρι του Spotify" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "Χρώματα συστήματος" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "Καρτέλες στην κορυφή" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Ετικέτα" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "Μεταφορτωτής ετικετών" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "Ραδιόφωνο ετικετών" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "Ρυθμός bit στόχου" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "Επιλογές κειμένου" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Ευχαριστίες σε" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Η εντολή \"%1\" δεν μπόρεσε να ξεκινήσει" #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "Το εξώφυλλο του άλμπουμ του τραγουδιού που παίζει" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "Ο κατάλογος %1 δεν είναι έγκυρος" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "Η λίστα αναπαραγωγής '%1' ήταν άδεια ή δεν μπόρεσε να φορτωθεί." #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "Η διεύθυνση που ζητήσατε δεν είναι εικόνα!" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "Δεν υπάρχουν πλέον τραγούδια σε αυτό το άλμπουμ" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "Πρόβλημα επικοινωνίας με το gpodder.net" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Υπήρξε κάποιο σφάλμα κατά την μεταφορά των μετα-δεδομένων από το Magnatune" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Πρόβλημα κατά την ανάλυση της απάντησης από το iTunes" #: ui/organiseerrordialog.cpp:56 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:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Αυτά τα αρχεία θα διαγραφούν από την συσκευή, θέλετε σίγουρα να συνεχίσετε;" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "Αυτά τα αρχεία θα διαγραφούν για πάντα από τον δίσκο, θέλετε σίγουρα να συνεχίσετε;" #: ../bin/src/ui_librarysettingspage.h:187 msgid "These folders will be scanned for music to make up your library" msgstr "Οι φάκελοι αυτοί θα σαρωθούν για μουσικά αρχεία για την βιβλιοθήκη σας" #: ../bin/src/ui_transcodersettingspage.h:174 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:151 msgid "Third level" msgstr "Τρίτο επίπεδο" #: internet/jamendoservice.cpp:171 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/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "Αυτό το άλμπουμ δεν είναι διαθέσιμο στην ζητούμενη μορφή" #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Η συσκευή αυτή πρέπει να συνδεθεί και να ενεργοποιηθεί πριν ο Clementine μπορέσει να δει τι μορφές υποστηρίζει." #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "Η συσκευή αυτή υποστηρίζει τις ακόλουθες μορφές:" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Η συσκευή αυτή δεν θα λειτουργήσει σωστά" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Η επιλογή αυτή μπορεί να αλλάξει από τις προτιμήσεις \"Συμπεριφορά\"" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "Η ροή (stream) αυτή είναι μόνο για συνδρομητές" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "Αυτού του τύπου η συσκευή δεν υποστηρίζετε %1" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "Λήξη χρονικού ορίου" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Τίτλος" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "Για να ακούσετε το ραδιόφωνο Grooveshark, θα πρέπει πρώτα να ακούσετε μερικά ακόμα τραγούδια από το Grooveshark" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "Σήμερα" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "Εναλλαγή Όμορφου OSD" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Εναλλαγή πλήρης οθόνης" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "Εναλλαγή της κατάστασης της λίστας αναμονής" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "Εναλλαγή του scrobbling" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Εναλλαγή ορατότητας της όμορφης «απεικόνισης στην οθόνη»" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "Αύριο" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "Πάρα πολλές ανακατευθύνσεις" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "Κορυφαία κομμάτια" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "Συνολικά άλμπουμ:" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "Συνολικά bytes που μεταφέρθηκαν" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "Συνολικές αιτήσεις δικτύου που πραγματοποιήθηκαν" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Κομμάτι" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "Επανακωδικοποίηση Μουσικής" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "Αρχείο καταγραφής επανακωδικοποίησης" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "Κωδικοποίηση" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Επανακωδικοποίηση %1 αρχείων χρησιμοποιώντας %2 νήματα" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "Επιλογές επανακωδικοποίησης" #: core/song.cpp:338 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "Turbine" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "Απενεργοποίηση" #: devices/giolister.cpp:161 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "URL(s)" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "Ubuntu One κωδικός" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "Ubuntu One όνομα χρήστη" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "Άκρα ευρεία ζώνη (UWB)" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Αδυναμία \"κατεβάσματος\" του %1 (%2)" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Άγνωστο" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "Άγνωστος τύπος περιεχομένου" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Άγνωστο σφάλμα" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "Αφαίρεση εξώφυλλου" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "Ακύρωση συνδρομής" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "Προσεχής Συναυλίες" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "Ενημέρωση λίστας αναπαραγωγής του Grooveshark" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "Ενημέρωση όλων των podcasts" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "Ενημέρωση φακέλων βιβλιοθήκης που άλλαξαν" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "Ενημέρωση της βιβλιοθήκης κατά την εκκίνηση του Clementine" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "Ενημέρωσε αυτό το podcast" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "Ενημέρωση" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Ενημέρωση %1" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "Ενημέρωση %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Ενημέρωση λίστας" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "Χρήση" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "Χρήση ετικέτας Άλμπουμ Καλλιτέχνη όταν είναι διαθέσιμα" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "Χρήση πλήκτρων συντόμευσης του Gnome" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "Χρήση των μετα δεδομένων Replay Gain αν είναι διαθέσημα" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "Χρησιμοποιήστε SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "Χρήση χειριστηρίου Wii" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "Χρήση τροποποιημένου χρώματος" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "Χρήση προσαρμοσμένου μηνύματος για τις ειδοποιήσεις" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "Χρήση Τηλεχειριστηρίου" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "Χρήση πιστοποίησης" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "Χρήση μηχανής διαχείρισης ρυθμού μετάδοσης" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "Χρήση Δυναμικής λίστας" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "Χρήση των ειδοποιήσεων για την αναφορά της κατάστασης του χειριστηρίου Wii" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "Χρήση προσωρινής διαμόρφωση θορύβου" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "Χρήση προκαθορισμένου του συστήματος" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "Χρήση χρώματος του συστήματος" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "Χρήση ρυθμίσεων του διαμεσολαβητή του συστήματος" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "Χρήση κανονικοποίησης ήχου" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "Σε χρήση" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "Ο χρήστης %1 δεν διαθέτει έναν λογαριασμό στο GrooveShark Anywhere" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "Διασύνδεση χρήστη" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Όνομα χρήστη" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "Η χρήση του μενού για την προσθήκη ενός τραγουδιού θα..." #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "Μεταβαλλόμενος ρυθμός bit" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "Διάφοροι καλλιτέχνες" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "Έκδοση %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "Προβολή" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "Τρόπος λειτουργίας οπτικών εφέ" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "Οπτικά εφέ" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "Ρυθμίσεις οπτικών εφέ" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "Ανίχνευση δραστηριότητας φωνής" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "Ένταση %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "Προειδοποίηση κατά το κλείσιμο μίας λίστας αναπαραγωγής" #: core/song.cpp:337 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "Website" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "Εβδομάδες" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "Όταν ξεκινά το Clementine" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "Όταν η λίστα είναι κενή..." #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "Γιατί να μην δοκιμάσετε..." #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "Ευρεία ζώνη (WB)" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "Χειριστήριο Wii %1: ενεργοποιήθηκε" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "Χειριστήριο Wii %1: συνδέθηκε" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Χειριστήριο Wii %1: μπαταρια σε κρίσιμο σημείο (%2%) " #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Χειριστήριο Wii %1: απενεργοποιήθηκε" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Χειριστήριο Wii %1: αποσυνδέθηκε" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Χειριστήριο Wii %1: χαμηλή μπαταρία (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "Windows Media audio" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "Χωρίς εξώφυλλο:" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Θα θέλατε να μετακινήσετε και τα άλλα τραγούδια σε αυτό το άλμπουμ στο Διάφοροι Καλλιτέχνες;" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "Θέλετε να εκτελέσετε μία πλήρη επανασάρωση αμέσως τώρα;" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "Εγγραφή όλων των στατιστικών των τραγουδιών στα αρχεία τραγουδιών" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "Λάθος όνομα χρήστη ή συνθηματικό" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "Έτος" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "Έτος - Άλμπουμ" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "Έτη" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "Χθες" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "Πρόκειτε να \"κατεβάσετε\" τα παρακάτω άλμπουμ" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "Πρόκειται να διαγράψετε %1 λίστες, είστε σίγουροι;" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "Δεν έχετε συνδεθεί." #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "Έχετε συνδεθεί ως %1." #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "Έχετε συνδεθεί." #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "Μπορείς να αλλάξεις τον τρόπο οργάνωσης των τραγουδιών στην βιβλιοθήκη." #: internet/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "Μπορείτε να ακούσετε μουσική με έναν δωρεάν λογαριασμό, αλλά τα Premium μέλη μπορούν να ακούσουν ροές καλύτερης ποιότητας χωρίς διαφημίσεις." #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "Μπορείτε να ακούτε τις ροές παρασκηνίου ταυτόχρονα με άλλη μουσική." #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "Μπορείτε να κάνετε \"scroble\" δωρεάν, αλλά μόνο οι συνδρομητές επί πληρωμή μπορούν να έχουν ροή από το ραδιόφωνο Last.fm στον Clementine." #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "Δεν έχετε λογαριασμό στο GrooveShark Anywhere." #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Δεν έχετε Premium λογαριασμό στο Spotify." #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "Δεν έχετε κάποια ενεργή συνδρομή" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Έχετε εξέλθει από το Spotify, παρακαλώ εισάγετε πάλι τον κωδικό σας στις ρυθμίσεις." #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Έχετε εξέλθει από το Spotify, παρακαλώ εισάγετε πάλι τον κωδικό σας." #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "Λατρεύεις αυτό το κομμάτι" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "Πρέπει να πάτε στις ρυθμίσεις συστήματος και να ενεργοποιήσετε το \"\nΕνεργοποίηση πρόσβασης σε βοηθητικές συσκευές\" για να χρησιμοποιήσετε καθολικές συντομεύσεις στον Clementine." #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "Πρέπει να ξεκινήσετε πάλι τον Clementine αν αλλάξετε την γλώσσα." #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "Δεν θα μπορείτε να αναπαράγεται σταθμούς Last.fm καθώς δεν είστε συνδρομητής του Last.fm." #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "Η IP διεύθυνση σας:" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Τα στοιχεία σας στο Last.fm ήταν εσφαλμένα" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "Τα διαπιστευτήρια σας του Magnatune δεν ήταν σωστά" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "Η βιβλιοθήκη σας είναι άδεια!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "Οι ροές ραδιοφώνου σας" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "Τα scrobbles σου: %1" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Το σύστημα σας δεν έχει υποστήριξη OpenGL, τα οπτικά εφέ δεν είναι διαθέσιμα." #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "Το όνομα χρήστη ή το συνθηματικό ήταν λανθασμένο." #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Ω-Α" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Zero" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "προσθήκη %n τραγουδιών" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "μετά" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "πριν" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "και" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "αυτόματα" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "πριν" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "μεταξύ" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "το μεγαλύτερο πρώτα" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "περιέχει" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "ανενεργο" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "δίσκος %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "δεν περιέχει" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "τελειώνει με" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "ισούται" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "gpodder.net" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "κατάλογος gpodder.net" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "μεγαλύτερο από" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "εντός των τελευταίων" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "λιγότερο από" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "το μακρύτερο πρώτα" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "μετακίνηση %n τραγουδιών" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "το νεότερο πρώτα" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "άνισα" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "όχι εντός των τελευταίων" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "όχι στο" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "το παλαιότερο πρώτα" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "σε" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "επιλογές" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "ή σάρωση του QR κώδικα!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "πιέστε enter" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "αφαίρεση %n τραγουδιών" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "το ποιο σύντομο πρώτα" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "ανακάτεμα τραγουδιών" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "το μικρότερο πρώτα" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "ταξινόμηση τραγουδιών" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "αρχίζει με" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "διακοπή" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "κομμάτι %1" clementine-1.2.0+dfsg/src/translations/en.po000066400000000000000000001325331223327513400210370ustar00rootroot00000000000000# 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.0+dfsg/src/translations/en_CA.po000066400000000000000000003750411223327513400214050ustar00rootroot00000000000000# 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 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:07+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: English (Canada) (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr "kbps" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr "pt" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " seconds" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "songs" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "" #: podcasts/gpoddersync.cpp:79 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 playlists (%2)" #: playlist/playlistmanager.cpp:413 #, qt-format msgid "%1 selected of" msgstr "" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, qt-format msgid "%L1 other listeners" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n failed" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n finished" #: transcoder/transcodedialog.cpp:192 #, c-format msgid "%n remaining" msgstr "%n remaining" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "&Custom" msgstr "&Custom" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "Help" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "&Hide %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "&Hide..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "Music" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&None" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "Playlist" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Quit" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "Repeat mode" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "Shuffle mode" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "&Tools" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "...and all the Amarok contributors" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "" #: core/utilities.cpp:108 msgid "1 day" msgstr "" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "" #: library/library.cpp:60 msgid "50 random tracks" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "" #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:78 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:153 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "A-Z" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "About %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "About Clementine..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Add Stream" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Add another stream..." #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Add directory..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Add file..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Add files to transcode" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Add folder" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Add folder..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Add new folder..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Add stream..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Add to playlist" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Add..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Added this month" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Added this week" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Added this year" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Added today" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Added within three months" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Advanced grouping..." #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "" #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Album (ideal loudness for all tracks)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Album artist" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "" #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Albums with covers" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Albums without covers" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "All Files (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "All albums" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "All artists" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "All files (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "All playlists (%1)" #: ui/about.cpp:74 msgid "All the translators" msgstr "" #: library/library.cpp:84 msgid "All tracks" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "Alongside the originals" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Always hide the main window" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Always show the main window" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "" #: internet/spotifyblobdownloader.cpp:60 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:61 msgid "An error occurred loading the iTunes database" msgstr "" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:78 msgid "And:" msgstr "" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Append files/URLs to the playlist" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "Apply compression to prevent clipping" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Are you sure you want to delete the \"%1\" preset?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Artist" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "Artist radio" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Audio format" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Authentication failed" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "" #: ui/about.cpp:65 msgid "Authors" msgstr "Authors" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "Automatically open single categories in the library tree" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Background colour" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Background opacity" #: core/database.cpp:734 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Ban" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "Bar analyzer" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Basic Blue" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Behaviour" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Bit rate" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "Block analyzer" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "Boom analyzer" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "" #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "" #: core/song.cpp:339 msgid "CDDA" msgstr "" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "" #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Change shortcut..." #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Check for updates..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Choose automatically" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Choose colour..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "" #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "" #: ui/equalizer.cpp:115 msgid "Classical" msgstr "Classical" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Clear playlist" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Clementine Error" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Clementine Orange" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Clementine Visualisation" #: ../bin/src/ui_deviceproperties.h:376 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:431 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:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: internet/lastfmsettingspage.cpp:110 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 "" #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Click here to add some music" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "Close visualisation" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "" #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:116 msgid "Club" msgstr "Club" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Comment" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "" #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Composer" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "" #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "" #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Configure Last.fm..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Configure Shortcuts" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "" #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "Configure library..." #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "" #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "" #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Copy to library..." #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:64 #, 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" #: transcoder/transcoder.cpp:432 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Cover Manager" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "Cross-fade when changing tracks automatically" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "Cross-fade when changing tracks manually" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Custom..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Dance" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Date created" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Date modified" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "De&fault" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "Decrease the volume by 4%" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Decrease volume" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "Delay between visualisations" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "" #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "Delete preset" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Destination" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Details..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "" #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Directory" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Disabled" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Disc" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 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:715 msgid "Do a full library rescan" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Don't repeat" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "Don't show in various artists" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "Don't shuffle" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "" #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "" #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "" #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "Downloading Magnatune catalogue" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "Drag to reposition" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Edit tag \"%1\"..." #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "Edit tag..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Edit track information" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "Edit track information..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Edit track information..." #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Edit..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "Enable equalizer" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "Enter a new name for this playlist" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Enter an artist or tag to start listening to Last.fm radio." #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "Enter search terms here" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "Enter the URL of an internet radio stream:" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "Entire collection" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "Error processing %1: %2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:63 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "Fade out when stopping a track" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "Fading" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "Fading duration" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "Fetch Missing Covers" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "Fetch automatically" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "File name" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "File name (without path)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "File size" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "File type" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Filename" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Files" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "Files to transcode" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "First level" #: core/song.cpp:328 msgid "Flac" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Form" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Friends" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Full Bass" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "Full Bass + Treble" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "Full Treble" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "GStreamer audio engine" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "General settings" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Genre" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "Getting channels" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "Give it a name:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "Group Library by..." #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "Group by" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "Group by Album" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "Group by Artist" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "Group by Artist/Album" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "Group by Artist/Year - Album" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "Group by Genre/Album" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "Group by Genre/Artist/Album" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:43 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "Include album art in the notification" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "Increase the volume by 4%" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Increase volume" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "" #: core/database.cpp:673 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "Invalid API key" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Invalid format" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "Invalid method" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "Invalid parameters" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "Invalid resource specified" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "Invalid service" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "Invalid session key" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "Jump to the currently playing track" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "Laptop/Headphones" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Large Hall" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Last.fm Library - %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Last.fm Neighbour Radio - %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Last.fm Radio Station - %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Last.fm Similar Artists to %1" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Last.fm Tag Radio: %1" #: internet/lastfmservice.cpp:437 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:154 msgid "Last.fm password" msgstr "Last.fm password" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Last.fm username" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Length" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Library" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "Library advanced grouping" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "" #: ui/equalizer.cpp:123 msgid "Live" msgstr "Live" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Load" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "" #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "Load playlist" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "Load playlist..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Loading Last.fm radio" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "Loading stream" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "" #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "Loads files/URLs, replacing current playlist" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "Love" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "Malformed response" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "" #: library/library.cpp:74 msgid "Most played" msgstr "" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "Move to library..." #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Music Library" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "Mute" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "My Neighborhood" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "My Radio Station" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "My Recommendations" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Name" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "Neighbours" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "" #: library/library.cpp:67 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "New playlist" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:80 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Next track" #: core/utilities.cpp:147 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "No analyzer" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:366 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:145 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "None" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "Not enough content" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "Not enough fans" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "Not enough members" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "Not enough neighbours" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "Notification type" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Notifications" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "OSD Preview" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "" #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "" #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Open..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "Operation failed" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "" #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "" #: core/organise.cpp:65 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Other options" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "Output options" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:124 msgid "Party" msgstr "Party" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Pause" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "Pause playback" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Paused" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Play" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "Play Artist or Tag" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "Play artist radio..." #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "" #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "Play if stopped, pause if playing" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "Play tag radio..." #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "Play the th track in the playlist" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "Play/Pause" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Playback" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Player options" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "Playlist" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "Playlist finished" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "Playlist options" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Pop" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "Popup duration" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "Pre-amp" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "Preset:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "Press a key" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Press a key combination to use for %1..." #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "Pretty OSD options" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "Previous track" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "Progress" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "Radio (equal loudness for all tracks)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "Random visualisation" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "Refresh catalogue" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "Refresh channels" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Reggae" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "Remember from last time" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Remove" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "Remove folder" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "Remove from playlist" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "Rename playlist" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "Rename playlist..." #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "Renumber tracks in this order..." #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Repeat" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "Repeat album" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "Repeat playlist" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "Repeat track" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "Replay Gain" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" 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:206 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "Sample rate" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "Save playlist" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "Save playlist..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "Save preset" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "Save this stream in the Internet tab" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "Scrobble tracks that I listen to" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Search Magnatune" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "Second level" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "Seek backward" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "Seek forward" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "Seek the currently playing track by a relative amount" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "Seek the currently playing track to an absolute position" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "Select visualisations" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "Select visualisations..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "Service offline" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Set %1 to \"%2\"..." #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "Set the volume to percent" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "Set value for all selected tracks..." #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Shortcut" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "Shortcut for %1" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Show" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "Show a native desktop notification" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "Show a notification when I change the volume" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "Show a popup from the system tray" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "Show a pretty OSD" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:460 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "Show fullsize..." #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "" #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "Show in various artists" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "Show the \"love\" and \"ban\" buttons" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "Show tray icon" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Shuffle" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "Shuffle all" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "Shuffle playlist" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "Sign out" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "Skip backwards in playlist" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "Skip forwards in playlist" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "Sonogram" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 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 "" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "Start the playlist currently playing" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "Start transcoding" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "Starting %1" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "" #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Stop" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "Stop after this track" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Stop playback" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "Stop playing after current track" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "Stopped" #: core/song.cpp:341 msgid "Stream" msgstr "Stream" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "Successfully written %1" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Tag" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "Tag radio" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Thanks to" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "The \"%1\" command could not be started." #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "The playlist '%1' was empty or could not be loaded." #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:56 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:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 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:174 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:151 msgid "Third level" msgstr "Third level" #: internet/jamendoservice.cpp:171 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "This stream is for paid subscribers only" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Title" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Track" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "Transcode Music" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "Transcoder Log" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Transcoding %1 files using %2 threads" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "" #: core/song.cpp:338 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "Turbine" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "" #: devices/giolister.cpp:161 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "URL(s)" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Unknown" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Unknown error" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "Unset cover" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "Update the library when Clementine starts" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Updating library" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "Usage" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "Use Gnome's shortcut keys" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "Use Replay Gain metadata if it is available" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "Various artists" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "Version %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "View" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "Visualisation mode" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "Visualisations" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "Visualisations Settings" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "Volume %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "When Clementine starts" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "Year" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "Year - Album" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:123 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/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "" #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "" #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "" #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Your Last.fm credentials were incorrect" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "Your library is empty!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "Your radio streams" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Zero" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "add %n songs" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "disc %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "options" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "remove %n songs" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "track %1" clementine-1.2.0+dfsg/src/translations/en_GB.po000066400000000000000000003766211223327513400214170ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # davidsansome , 2010 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:08+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: English (United Kingdom) (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " pt" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " seconds" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " songs" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 albums" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 days" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 days ago" #: podcasts/gpoddersync.cpp:79 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 playlists (%2)" #: playlist/playlistmanager.cpp:413 #, qt-format msgid "%1 selected of" msgstr "%1 selected of" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 song" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 songs" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 songs found" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 songs found (showing %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 tracks" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimotedev modul" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n failed" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n finished" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "&Custom" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "Help" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "&Hide %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "&Hide..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Left" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "Music" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&None" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "Playlist" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Quit" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "Repeat mode" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Right" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "Shuffle mode" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "&Stretch columns to fit window" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "&Tools" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(different across multiple songs)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "...and all the Amarok contributors" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 day" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 track" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 random tracks" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "" #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "A Spotify Premium account is required." #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:78 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:153 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:297 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "ALL GLORY TO THE HYPNOTOAD" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "About %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "About Clementine..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "About Qt..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Account details" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Action" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Add Stream" #: ../bin/src/ui_notificationssettingspage.h:425 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:193 msgid "Add action" msgstr "Add action" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Add another stream..." #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Add directory..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Add file..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Add files to transcode" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Add folder" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Add folder..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Add new folder..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Add search term" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "Add song album tag" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "Add song albumartist tag" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "Add song artist tag" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "Add song composer tag" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "Add song disc tag" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "Add song genre tag" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "Add song length tag" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "Add song play count" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "Add song skip count" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "Add song title tag" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "Add song track tag" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "Add song year tag" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Add stream..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "Add to another playlist" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Add to playlist" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "Add to the queue" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Add wiimotedev action" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Add..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Added this month" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Added this week" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Added this year" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Added today" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Added within three months" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Advanced grouping..." #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "After copying..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Album (ideal loudness for all tracks)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Album artist" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Album info on jamendo.com..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Albums with covers" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Albums without covers" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "All Files (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "All Glory to the Hypnotoad!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "All albums" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "All artists" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "All files (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "All playlists (%1)" #: ui/about.cpp:74 msgid "All the translators" msgstr "All the translators" #: library/library.cpp:84 msgid "All tracks" msgstr "All tracks" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "Allow mid/side encoding" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "Alongside the originals" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Always hide the main window" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Always show the main window" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "Always start playing" #: internet/spotifyblobdownloader.cpp:60 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:61 msgid "An error occurred loading the iTunes database" msgstr "An error occurred loading the iTunes database" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "An error occurred writing metadata to '%1'" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:78 msgid "And:" msgstr "And:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Appearance" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Append files/URLs to the playlist" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "Append to current playlist" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "Append to the playlist" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "Apply compression to prevent clipping" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Are you sure you want to delete the \"%1\" preset?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "" #: ui/edittagdialog.cpp:769 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:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Artist" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Artist info" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "Artist radio" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "Artist tags" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "Artist's initial" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Audio format" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Authentication failed" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "" #: ui/about.cpp:65 msgid "Authors" msgstr "Authors" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Auto" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Automatic updating" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "Automatically open single categories in the library tree" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "Available" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "Average bitrate" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "Background Streams" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Background colour" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Background opacity" #: core/database.cpp:734 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Ban" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "Bar analyzer" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Basic Blue" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Behaviour" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "Best" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "Biography from %1" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Bit rate" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "Bitrate" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "Block analyzer" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "Block type" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "Body" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "Boom analyzer" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Browse…" #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Buttons" #: core/song.cpp:339 msgid "CDDA" msgstr "" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "CUE sheet support" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "Cancel" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Change cover art" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Change font size..." #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "Change repeat mode" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Change shortcut..." #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "Change shuffle mode" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Change the language" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Check for updates..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "Choose a name for your smart playlist" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Choose automatically" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Choose colour..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "Choose font..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Choose from the list" #: smartplaylists/querywizardplugin.cpp:155 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." #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:188 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:115 msgid "Classical" msgstr "Classical" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Clear" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Clear playlist" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Clementine Error" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Clementine Orange" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Clementine Visualisation" #: ../bin/src/ui_deviceproperties.h:376 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:431 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:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: internet/lastfmsettingspage.cpp:110 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 "" #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Click here to add some music" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "Close visualisation" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "" #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:116 msgid "Club" msgstr "Club" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Comment" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "" #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Composer" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "" #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "" #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Configure Last.fm..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "" #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "Configure library..." #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "" #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "" #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Copy to library..." #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:64 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: transcoder/transcoder.cpp:432 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Cover Manager" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "Cross-fade when changing tracks automatically" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "Cross-fade when changing tracks manually" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Custom..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Dance" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Date created" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Date modified" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "Decrease the volume by 4%" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "Delay between visualisations" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "" #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "Delete preset" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "" #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "" #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Disabled" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Disc" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Display the on-screen-display" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Don't repeat" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "Don't show in various artists" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "Don't shuffle" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "" #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "" #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "" #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "Drag to reposition" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Edit tag \"%1\"..." #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "Edit tag..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Edit track information" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "Edit track information..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Edit track information..." #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "Enable equalizer" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Enter an artist or tag to start listening to Last.fm radio." #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "Enter search terms here" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "Enter the URL of an internet radio stream:" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "Entire collection" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:63 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "Fade out when stopping a track" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "Fading" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "Fading duration" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "Fetch Missing Covers" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "Fetch automatically" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "File name" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "File name (without path)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "File size" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "File type" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Files" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "First level" #: core/song.cpp:328 msgid "Flac" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Form" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Friends" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Full Bass" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "Full Bass + Treble" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "Full Treble" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "GStreamer audio engine" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "General settings" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Genre" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "Getting channels" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "Group Library by..." #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "Group by Album" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "Group by Artist" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "Group by Artist/Album" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "Group by Artist/Year - Album" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "Group by Genre/Album" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "Group by Genre/Artist/Album" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:43 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "Include album art in the notification" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "Increase the volume by 4%" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "" #: core/database.cpp:673 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "Invalid API key" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Invalid format" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "Invalid method" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "Invalid parameters" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "Invalid resource specified" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "Invalid service" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "Invalid session key" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "Laptop/Headphones" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Large Hall" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Last.fm Library - %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Last.fm Neighbour Radio - %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Last.fm Radio Station - %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Last.fm Similar Artists to %1" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Last.fm Tag Radio: %1" #: internet/lastfmservice.cpp:437 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:154 msgid "Last.fm password" msgstr "Last.fm password" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Last.fm username" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Length" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Library" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "Library advanced grouping" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "" #: ui/equalizer.cpp:123 msgid "Live" msgstr "Live" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "" #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "" #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Loading Last.fm radio" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "Loading stream" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "" #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "Loads files/URLs, replacing current playlist" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "Love" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "Lyrics" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "Malformed response" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "" #: library/library.cpp:74 msgid "Most played" msgstr "" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "Move to library..." #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Music Library" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "My Neighbourhood" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "My Radio Station" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "My Recommendations" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Name" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "Neighbours" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "" #: library/library.cpp:67 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:80 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Next track" #: core/utilities.cpp:147 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "No analyzer" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:366 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "None" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "Not enough content" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "Not enough fans" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "Not enough members" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "Not enough neighbours" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "Notification type" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Notifications" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "OSD Preview" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "" #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "" #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "" #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "Operation failed" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "" #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "" #: core/organise.cpp:65 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Other options" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:124 msgid "Party" msgstr "Party" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Pause" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "Pause playback" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Paused" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Play" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "Play Artist or Tag" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "Play artist radio..." #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "" #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "Play if stopped, pause if playing" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "Play tag radio..." #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "Play the th track in the playlist" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Playback" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Player options" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "Playlist" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "Playlist finished" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "Playlist options" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Pop" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "Popup duration" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "Pre-amp" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "Preset:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "Pretty OSD options" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "Previous track" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "Random visualisation" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "Refresh channels" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Reggae" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "Remember from last time" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Remove" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "Remove folder" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "Remove from playlist" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "Renumber tracks in this order..." #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Repeat" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "Repeat album" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "Repeat playlist" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "Repeat track" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" 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:206 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "Sample rate" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "" #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "Save preset" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "Scrobble tracks that I listen to" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "Second level" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "Seek the currently playing track by a relative amount" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "Seek the currently playing track to an absolute position" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "Select visualisations" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "Select visualisations..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "Service offline" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Set %1 to \"%2\"..." #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "Set the volume to percent" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "Set value for all selected tracks..." #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "Show a native desktop notification" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "Show a notification when I change the volume" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "Show a popup from the system tray" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "Show a pretty OSD" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:460 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "Show fullsize..." #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "" #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "Show in various artists" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "Show the \"love\" and \"ban\" buttons" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "Show tray icon" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Shuffle" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "Shuffle all" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "Shuffle playlist" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "Sign out" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "Skip backwards in playlist" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "Skip forwards in playlist" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "Sonogram" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 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 "" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "Start the playlist currently playing" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "" #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Stop" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "Stop after this track" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Stop playback" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "" #: core/song.cpp:341 msgid "Stream" msgstr "Stream" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Tag" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "Tag radio" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Thanks to" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "" #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:56 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:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 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:174 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:151 msgid "Third level" msgstr "Third level" #: internet/jamendoservice.cpp:171 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "This stream is for paid subscribers only" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Title" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Track" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "" #: core/song.cpp:338 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "Turbine" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "" #: devices/giolister.cpp:161 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "URL(s)" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Unknown" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Unknown error" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "Unset cover" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Updating library" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "Usage" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "Various artists" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "Version %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "View" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "Visualisation mode" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "Visualisations" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "Visualisations Settings" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "Volume %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "When Clementine starts" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "Year" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "Year - Album" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:123 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/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "" #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "" #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "" #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Your Last.fm credentials were incorrect" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "Your library is empty!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "Your radio streams" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Zero" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "and" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "disc %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "options" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "track %1" clementine-1.2.0+dfsg/src/translations/eo.po000066400000000000000000003625721223327513400210500ustar00rootroot00000000000000# 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" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:07+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Esperanto (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " pt" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " sekundoj" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 albumoj" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 tagoj" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "" #: podcasts/gpoddersync.cpp:79 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 ludlistoj (%2)" #: playlist/playlistmanager.cpp:413 #, qt-format msgid "%1 selected of" msgstr "%1 elektitaj el" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 kantaĵo" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 kantaĵoj" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 trakoj" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimotedev-modulo" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, qt-format msgid "%L1 other listeners" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n malsukcesis" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n finiĝis" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "Propra" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "" #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Nenio" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "Eliri" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "... kaj ĉiuj Amarok-kontribuintoj" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 tago" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 trako" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "" #: library/library.cpp:60 msgid "50 random tracks" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "" #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:78 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:153 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "A-Z" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "" #: core/song.cpp:336 msgid "AIFF" msgstr "" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "Pri %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "Pri Clementine..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "Pri Qt..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Kontodetaloj" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Ago" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Ŝalti Wiiremote" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Aldoni fluon" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "Aldoni agon" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Aldoni plian fluon..." #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Aldoni dosierujon..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Aldoni dosieron..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Aldoni dosierojn transkodigotajn" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Aldoni dosierujon" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Aldoni dosierujon..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Aldoni novan dosierujon..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Aldoni fluon..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Aldoni al ludlisto" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Aldoni wiimotedev-agon" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Aldoni..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Aldonita(j) ĉi-monate" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Aldonita(j) ĉi-semajne" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Aldonita(j) ĉi-jare" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Aldonita(j) hodiaŭ" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Aldonita(j) en la lastaj tri monatoj" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Detala grupigado..." #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "Post kopiado..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Albumo" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Albumo (ideala laŭteco por ĉiuj sonaĵoj)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Albumverkinto" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "" #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Albumoj kun kovriloj" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Albumoj sen kovriloj" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Ĉiuj dosieroj (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Ĉiuj albumoj" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Ĉiuj verkintoj" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "Ĉiuj dosieroj (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Ĉiuj ludlistoj (%1)" #: ui/about.cpp:74 msgid "All the translators" msgstr "" #: library/library.cpp:84 msgid "All tracks" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "Apud la originaloj" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Ĉiam kaŝi la ĉeffenestron" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Ĉiam montri la ĉeffenestron" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "" #: internet/spotifyblobdownloader.cpp:60 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:61 msgid "An error occurred loading the iTunes database" msgstr "Eraro okazis dum ŝargado de la iTunes-datumbazo" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:78 msgid "And:" msgstr "Kaj:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Aspekto" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Aldoni dosierojn/URL al la ludlisto" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Verkinto" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Informoj pri la verkinto" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "" #: ui/about.cpp:65 msgid "Authors" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "" #: core/database.cpp:734 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "" #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "" #: core/song.cpp:339 msgid "CDDA" msgstr "" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "" #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "" #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "" #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "" #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "" #: ui/equalizer.cpp:115 msgid "Classical" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: internet/lastfmsettingspage.cpp:110 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 "" #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "" #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:116 msgid "Club" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "" #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "" #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "" #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "" #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "" #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "" #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "" #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "" #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:64 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: transcoder/transcoder.cpp:432 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "" #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "" #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "" #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "" #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "" #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "" #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "" #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "" #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "" #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "" #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:63 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "" #: core/song.cpp:328 msgid "Flac" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:43 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "" #: core/database.cpp:673 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "" #: internet/lastfmservice.cpp:437 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:154 msgid "Last.fm password" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "" #: ui/equalizer.cpp:123 msgid "Live" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "" #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "" #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "" #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "" #: core/song.cpp:330 msgid "MPC" msgstr "" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "" #: library/library.cpp:74 msgid "Most played" msgstr "" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "" #: library/library.cpp:67 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:80 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "" #: core/utilities.cpp:147 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:366 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "" #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "" #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "" #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "" #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "" #: core/organise.cpp:65 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:124 msgid "Party" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "" #: widgets/osd.cpp:156 msgid "Paused" msgstr "" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "" #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "" #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" 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:206 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "" #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "" #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:460 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "" #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "" #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 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 "" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "" #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "" #: core/song.cpp:341 msgid "Stream" msgstr "" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "" #: ui/about.cpp:70 msgid "Thanks to" msgstr "" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "" #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:56 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:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:174 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:151 msgid "Third level" msgstr "" #: internet/jamendoservice.cpp:171 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "" #: core/song.cpp:338 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "" #: devices/giolister.cpp:161 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "" #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "" #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "" #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "" clementine-1.2.0+dfsg/src/translations/es.po000066400000000000000000004751541223327513400210550ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Coroccotta , 2012 # Adolfo Jayme Barrientos , 2012-2013 # Adolfo Jayme Barrientos , 2013 # Adrián Prado , 2013 # Adrián Ramirez Escalante , 2012 # Andres Sanchez <>, 2012 # Carolina Pérez Garrido , 2011-2012 # ceal105 , 2011 # felipeacsi , 2012 # Fernando Torres , 2012 # legion1978 , 2012 # LeonimuZ , 2011 # aldraia , 2012 # Ricardo Andrés , 2012 # Robin Cornelio Thomas , 2012 # Roger Pueyo Centelles , 2012 # Sir Co$t Granda , 2012 # zeth , 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-11 12:55+0000\n" "Last-Translator: Adolfo Jayme Barrientos \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr " días" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " kb/s" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " pt" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " segundos" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " canciones" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 álbumes" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 días" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "hace %1 días" #: podcasts/gpoddersync.cpp:79 #, 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:413 #, qt-format msgid "%1 selected of" msgstr "%1 seleccionadas de" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 canción" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 canciones" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "Se encontraron %1 canciones" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "Se encontraron %1 canciones (mostrando %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 pistas" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 transferido" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Módulo Wiimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n falló" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n completado(s)" #: transcoder/transcodedialog.cpp:192 #, c-format msgid "%n remaining" msgstr "%n pendiente(s)" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&Alinear el texto" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&Centro" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "&Custom" msgstr "&Personalizado" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "&Extras" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "Ay&uda" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "&Ocultar «%1»" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "&Ocultar…" #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Izquierda" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "&Música" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Ninguno" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "&Lista de reproducción" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Salir" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "Modo de &repetición" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Derecha" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "Modo &aleatorio" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "&Ajustar columnas a la ventana" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "&Herramientas" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(diferentes a través de múltiples canciones)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "… y a todos los colaboradores de Amarok" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "0px" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 día" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 pista" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "127.0.0.1" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "40%" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 pistas al azar" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "Actualizar a Premium ahora" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "Crear una cuenta nueva o restablecer su contraseña" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "Se necesita una cuenta de Grooveshark Anywhere." #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "Se necesita una cuenta Premium de Spotify." #: ../bin/src/ui_networkremotesettingspage.h:189 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:78 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:153 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:297 msgid "A-Z" msgstr "A–Z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "ALABEMOS TODOS AL HIPNOSAPO" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "Interrumpir" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "Acerca de %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "Acerca de Clementine…" #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "Acerca de Qt…" #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Detalles de la cuenta" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "Detalles de la cuenta (premium)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Acción" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Activar/desactivar Wiiremote" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "Añadir podcast" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Añadir transmisión" #: ../bin/src/ui_notificationssettingspage.h:425 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:193 msgid "Add action" msgstr "Añadir acción" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Añadir otra transmisión…" #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Añadir directorio…" #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "Añadir archivo" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "Añadir un archivo al convertidor" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "Añadir archivo(s) al convertidor" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Añadir archivo…" #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Añadir archivos para convertir" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Añadir carpeta" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Añadir carpeta…" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Añadir carpeta nueva…" #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "Añadir podcast" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "Añadir podcast…" #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Añadir término de búsqueda" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "Añadir etiqueta de álbum a la canción" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "Añadir etiqueta de artista del álbum a la canción" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "Añadir etiqueta de artista a la canción" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "Añadir valoración automática de canción" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "Añadir etiqueta de compositor a la canción" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "Añadir etiqueta de disco a la canción" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "Añadir nombre de archivo de la canción" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "Añadir etiqueta de género a la canción" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "Añadir etiqueta de conjunto de la canción" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "Añadir etiqueta de duración de la canción" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "Añadir etiqueta de intérprete de la canción" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "Añadir contador de reproducción de la canción" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "Añadir valoración de canción" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "Añadir contador de omisiones de canciones" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "Añadir etiqueta de título a la canción" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "Añadir etiqueta de pista a la canción" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "Añadir etiqueta de año a la canción" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Añadir transmisión…" #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "Añadir a mis favoritos en Grooveshark" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "Añadir a listas de reproducción de Grooveshark" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "Añadir a otra lista de reproducción" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Añadir a la lista de reproducción" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "Añadir a la cola" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Añadir acción wiimotedev" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Añadir…" #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Añadidas este mes" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Añadidas esta semana" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Añadidas este año" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Añadidas hoy" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Añadidas en los últimos tres meses" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "Añadiendo la canción a Mi música" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "Añadiendo la canción a Favoritas" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Agrupamiento avanzado…" #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "Después de " #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "Después de copiar…" #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Álbum" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Álbum (volumen ideal para todas las pistas)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Artista del álbum" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "Carátula del álbum" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Información del álbum en jamendo.com…" #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Álbumes con carátulas" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Álbumes sin carátulas" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Todos los archivos (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "¡Alabemos todos al hipnosapo!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Todos los álbumes" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Todos los artistas" #: ui/albumcoverchoicecontroller.cpp:47 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:74 msgid "All the translators" msgstr "Todos los traductores" #: library/library.cpp:84 msgid "All tracks" msgstr "Todas las pistas" #: ../bin/src/ui_networkremotesettingspage.h:194 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:196 msgid "Allow downloads" msgstr "Permitir descargas" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "Permitir codificación mid/side" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "Junto a los originales" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Siempre ocultar la ventana principal" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Siempre mostrar la ventana principal" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "Siempre empezar a reproducir" #: internet/spotifyblobdownloader.cpp:60 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:61 msgid "An error occurred loading the iTunes database" msgstr "Ocurrió un error al cargar la base de datos de iTunes" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Ocurrió un error al escribir los metadatos en «%1»" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "Ocurrió un error no especificado." #: ui/about.cpp:78 msgid "And:" msgstr "Y:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "Furioso" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Apariencia" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Añadir archivos/URL a la lista de reproducción" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "Añadir a la lista de reproducción actual" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "Añadir a la lista de reproducción" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "Aplicar compresión para evitar cortes" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "¿Está seguro de que quiere eliminar la predefinición «%1»?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "¿Está seguro de que quiere eliminar esta lista de reproducción?" #: ui/edittagdialog.cpp:769 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:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Artista" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Info. artista" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "Radio del artista" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "Etiquetas del artista" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "Iniciales del artista" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Formato de audio" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Falló la autenticación" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "Autor" #: ui/about.cpp:65 msgid "Authors" msgstr "Autores" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Auto" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Actualización automática" #: ../bin/src/ui_librarysettingspage.h:208 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:45 msgid "Available" msgstr "Disponible" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "Tasa de bits promedio" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "Tamaño promedio de imagen" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "Podcasts de BBC" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "PPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "Flujos de fondo" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Color de fondo" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "Imagen de fondo" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Opacidad del fondo" #: core/database.cpp:734 msgid "Backing up database" msgstr "Respaldando la base de datos" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "Balance" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Vetar" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "Analizador de barras" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Azul básico" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "Tipo de audio básico" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Comportamiento" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "Mejor" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "Biografía de %1" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Tasa de bits" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "Tasa de bits" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "Analizador de bloques" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "Tipo de bloque" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "Cantidad de desenfoque" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "Cuerpo" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "Analizador de resonancia" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Examinar…" #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "Duración del búfer" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "Guardando en caché" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "Pero estas fuentes están desactivadas:" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Botones" #: core/song.cpp:339 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "Compatibilidad con hojas CUE" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "Cancelar" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Cambiar la carátula" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Cambiar tamaño de letra…" #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "Cambiar modo de repetición" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Cambiar atajo…" #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "Cambiar modo aleatorio" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Cambiar el idioma" #: ../bin/src/ui_playbacksettingspage.h:330 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:228 msgid "Check for new episodes" msgstr "Comprobar episodios nuevos" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Comprobar actualizaciones…" #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "Elija un nombre para su lista de reproducción inteligente" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Elegir automáticamente" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Elegir color…" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "Elegir tipografía…" #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Elegir de la lista" #: smartplaylists/querywizardplugin.cpp:155 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á." #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "Elegir directorio de descarga de podcasts" #: ../bin/src/ui_songinfosettingspage.h:188 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:115 msgid "Classical" msgstr "Clásica" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "Limpieza" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Limpiar" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Limpiar lista de reproducción" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Error de Clementine" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Naranja de Clementine" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Visualización de Clementine" #: ../bin/src/ui_deviceproperties.h:376 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_boxsettingspage.h:104 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:104 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:104 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_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "Clementine puede reproducir música que haya cargado a Ubuntu One" #: ../bin/src/ui_notificationssettingspage.h:431 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:250 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:128 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." #: internet/lastfmsettingspage.cpp:110 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 "Clementine no pudo obtener el estado de su suscripción porque hay problemas con la conexión. Las canciones que escuche se guardarán y enviarán a Last.fm más tarde." #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Visor de imágenes de Clementine" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "Clementine no encontró resultados para este archivo" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "Clementine buscará música en:" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Pulse aquí para añadir música" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "Pulse para cambiar entre tiempo restante y tiempo total" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "Cerrar lista de reproducción" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "Cerrar la visualización" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "Si cierra esta ventana, se cancelará la descarga." #: ui/albumcovermanager.cpp:216 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:116 msgid "Club" msgstr "Club" #: ../bin/src/ui_appearancesettingspage.h:272 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:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Comentario" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "Completar etiquetas automáticamente" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "Completar etiquetas automáticamente…" #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Compositor" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "Configurar %1…" #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "Configurar Grooveshark…" #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Configurar Last.fm…" #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "Configurar Magnatune…" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Configurar atajos" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "Configurar Spotify…" #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "Configurar Subsonic…" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "Configurar búsqueda global…" #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "Configurar colección…" #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "Configurar podcasts…" #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "Configurar…" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "Conectar Wii Remotes usando acción de activar/desactivar" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "Conectar dispositivo" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "Conectando con Spotify" #: internet/subsonicsettingspage.cpp:107 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/subsonicsettingspage.cpp:117 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/" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "Consola" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "Tasa de bits constante" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "Convertir toda la música" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "Convertir cualquier música que el dispositivo no pueda reproducir" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "Copiar al portapapeles" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Copiar al dispositivo…" #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Copiar a la colección…" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "Copyright" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "No se pudo conectar a Subsonic, revise la URL del servidor. Ejemplo: http://localhost:4040/" #: transcoder/transcoder.cpp:64 #, 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." #: transcoder/transcoder.cpp:432 #, 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:426 #, 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/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "No se pudo cargar la estación de radio de Last.fm" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "No se pudo abrir el archivo de salida %1" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Gestor de carátulas" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "Carátula desde imagen incrustada" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Carátula cargada automáticamente desde %1" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "Carátula eliminada manualmente" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "Carátula no definida" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "Carátula definida desde %1" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "Carátulas de %1" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "Crear una lista de reproducción nueva en Grooveshark" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "Fundido encadenado al cambiar pistas automáticamente" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "Fundido encadenado al cambiar pistas manualmente" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Abajo" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Mayús+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Mayús+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "Ctrl+Mayús+T" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Arriba" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "Personalizado" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "Imagen personalizada:" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "Configuración de mensaje personalizado" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "Radio personalizada" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Personalizado…" #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "Ruta de DBus" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Dance" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Fecha de creación" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Fecha de modificación" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "Días" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "Pre&determinado" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "Disminuir el volumen en 4%" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "Reducir el volumen en %" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Disminuir volumen" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "Imagen de fondo predeterminada" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "Valores predeterminados" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "Retardo entre visualizaciones" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "Eliminar" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "Eliminar lista de reproducción de Grooveshark" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "Eliminar datos descargados" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Eliminar archivos" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Eliminar del dispositivo…" #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Eliminar del disco…" #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "Eliminar episodios reproducidos" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "Eliminar predefinición" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "Eliminar lista de reproducción inteligente" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "Eliminar los archivos originales" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Eliminando los archivos" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "Quitar las pistas seleccionadas de la cola" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "Quitar la pista de la cola" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Destino" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Detalles…" #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Dispositivo" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Propiedades del dispositivo" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Nombre del dispositivo" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Propiedades del dispositivo…" #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Dispositivos" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Quiso decir" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "Contraseña de Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "Nombre de usuario de Digitally Imported" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "Conexión directa a Internet" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Directorio" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "Desactivar duración" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "Desactivar generación de barras de ánimo" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Desactivado" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Disco" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "Transmisión discontinua" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 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:715 msgid "Do a full library rescan" msgstr "Volver a analizar toda la colección" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "No convertir ninguna música" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "No sobreescribir" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "No repetir" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "No mostrar en Varios artistas" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "No mezclar" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "No detener" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "Donar" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Pulse dos veces para abrir" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "Al pulsar dos veces sobre una canción…" #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "Descargar %n episodios" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "Directorio de descargas" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "Descargar episodios a" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "Membresía para descarga" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "Descargar episodios nuevos automáticamente" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "Descarga en cola" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "Descargue la aplicación para Android" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Descargar este álbum" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Descargar este álbum…" #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "Descargar este episodio" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "Descargar…" #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "Descargando (%1%)…" #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "Descargando el directorio de Icecast" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "Descargando el catálogo de Jamendo" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "Descargando el catálogo de Magnatune" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "Descargando el complemento de Spotify" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "Descargando los metadatos" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "Arrastre para reposicionar" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "Dropbox" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "Modo dinámico encendido" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "Mezcla dinámica aleatoria" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "Editar lista de reproducción inteligente…" #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Editar etiqueta «%1»…" #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "Editar etiqueta…" #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "Editar etiquetas" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Editar información de la pista" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "Editar información de la pista…" #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Editar información de las pistas…" #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Editar…" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "Activar compatibilidad con Wii Remote" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "Activar el ecualizador" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "Activar atajos solo cuando Clementine tenga el foco" #: ../bin/src/ui_globalsearchsettingspage.h:147 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:62 msgid "Enable/disable Last.fm scrobbling" msgstr "Activar/desactivar scrobbling de Last.fm" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "Complejidad de codificación" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "Calidad del motor de codificación" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "Modo de codificación" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "Introduzca una URL" #: ../bin/src/ui_coverfromurldialog.h:103 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:205 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:137 msgid "Enter a new name for this playlist" msgstr "Escriba un nombre nuevo para esta lista de reproducción" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Escriba un artista o etiqueta para escuchar la radio de Last.fm." #: ../bin/src/ui_globalsearchview.h:209 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:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Introduzca términos de búsqueda para encontrar podcasts en la tienda iTunes" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Introduzca términos de búsqueda para encontrar podcasts en gpodder.net" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "Escriba términos de búsqueda aquí" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "Escriba el URL de un flujo de radio por Internet:" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "Escriba el nombre de la carpeta" #: ../bin/src/ui_networkremotesettingspage.h:198 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:87 msgid "Entire collection" msgstr "Colección completa" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Error" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Error al conectar al dispositivo MTP" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "Error al copiar las canciones" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "Error al eliminar canciones" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "Error al descargar el complemento de Spotify" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "Error al cargar %1" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Error al cargar la lista de reproducción de di.fm" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "Error al procesar %1: %2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "Error al cargar el CD de audio" #: library/library.cpp:63 msgid "Ever played" msgstr "Reproducidos alguna vez" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "Cada 10 minutos" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "Cada 12 horas" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "Cada 2 horas" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "Cada 20 minutos" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "Cada 30 minutos" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "Cada 6 horas" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "Cada hora" #: ../bin/src/ui_playbacksettingspage.h:303 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:208 msgid "Existing covers" msgstr "Carátulas existentes" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "Expandir" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "Caduca el %1" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "Exportar carátulas" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "Exportar carátulas" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "Exportar carátulas descargadas" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "Exportar carátulas incrustadas" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "Exportación finalizada" #: ui/albumcovermanager.cpp:786 #, 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:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "Fundido al pausar y al reanudar" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "Desvanecer al detener una pista" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "Fundido" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "Duración del fundido" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "No se pudo obtener el directorio" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "No se pudieron obtener los podcasts" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "No se pudo cargar el podcast" #: podcasts/podcasturlloader.cpp:167 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:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "Rápida" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "Favoritos" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "Pistas favoritas" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "Descargar las carátulas faltantes" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "Obtener automáticamente" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "Descarga completada" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "Obteniendo biblioteca de Subsonic" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Error al obtener la carátula" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "Extensión del archivo" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "Formatos de archivo" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Nombre del archivo" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "Nombre del archivo (sin ruta)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Tamaño del archivo" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Tipo de archivo" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Nombre del archivo" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Archivos" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "Archivos para convertir" #: smartplaylists/querywizardplugin.cpp:90 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ó." #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "Identificando la canción" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "Finalizar" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "Primer nivel" #: core/song.cpp:328 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Tamaño de letra" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Por razones de licencia, para usar Spotify se necesita un complemento separado." #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "Forzar la codificación monoaural" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "Olvidar dispositivo" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Formulario" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "Formato" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Tasa de muestreo" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "Cuadros por búfer" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Amigos" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "Congelado" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Graves completos" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "Graves y agudos completos" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "Agudos completos" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "Motor de audio GStreamer" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "General" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Configuración general" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Género" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "Obtener una URL para compartir esta lista de reproducción de Grooveshark" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "Obtener una URL para compartir esta canción de Grooveshark" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "Obteniendo canciones populares de Grooveshark" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "Obteniendo canales" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "Obteniendo transmisiones" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "Dele un nombre:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "Ir" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "Ir a la siguiente lista de reproducción" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "Ir a la lista de reproducción anterior" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, 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:206 msgid "Grey out non existent songs in my playlists" msgstr "Oscurecer canciones inexistentes de mis listas de reproducción" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "Error de inicio de sesión en Grooveshark" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "URL de lista de reproducción de Grooveshark" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "Radio de Grooveshark" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "URL de la canción de Grooveshark" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "Agrupar colección por…" #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "Agrupar por" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "Agrupar por álbum" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "Agrupar por artista" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "Agrupar por artista/álbum" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "Agrupar por artista/año - álbum" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "Agrupar por género/álbum" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "Agrupar por género/artista/álbum" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "Conjunto" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "La página HTML no contiene ningún canal RSS" #: internet/subsonicsettingspage.cpp:135 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:163 msgid "HTTP proxy" msgstr "Proxy HTTP" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "Alegre" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "Información del hardware" #: ../bin/src/ui_deviceproperties.h:372 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:202 msgid "High" msgstr "Alto" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "Alta (%1 fps)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "Alta (1024×1024)" #: internet/subsonicsettingspage.cpp:112 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:310 msgid "Hours" msgstr "Horas" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "Hipnosapo" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "No tengo una cuenta en Magnatune" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Icono" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "Iconos en la parte superior" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "Identificando la canción" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 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:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Si conoce la URL de un podcast, introdúzcala a continuación y pulse Ir." #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "Ignorar «The» en los nombres de artistas" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Imágenes (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "En %1 días" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "En %1 semanas" #: ../bin/src/ui_wizardfinishpage.h:86 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/spotifyservice.cpp:360 msgid "Inbox" msgstr "Bandeja de entrada" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "Incluir carátula en la notificación" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "Incluir todas las canciones" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Versión del protocolo REST de Subsonic incompatible. El cliente debe actualizarse." #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Versión del protocolo REST de Subsonic incompatible. El servidor debe actualizarse." #: internet/subsonicsettingspage.cpp:127 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:158 msgid "Increase the volume by 4%" msgstr "Incrementar el volumen en 4%" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "Aumentar el volumen en %" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Aumentar volumen" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "Indizando %1" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "Información" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "Insertar…" #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Instalado" #: core/database.cpp:673 msgid "Integrity check" msgstr "Comprobación de integridad" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "Proveedores en Internet" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "Clave API no válida" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Formato no válido" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "Método no válido" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "Parámetros no válidos" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "Se especificó un recurso no válido" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "Servicio no válido" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "Clave de sesión no válida" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "Nombre de usuario y/o contraseña no válidos" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "Pistas más escuchadas de Jamendo" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "Mejores pistas de Jamendo" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "Mejores pistas del mes en Jamendo" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "Mejores pistas de la semana en Jamendo" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "Base de datos de Jamendo" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "Saltar a la pista en reproducción" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Presionar los botones por %1 segundo…" #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Presionar los botones por %1 segundos…" #: ../bin/src/ui_behavioursettingspage.h:193 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:193 msgid "Keep the original files" msgstr "Mantener los archivos originales" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "Gatitos" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Idioma" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "Portátil/auriculares" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Salón grande" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "Carátula de álbum grande" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "Barra lateral grande" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "Últimas reproducidas" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "Radio personalizada de Last.fm: %1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Colección en Last.fm de %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "Radio mix de Last.fm de %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Radio de vecinos en Last.fm de %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Estación de radio en Last.fm de %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Artistas en Last.fm similares a %1" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Radio en Last.fm de la etiqueta %1" #: internet/lastfmservice.cpp:437 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:154 msgid "Last.fm password" msgstr "Contraseña de Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "N.º de reproducciones en Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Etiquetas de Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Nombre de usuario de Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Wiki de Last.fm" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "Pistas menos favoritas" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "Déjelo en blanco para el predeterminado. Ejemplos: «/dev/dsp», «front», etc." #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "Izquierda" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Duración" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Colección" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "Agrupamiento avanzado de la colección" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "Aviso de reanálisis de la colección" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "Buscar en la colección" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Límites" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "Escuche canciones en Grooveshark con base en las que ha escuchado previamente." #: ui/equalizer.cpp:123 msgid "Live" msgstr "En vivo" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Cargar" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "Cargar carátula desde un URL" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "Cargar carátula desde un URL…" #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "Cargar carátula desde el disco" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "Cargar carátula desde disco…" #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "Cargar lista de reproducción" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "Cargar lista de reproducción…" #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Cargando la radio de Last.fm" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Cargando el dispositivo MTP" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "Cargando la base de datos del iPod" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "Cargando lista de reproducción inteligente" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "Cargando las canciones" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "Cargando el flujo" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "Cargando las pistas" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "Cargando información de pistas" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "Cargando…" #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "Carga archivos/URL, reemplazando la lista de reproducción actual" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Iniciar sesión" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "Falló el inicio de sesión" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "Perfil de predicción a largo plazo (LTP)" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "Me encanta" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Baja (%1 fps)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "Baja (256×256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "Perfil de baja complejidad (LC)" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "Letras" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "Letra de %1" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Descarga de Magnatune" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Descarga de Magnatune finalizada" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "Perfil principal (MAIN)" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "Así sea" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "Hacer disponible la lista de reproducción sin conexión" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "Respuesta con formato incorrecto" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "Configuración manual del proxy" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "Manualmente" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "Fabricante" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "Marcar como escuchado" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "Marcar como nuevo" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "Coincide cualquier término de búsqueda (Y)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "Coincide uno o más términos de búsqueda (O)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "Tasa de bits máxima" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "Media (%1 fps)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "Media (512×512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "Tipo de membresía" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "Tasa de bits mínima" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "Faltan las predefiniciones de projectM" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "Modelo" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "Monitorizar cambios en la colección" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "Reproducción monoaural" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "Meses" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "Ánimo" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "Estilo de barra de ánimo" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "Barras de ánimo" #: library/library.cpp:74 msgid "Most played" msgstr "Más reproducidas" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "Punto de montaje" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "Puntos de montaje" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "Mover hacia abajo" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "Mover a la colección…" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "Mover hacia arriba" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "Música" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Colección musical" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "Silenciar" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "Mi colección de Last.fm" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "Mi radio mix de Last.fm" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "Mis vecinos de Last.fm" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "Mi radio recomendada de Last.fm" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "Mi Mix Radio" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "Mi música" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "Mi vecindario" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "Mi estación de radio" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "Mis recomendaciones" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Nombre" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "Opciones de nombrado" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "Banda estrecha (NB)" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "Vecinos" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "Red" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "Proxy de la red" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "Control remoto de red" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "Nunca" #: library/library.cpp:67 msgid "Never played" msgstr "Nunca reproducidas" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "Nunca comenzar la reproducción" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "Carpeta nueva" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "Lista de reproducción nueva" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "Lista de reproducción inteligente nueva…" #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "Canciones nuevas" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "Las pistas nuevas se añadirán automáticamente." #: library/library.cpp:80 msgid "Newest tracks" msgstr "Pistas más recientes" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "Siguiente" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Pista siguiente" #: core/utilities.cpp:147 msgid "Next week" msgstr "Próxima semana" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "Sin analizador" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "Sin imagen de fondo" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "No hay ninguna carátula que exportar." #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "Sin bloques largos" #: playlist/playlistcontainer.cpp:366 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:145 msgid "No short blocks" msgstr "Sin bloques cortos" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "Ninguno" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "Ninguna de las canciones seleccionadas fueron aptas para copiarlas a un dispositivo" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "Normal" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "Tipo de bloque normal" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "No disponible al utilizar una lista de reproducción dinámica" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "No conectado" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "No hay contenido suficiente" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "No hay seguidores suficientes" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "No hay miembros suficientes" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "No hay vecinos suficientes" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "No instalado" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "No inició sesión" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "Sin montar – pulse dos veces para montar" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "Tipo de notificación" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Notificaciones" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "En reproducción" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "Previsualización del OSD" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "Opacidad" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "Abrir %1 en el navegador" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "Abrir CD de &audio…" #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "Abrir archivo OPML" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "Abrir archivo OPML…" #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "Abrir dispositivo" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "Abrir archivo…" #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "Abrir en Google Drive" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "Abrir en una lista de reproducción nueva" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Abrir…" #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "Falló la operación" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "Optimizar para tasa de bits" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "Optimizar para calidad" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "Opciones…" #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "Organizar archivos" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "Organizar archivos…" #: core/organise.cpp:65 msgid "Organising files" msgstr "Organizando los archivos" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "Etiquetas originales" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Otras opciones" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "Salida" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "Dispositivo de salida" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "Opciones de salida" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "Complemento de salida" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "Sobreescribir todo" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "Sobreescribir los archivos existentes" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "Sobreescribir solo las más pequeñas" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "Propietario" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "Analizando el catálogo de Jamendo" #: ui/equalizer.cpp:124 msgid "Party" msgstr "Fiesta" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "Contraseña" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Pausar" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "Pausar la reproducción" #: widgets/osd.cpp:156 msgid "Paused" msgstr "En pausa" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "Intérprete" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "Píxel" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "Barra lateral simple" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Reproducir" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "Reproducir un artista o etiqueta" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "Reproducir radio del artista…" #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "N.º de reproducciones" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "Reproducir radio personalizada…" #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "Reproducir si está detenida, pausar si se está reproduciendo" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "Reproducir si no hay nada en reproducción" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "Reproducir radio de etiqueta…" #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "Reproducir la .ª pista de la lista de reproducción" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "Reproducir/pausar" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Reproducción" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Opciones del reproductor" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "Lista de reproducción" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "Lista de reproducción finalizada" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "Opciones de la lista de reproducción" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "Tipo de lista de reproducción" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "Listas repr." #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "Cierre su navegador y regrese a Clementine." #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "Estado del complemento:" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "Podcasts" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Pop" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "Canciones populares" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "Canciones populares del mes" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "Canciones populares hoy" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "Duración de la notificación" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "Puerto" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "Preamplificación" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "Preferencias" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "Preferencias…" #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "Nombres de archivo preferidos para las carátulas (separados por comas)" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "Formato de audio preferido" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "Tasa de bits preferida" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "Formato preferido" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "Tipo de audio premium" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "Predefinición:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "Pulse una combinación de botones que usar para" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "Pulse una tecla" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, 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_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "Opciones del OSD estético" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "Previsualización" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "Anterior" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 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:131 msgid "Profile" msgstr "Perfil" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "Progreso" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 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:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "Calidad" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "Consultando dispositivo…" #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "Gestor de la cola" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "Añadir las pistas seleccionadas a la cola" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "Añadir a la cola de reproducción" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "Radio (volumen igual para todas las pistas)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "Radios" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "Lluvia" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "Visualización al azar" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "Valorar la canción actual con 0 estrellas" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "Valorar la canción actual con 1 estrella" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "Valorar la canción actual con 2 estrellas" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "Valorar la canción actual con 3 estrellas" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "Valorar la canción actual con 4 estrellas" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "Valorar la canción actual con 5 estrellas" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "Clasificación" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "¿Realmente quiere cancelar?" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "Se excedió el límite de redirecciones, compruebe la configuración del servidor." #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "Actualizar" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "Actualizar el catálogo" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "Actualizar los canales" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "Actualizar lista de amigos" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "Actualizar lista de estaciones" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "Actualizar transmisiones" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Reggae" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "Recordar el movimiento del Wii Remote" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "Recordar la última vez" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Quitar" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "Eliminar acción" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "Eliminar duplicados de la lista de reproducción" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "Quitar carpeta" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "Quitar de Mi música" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "Quitar de favoritos" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "Eliminar de la lista de reproducción" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "Eliminar lista de reproducción" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "Eliminar listas de reproducción" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "Quitando canciones de Mi música" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "Eliminando canciones de los favoritos" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "Renombrar lista de reproducción «%1»" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "Renombrar lista de reproducción de Grooveshark" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "Renombrar lista de reproducción" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "Renombrar lista de reproducción…" #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "Reenumerar pistas en este orden…" #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Repetir" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "Repetir álbum" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "Repetir lista de reproducción" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "Repetir pista" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Reemplazar lista de reproducción actual" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "Reemplazar la lista de reproducción" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "Reemplazar espacios con guiones bajos" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "Replay Gain" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "Modo de regulación de volumen" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "Repoblar" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "Solicitar un código de autenticación" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "Restablecer" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" msgstr "Reiniciar contador de reproducciones" #: 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:206 msgid "Restrict to ASCII characters" msgstr "Restringir a caracteres ASCII" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "Reanudar la reproducción al iniciar" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "Obteniendo canciones de Mi música de Grooveshark" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "Recuperando canciones favoritas de Grooveshark" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "Recuperando listas de reproducción de Grooveshark" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "Volver a Clementine" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "Derecha" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "Ejecutar" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "Proxy para SOCKS" #: internet/subsonicsettingspage.cpp:122 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:202 msgid "Safely remove device" msgstr "Quitar dispositivo con seguridad" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "Quitar dispositivo con seguridad después de copiar" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "Tasa de muestreo" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "Tasa de muestreo" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "Guardar archivos .mood en la colección musical" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "Guardar la carátula del álbum" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "Guardar la carátula en el disco…" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "Guardar imagen" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "Guardar lista de reproducción" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "Guardar lista de reproducción…" #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "Guardar la predefinición" #: ../bin/src/ui_librarysettingspage.h:193 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:197 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:115 msgid "Save this stream in the Internet tab" msgstr "Guardar este flujo en la pestaña de Internet" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "Guardando las estadísticas en los archivos de las canciones" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "Guardando las pistas" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "Perfil de tasa de muestreo escalable (SSR)" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "Tamaño de escala" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "Valoración" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "Enviar las pistas que reproduzco" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "Buscar" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "Buscar estaciones Icecast" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "Buscar en Jamendo" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Buscar en Magnatune" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "Buscar en Subsonic" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "Buscar la carátula del álbum…" #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "Buscar cualquier cosa" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "Buscar en gpodder.net" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "Buscar en iTunes" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "Modo de búsqueda" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "Opciones de búsqueda" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "Resultados de búsqueda" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "Términos de búsqueda" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "Buscando en Grooveshark" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "Segundo nivel" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "Retroceder" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "Avanzar" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "Moverse en la pista actual hacia una posición relativa" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "Moverse en la pista actual hacia una posición absoluta" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "Seleccionar todo" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "No seleccionar nada" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "Elija el color de fondo:" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "Elija la imagen de fondo" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "Seleccionar la mejor coincidencia posible" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "Elija el color de frente:" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "Elegir visualizaciones" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "Elegir visualizaciones…" #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "N.º de serie" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "URL del servidor" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "Detalles del servidor" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "Servicio fuera de línea" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Establecer %1 a «%2»…" #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "Establecer el volumen en por ciento" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "Establecer valor para todas las pistas seleccionadas…" #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "Configuración" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Atajo" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "Atajo para %1" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Ya existe un atajo para %1" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Mostrar" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "Mostrar OSD" #: ../bin/src/ui_playbacksettingspage.h:298 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:293 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:434 msgid "Show a native desktop notification" msgstr "Mostrar la notificación propia del escritorio" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Mostrar notificación cuando cambie entre los modos repetir/aleatorio" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "Mostrar una notificación cuando el usuario cambie el volumen" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "Mostrar un mensaje emergente en el área de notificación" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "Mostrar OSD estético" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "Mostrar la barra de estado superior" #: ui/mainwindow.cpp:460 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:209 msgid "Show cover art in library" msgstr "Mostrar las carátulas en la colección" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "Mostrar divisores" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "Mostrar a tamaño completo…" #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "Mostrar en navegador de archivos…" #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "Mostrar en Varios artistas" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "Mostrar barra de ánimo" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "Mostrar solo los duplicados" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "Mostrar canciones sin etiquetar solamente" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "Mostrar sugerencias de búsquedas" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "Mostrar los botones «Me encanta» y «Vetar»" #: ../bin/src/ui_lastfmsettingspage.h:158 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:192 msgid "Show tray icon" msgstr "Mostrar icono en el área de notificación" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "Mostrar cuáles fuentes están activadas y desactivadas" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "Mostrar/ocultar" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Aleatorio" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "Mezclar álbumes" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "Mezclar todo" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "Mezclar lista de reproducción" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "Mezclar canciones de este álbum" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "Iniciar sesión" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "Cerrar sesión" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "Iniciando sesión…" #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "Artistas similares" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "Tamaño" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "Tamaño:" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "Saltar hacia atrás en la lista de reproducción" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "Contador de omisiones" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "Saltar hacia adelante en la lista de reproducción" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "Carátula de álbum pequeña" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "Barra lateral pequeña" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "Lista de reproducción inteligente" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "Listas de reproducción inteligentes" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "Soft rock" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "Información de la canción" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "Info. canción" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "Sonograma" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "Lo sentimos" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "Ordenar por género (alfabéticamente)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "Ordenar por género (popularidad)" #: ../bin/src/ui_icecastfilterwidget.h:77 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" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "Origen" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "Orígenes" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "Error de inicio de sesión de Spotify" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "Complemento de Spotify" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "El complemento de Spotify no está instalado" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "Estándar" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "Destacado" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "Iniciar la lista de reproducción actualmente en reproducción" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "Iniciar la conversión" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 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:405 #, qt-format msgid "Starting %1" msgstr "Iniciando %1" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "Iniciando…" #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "Estaciones" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Detener" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "Detener después de" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "Detener reproducción al finalizar la pista" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Detener reproducción" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "Detener la reproducción después de la pista actual" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "Detenido" #: core/song.cpp:341 msgid "Stream" msgstr "Transmisión" #: internet/subsonicsettingspage.cpp:30 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:160 msgid "Streaming membership" msgstr "Membresía para streaming" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "Listas de reproducción suscritas" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "Suscriptores" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "Exitoso" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "%1 se ha escrito con éxito" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "Etiquetas sugeridas" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "Resumen" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "Muy alta (%1 fps)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "Muy alta (2048×2048)" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "Formatos admitidos" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "Sincronizar estadísticas a los archivos ahora" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "Sincronizando bandeja de entrada de Spotify" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "Sincronizando lista de reproducción de Spotify" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "Sincronizando canciones destacadas de Spotify" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "Colores del sistema" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "Pestañas en la parte superior" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Etiqueta" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "Obtener etiquetas" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "Radio de la etiqueta" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "Tasa de bits de destino" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Tecno" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "Opciones del texto" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Gracias a" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "No se pudo iniciar la orden «%1»." #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "La carátula del álbum de la canción en reproducción" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "La carpeta %1 no es válida" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "La lista de reproducción «%1» estaba vacía o no se pudo cargar." #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "El sitio que indicó no es una imagen." #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "Hay otras canciones en este álbum" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "Hubo un problema al comunicarse con gpodder.net" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Hubo un problema al obtener los metadatos desde Magnatune" #: podcasts/itunessearchpage.cpp:76 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:56 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:389 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:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 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:187 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:174 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 el diálogo «Convertir música», y cuando se convierte la música antes de copiarla a un dispositivo." #: ../bin/src/ui_groupbydialog.h:151 msgid "Third level" msgstr "Tercer nivel" #: internet/jamendoservice.cpp:171 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/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "Este álbum no se encuentra disponible en el formato solicitado" #: ../bin/src/ui_deviceproperties.h:381 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:375 msgid "This device supports the following file formats:" msgstr "Este dispositivo admite los formatos de archivo siguientes:" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Este dispositivo no funcionará correctamente" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Puede modificar esta opción en la pestaña «Comportamiento» en Preferencias" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "Este flujo es solo para los suscriptores de pago" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "No se admite este tipo de dispositivo: %1" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "Tiempo de espera" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Título" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "Para iniciar la radio de Grooveshark, debe primero escuchar algunas canciones de Grooveshark." #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "Hoy" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "Conmutar OSD estético" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Pantalla completa" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "Cambiar estado de la cola" #: ../bin/src/ui_mainwindow.h:718 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:143 msgid "Tomorrow" msgstr "Mañana" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "Demasiadas redirecciones" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "Mejores pistas" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "Álbumes totales:" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "Total de bytes transferidos" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "Total de solicitudes hechas a la red" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Pista" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "Convertir música" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "Registro del convertidor" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "Conversión" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Convirtiendo %1 archivos usando %2 procesos" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "Opciones de conversión" #: core/song.cpp:338 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "Turbina" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "Apagar" #: devices/giolister.cpp:161 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "URL(s)" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "Contraseña de Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "Nombre de usuario de Ubuntu One" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "Banda ultraancha (UWB)" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Imposible descargar %1 (%2)" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Desconocido" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "Tipo de contenido desconocido" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Error desconocido" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "Eliminar la carátula" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "Cancelar suscripción" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "Próximos conciertos" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "Actualizar lista de reproducción de Grooveshark" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "Actualizar todos los podcasts" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "Actualizar carpetas de la colección modificadas" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "Actualizar la colección cuando inicie Clementine" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "Actualizar este podcast" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "Actualización" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Actualizando %1" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "Actualizando %1%…" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Actualizando la colección" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "Uso" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "Usar etiqueta Artista del álbum cuando esté disponible" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "Usar las combinaciones de teclas de Gnome" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "Usar metadatos de Replay Gain si están disponibles" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "Utilizar SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "Usar Wii Remote" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "Usar un conjunto de colores personalizado" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "Usar un mensaje personalizado para las notificaciones" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "Usar un control remoto de red" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "Utilizar autenticación" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "Usar el motor de gestión de flujo de bits" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "Usar modo dinámico" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "Usar notificaciones para informar del estado del Wii Remote" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "Usar modelado de ruido temporal" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "Usar los ajustes predeterminados del sistema" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "Utilizar el conjunto de colores del sistema" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "Utilizar la configuración de proxy del sistema" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "Usar normalización de volumen" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "Usado" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "El usuario %1 no tiene una cuenta Grooveshark Anywhere" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "Interfaz de usuario" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Nombre de usuario" #: ../bin/src/ui_behavioursettingspage.h:207 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:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "Tasa de bits variable" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "Varios artistas" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "Versión %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "Ver" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "Modo de visualización" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "Visualizaciones" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "Configuración de visualizaciones" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "Detección de actividad de voz" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "Volumen %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "Avisarme antes de cerrar una pestaña de lista de reproducción" #: core/song.cpp:337 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "Sitio web" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "Semanas" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "Cuando Clementine inicia" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "Cuando la lista está vacía…" #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "Por qué no intenta…" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "Banda ancha (WB)" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii Remote %1: activo" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii Remote %1: conectado" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii Remote %1: batería en estado crítico (%2%) " #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii Remote %1: desactivado" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii Remote %1: desconectado" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Remote %1: batería baja (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "Audio de Windows Media" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "Sin carátula:" #: library/libraryview.cpp:530 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:2088 msgid "Would you like to run a full rescan right now?" msgstr "¿Quiere ejecutar un reanálisis completo ahora?" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "Escribir las estadísticas de todas las canciones en los archivos" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "Nombre de usuario o contraseña incorrectos." #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "Año" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "Año–álbum" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "Años" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "Ayer" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "Está a punto de descargar los álbumes siguientes" #: playlist/playlistlistcontainer.cpp:311 #, 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:177 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:172 msgid "You are not signed in." msgstr "No ha iniciado sesión." #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "Ha iniciado sesión como %1." #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "Ha iniciado sesión." #: ../bin/src/ui_groupbydialog.h:123 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/digitallyimportedsettingspage.cpp:46 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/magnatunesettingspage.cpp:53 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:57 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." #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "Puede enviar de forma gratuita la información de las canciones escuchadas, pero solo los suscriptores de pago pueden escuchar la radio de Last.fm desde Clementine." #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "No tiene una cuenta Grooveshark Anywhere." #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "No tiene una cuenta Premium de Spotify." #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "No tiene una suscripción activa" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Ha cerrado su sesión en Spotify, vuelva a introducir su contraseña en el diálogo de Configuración." #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Su sesión en Spotify ha caducado, vuelva a introducir su contraseña." #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "Esta canción es una de sus favoritas" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "Necesita ejecutar Preferencias del sistema y activar \"Activar acceso para dispositivos de asistencia\" para utilizar los atajos de teclado globales en Clementine." #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "Necesitará reiniciar Clementine si cambia el idioma." #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "No podrá reproducir las estaciones de radio de Last.fm hasta que no sea un suscriptor de Last.fm." #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "Su dirección IP:" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Sus credenciales de Last.fm son incorrectas" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "Sus credenciales de Magnatune fueron incorrectas" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "Su colección está vacía." #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "Sus flujos de radio" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "Sus scrobbles: %1" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Su sistema no es compatible con OpenGL, y las visualizaciones no están disponibles." #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "Su nombre de usuario o contraseña es incorrecta." #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Z–A" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Cero" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "añadir %n pistas" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "después" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "atrás" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "y" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "automático" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "antes" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "entre" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "más grande primero" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "ppm" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "contiene" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "desactivado" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "disco %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "no contiene" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "termina con" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "sea igual a" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "gpodder.net" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "Directorio de gpodder.net" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "mayor que" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "en los últimos" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "kb/s" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "menor que" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "más largo primero" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "mover %n canciones" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "más nuevo primero" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "no sea igual a" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "no en los últimos" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "no en" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "más antiguo primero" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "en" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "opciones" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "o escanee el código QR" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "presione intro" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "quitar %n canciones" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "más corto primero" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "canciones aleatorias" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "más pequeño primero" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "ordenar canciones" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "comienza con" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "detener" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "pista %1" clementine-1.2.0+dfsg/src/translations/es_AR.po000066400000000000000000004514551223327513400214350ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Adrián Ramirez Escalante , 2012. # Andres Sanchez <>, 2012. # Carolina Pérez Garrido , 2011. # , 2011. # , 2012. # , 2012. # , 2012. # , 2011. msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-03-30 23:26+0000\n" "Last-Translator: Clementine Buildbot \n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: es_AR\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../bin/src/ui_podcastsettingspage.h:246 msgid " days" msgstr "Días" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:272 #: ../bin/src/ui_playbacksettingspage.h:292 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " pt" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " segundos" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " canciones" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 álbumes" #: core/utilities.cpp:106 #, qt-format msgid "%1 days" msgstr "%1 días" #: core/utilities.cpp:127 #, qt-format msgid "%1 days ago" msgstr "hace %1 días" #: podcasts/gpoddersync.cpp:79 #, qt-format msgid "%1 on %2" msgstr "%1 sobre %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 listas de reproducción (%2)" #: playlist/playlistmanager.cpp:326 #, qt-format msgid "%1 selected of" msgstr "%1 seleccionadas de" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 canción" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 canciones" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 canciones encontradas" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 canciones encontradas (mostrando %2)" #: playlist/playlistmanager.cpp:332 #, qt-format msgid "%1 tracks" msgstr "%1 pistas" #: ui/albumcovermanager.cpp:419 #, qt-format msgid "%1 transferred" msgstr "%1 transferido" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Módulo Wiimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, qt-format msgid "%L1 other listeners" msgstr "%L1 otros oyentes" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 reproducciones totales" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n falló" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n completado(s)" #: transcoder/transcodedialog.cpp:192 #, c-format msgid "%n remaining" msgstr "%n pendiente(s)" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&Alinear texto" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&Centro" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "&Custom" msgstr "&Personalizado" #: ../bin/src/ui_mainwindow.h:722 msgid "&Extras" msgstr "Extras" #: ../bin/src/ui_mainwindow.h:721 msgid "&Help" msgstr "&Ayuda" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "&Ocultar %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "&Ocultar..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Izquierda" #: ../bin/src/ui_mainwindow.h:719 msgid "&Music" msgstr "Música" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Ninguno" #: ../bin/src/ui_mainwindow.h:720 msgid "&Playlist" msgstr "Lista de reproducción" #: ../bin/src/ui_mainwindow.h:653 msgid "&Quit" msgstr "&Salir" #: ../bin/src/ui_mainwindow.h:691 msgid "&Repeat mode" msgstr "Modo de repetición" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Derecha" #: ../bin/src/ui_mainwindow.h:690 msgid "&Shuffle mode" msgstr "Modo Aleatorio" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "&Ajustar columnas a la ventana" #: ../bin/src/ui_mainwindow.h:723 msgid "&Tools" msgstr "&Herramientas" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(diferentes a través de múltiples canciones)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "... y a todos los que ayudaron en el desarrollo de Amarok" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "" #: core/utilities.cpp:106 msgid "1 day" msgstr "1 día" #: playlist/playlistmanager.cpp:332 msgid "1 track" msgstr "1 pista" #: ../bin/src/ui_networkremotesettingspage.h:187 msgid "127.0.0.1" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 canciones aleatorias" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "Actualizá ya a Premium" #: ../bin/src/ui_networkremotesettingspage.h:188 msgid "" "Get" " the Android App now!" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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 marcás una sección de texto que contenga una ficha de reemplazo entre llaves, esa sección no se va a mostrar si la ficha de reemplazo esta vacía.

" #: internet/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "Necesitás una cuenta Grooveshrak Anywhere" #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "Necesitás una cuenta Premium de Spotify." #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:78 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 que se encuentran en tu colección. Existen diferentes tipos de listas de reproducción inteligentes, que ofrecen distintas formas de elegir tus canciones." #: smartplaylists/querywizardplugin.cpp:153 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Una canción va a ser incluida en la lista de reproducción si coincide con estas condiciones." #: smartplaylists/searchterm.cpp:297 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:341 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "ALABEMOS TODOS AL HIPNOSAPO" #: ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "Aproximadamente %1" #: ../bin/src/ui_mainwindow.h:674 msgid "About Clementine..." msgstr "Acerca de Clementine..." #: ../bin/src/ui_mainwindow.h:709 msgid "About Qt..." msgstr "Acerca de Qt..." #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Accept non public clients only" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_lastfmsettingspage.h:151 msgid "Account details" msgstr "Más sobre tu cuenta" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "Más sobre tu cuenta (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Acción" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Activar/desactivar Wiiremote" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "Agregar podcast" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Agregar Streaming de Radio en Internet" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "Agregar una línea nueva si soporta el tipo de notificación" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "Agregar acción" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Agregar otro streaming de radio..." #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Agregar directorio..." #: ui/mainwindow.cpp:1598 msgid "Add file" msgstr "Añadir archivo" #: ../bin/src/ui_mainwindow.h:678 msgid "Add file..." msgstr "Agregar archivo..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Agregar archivos para convertir" #: ui/mainwindow.cpp:1626 msgid "Add folder" msgstr "Agregar carpeta" #: ../bin/src/ui_mainwindow.h:695 msgid "Add folder..." msgstr "Agregar carpeta..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Agregar nueva carpeta..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "Agregar podcast" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:716 msgid "Add podcast..." msgstr "Agregar podcast" #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Agregar término de búsqueda" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "Agregar etiqueta de album a la canción" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "Agregar etiqueta de artista del álbum a la canción" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "Agregar etiqueta de artista a la canción" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "Agregar etiqueta de compositor a la canción" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "Agregar etiqueta de disco a la canción" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "Agregar título de la canción" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "Agregar etiqueta de género a la canción" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "Agregar etiqueta de duración de la canción" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "Agregar contador de reproducción de la canción" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "Agregar contador de salto de la canción" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "Agregar etiqueta de título a la canción" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "Agregar etiqueta de pista a la canción" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "Agregar etiqueta de año a la canción" #: ../bin/src/ui_mainwindow.h:680 msgid "Add stream..." msgstr "Agregar streaming..." #: internet/groovesharkservice.cpp:1085 msgid "Add to Grooveshark favorites" msgstr "Agregar a mis favoritos en Grooveshark" #: internet/groovesharkservice.cpp:1097 msgid "Add to Grooveshark playlists" msgstr "Agregar a listas de reproducción de Grooveshark" #: ui/mainwindow.cpp:1423 msgid "Add to another playlist" msgstr "Agregar a otra lista de reproducción" #: ../bin/src/ui_albumcovermanager.h:152 msgid "Add to playlist" msgstr "Agregar a la lista de reproducción" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Add to the queue" msgstr "Agregar a la cola de reproducción" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Agregar acción wiimotedev" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Agregar..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Agregado este mes" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Agregado esta semana" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Agregado este año" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Agregado hoy" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Agregado en los últimos tres meses" #: internet/groovesharkservice.cpp:1392 msgid "Adding song to My Music" msgstr "Agregando canción a Mi Música" #: internet/groovesharkservice.cpp:1369 msgid "Adding song to favorites" msgstr "Añadiendo canción a favoritas" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Agrupamiento avanzado..." #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "Despues" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "Después de copiar..." #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Álbum" #: ../bin/src/ui_playbacksettingspage.h:279 msgid "Album (ideal loudness for all tracks)" msgstr "Álbum (ganancia ideal para todas las pistas)" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Artista del álbum" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "Caratula del album" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Información del album en jamendo.com..." #: ui/albumcovermanager.cpp:122 msgid "Albums with covers" msgstr "Álbumes con portadas" #: ui/albumcovermanager.cpp:123 msgid "Albums without covers" msgstr "Álbumes sin portadas" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Todos los archivos (*)" #: ../bin/src/ui_mainwindow.h:686 msgid "All Glory to the Hypnotoad!" msgstr "¡Toda la gloria al Hipnosapo!" #: ui/albumcovermanager.cpp:121 msgid "All albums" msgstr "Todos los álbumes" #: ui/albumcovermanager.cpp:246 msgid "All artists" msgstr "Todos los artistas" #: ui/albumcoverchoicecontroller.cpp:47 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:74 msgid "All the translators" msgstr "Todos los traductores" #: library/library.cpp:84 msgid "All tracks" msgstr "Todas las pistas" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "Permitir codificación mid/side" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "Junto a los originales" #: ../bin/src/ui_behavioursettingspage.h:187 msgid "Always hide the main window" msgstr "Ocultar siempre la ventana principal" #: ../bin/src/ui_behavioursettingspage.h:186 msgid "Always show the main window" msgstr "Mostrar siempre la ventana principal" #: ../bin/src/ui_behavioursettingspage.h:196 #: ../bin/src/ui_behavioursettingspage.h:210 msgid "Always start playing" msgstr "Empezar siempre reproduciendo contenidos" #: internet/spotifyblobdownloader.cpp:60 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "Un plug-in adicional es requerido para usar Spotify en Clementine. ¿Te gustaría descargarlo e instalarlo ahora?" #: devices/afcdevice.cpp:63 msgid "An error occurred copying the iTunes database from the device" msgstr "Se produjo un error al copiar la base de datos de iTunes desde el dispositivo" #: devices/afcdevice.cpp:157 msgid "An error occurred copying the iTunes database onto the device" msgstr "Se produjo un error al copiar la base de datos de iTunes hacia el dispositivo" #: devices/gpodloader.cpp:61 msgid "An error occurred loading the iTunes database" msgstr "Se produjo un error al cargar la base de datos de iTunes" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Se produjo un error al escribir los metadatos a «%1»" #: internet/subsonicsettingspage.cpp:100 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:78 msgid "And:" msgstr "Y:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "Enojado" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Aspecto" #: core/commandlineoptions.cpp:163 msgid "Append files/URLs to the playlist" msgstr "Agregar archivos/URLs a la lista de reproducción" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "Agregar a la lista de reproducción actual" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "Append to the playlist" msgstr "Agregar a la lista de reproducción" #: ../bin/src/ui_playbacksettingspage.h:282 msgid "Apply compression to prevent clipping" msgstr "Aplicar compresión para evitar cortes" #: ui/equalizer.cpp:191 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "¿Estás seguro/a de que quiere eliminar la predefinición «%1»?" #: internet/groovesharkservice.cpp:1290 msgid "Are you sure you want to delete this playlist?" msgstr "¿Estás seguro que querés borrar esta lista de reproducción?" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "¿Estás seguro/a de que desea reinicializar las estadísticas de esta canción?" #: library/librarysettingspage.cpp:152 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:1205 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Artista" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Información del artista" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "Radio del artista" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "Etiquetas del artista" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "Iniciales del artista" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Formato de audio" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 msgid "Authentication failed" msgstr "Fallamos en la autenticación" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "Autor " #: ui/about.cpp:65 msgid "Authors" msgstr "Autores" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Automático" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Actualización automática" #: ../bin/src/ui_librarysettingspage.h:208 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:45 msgid "Available" msgstr "Disponible" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "Flujo de bits promedio" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "Tamaño promedio de imagen" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "Podcast BBC" #: playlist/playlist.cpp:1223 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "PPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "Flujos de fondo" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Color de fondo" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr " Imagen de fondo" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Opacidad de fondo" #: core/database.cpp:710 msgid "Backing up database" msgstr "Realizando respaldo de la base de datos" #: ../bin/src/ui_mainwindow.h:659 msgid "Ban" msgstr "Excluir" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "Analizador de Barras" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Azul básico" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "Audio basico" #: ../bin/src/ui_behavioursettingspage.h:176 msgid "Behavior" msgstr "Comportamiento" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "Mejor" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "Biografía de %1" #: playlist/playlist.cpp:1224 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Tasa de bits" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "Tasa de bits" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "Analizador de Bloques" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "Tipo de bloque" #: devices/ilister.cpp:122 msgid "Bluetooth MAC Address" msgstr "Dirección MAC Bluetooth" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "Cuerpo" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "Analizador de Boom" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Explorar..." #: ../bin/src/ui_playbacksettingspage.h:291 msgid "Buffer duration" msgstr "Duración del buffer" #: engines/gstengine.cpp:821 msgid "Buffering" msgstr "Guardando en caché" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "Pero las siguientes fuentes están deshabilitadas:" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Botones" #: core/song.cpp:344 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "Soporte de hoja CUE" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "Cancelar" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Cambiar portada" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Cambiar tamaño de letra" #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "Cambiar modo de repetición" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Cambiar combinación de teclas" #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "Cambiar modo aleatorio" #: core/commandlineoptions.cpp:169 msgid "Change the language" msgstr "Cambiar el idioma" #: ../bin/src/ui_playbacksettingspage.h:294 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "El cambio de las preferencias de reproducción a monoaural se hará efectivo en la próxima canción a reproducir" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "Buscar nuevos episodios" #: ui/mainwindow.cpp:591 msgid "Check for updates..." msgstr "Buscar actualizaciones..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "Elegí un nombre para tu lista de reproducción inteligente" #: ../bin/src/ui_playbacksettingspage.h:287 msgid "Choose automatically" msgstr "Elegir automáticamente" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Elegir color..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "Elegir tipografía..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Elegí de la lista" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Elegí como ordenar la lista de reproducción y cuantas canciones va a tener." #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "Elejir el repertorio de download de los podcast" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Elegí los sitios web que queres que Clementine use para buscar letras de canciones." #: ui/equalizer.cpp:109 msgid "Classical" msgstr "Clásica" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "Limpieza en curso" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Limpiar" #: ../bin/src/ui_mainwindow.h:661 ../bin/src/ui_mainwindow.h:663 msgid "Clear playlist" msgstr "Limpiar lista de reproducción" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:644 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Error de Clementine" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Naranja Clementine" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Visualización de Clementine" #: ../bin/src/ui_deviceproperties.h:376 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 copias a este dispositivo en un formato que pueda reproducir." #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine puede reproducir música que hayas subido a Google Drive" #: ../bin/src/ui_ubuntuonesettingspage.h:111 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:431 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:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine puede sincronizar sus abonamientos de podcast con otros computadores y aplicaciones. Create an account." #: visualisations/projectmvisualisation.cpp:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine no puede cargar ninguna visualización de projectM. Asegurate que tenés instalado Clementine correctamente." #: internet/lastfmsettingspage.cpp:110 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 "Clementine no pudo obtener el estado de tu subscripción porque hay problemas con la conexión. Las canciones que escuches se guardarán y enviarán a Last.fm más tarde." #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Visor de imágenes de Clementine" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "Clementine no encontró resultados para este archivo" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "Clementine buscará música en:" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Hacé clic acá para agregar música" #: ../bin/src/ui_trackslider.h:72 msgid "Click to toggle between remaining time and total time" msgstr "Clic para cambiar entre tiempo restante y tiempo total" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 msgid "" "Clicking the Login button will open a web browser. You should return to " "Clementine after you have logged in." msgstr "Haciendo click en el botón de Inicio de Sesión abrirá el navegado. Volvé a Clementine después de que te hayas autenticado." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Cerrar" #: playlist/playlisttabbar.cpp:47 msgid "Close playlist" msgstr "Cerrar la lista de reproducción" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "Cerrar visualización" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "Si cerrás esta ventana, cancelas la descarga." #: ui/albumcovermanager.cpp:200 msgid "Closing this window will stop searching for album covers." msgstr "Si cerrás esta ventana, se detiene la búsqueda de portadas de los álbumes." #: ui/equalizer.cpp:110 msgid "Club" msgstr "Club" #: devices/ilister.cpp:117 msgid "Color" msgstr "Color" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Colors" msgstr "Colores" #: core/commandlineoptions.cpp:172 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:1233 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Comentario" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "Completar etiquetas automáticamente" #: ../bin/src/ui_mainwindow.h:713 msgid "Complete tags automatically..." msgstr "Completar etiquetas automáticamente..." #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Compositor" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "Configurar %1 ..." #: internet/groovesharkservice.cpp:550 msgid "Configure Grooveshark..." msgstr "Configurá Grooveshark..." #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Configurá Last.fm..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "Configurá Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Configurá accesos directos" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "Configurá Spotify..." #: internet/subsonicservice.cpp:93 msgid "Configure Subsonic..." msgstr "" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "Configurar búsqueda global:" #: ui/mainwindow.cpp:474 msgid "Configure library..." msgstr "Configurá tu colección..." #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "Configurar podcasts..." #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "Configurar" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "Conectá Wiimotes usando acción de activar/desactivar" #: devices/devicemanager.cpp:339 devices/devicemanager.cpp:343 msgid "Connect device" msgstr "Conectá un dispositivo" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "Conectando con Spotify" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:689 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "Flujo de bits constante" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "Convertir toda la música" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "Convertí cualquier música que el dispositivo no pueda reproducir" #: internet/groovesharkservice.cpp:1170 msgid "Copy to clipboard" msgstr "Copiar al portapapeles" #: library/libraryview.cpp:389 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Copiá al dispositivo..." #: devices/deviceview.cpp:218 ui/mainwindow.cpp:504 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Copiá a la colección..." #: devices/afctransfer.cpp:50 msgid "Copying iPod database" msgstr "Copiando la base de datos del iPod" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "Derecho de copia" #: internet/subsonicsettingspage.cpp:78 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:64 #, 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. Asegurate de tener instalados todos los complementos necesarios de GStreamer." #: transcoder/transcoder.cpp:432 #, 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 (plugins) correctos de GStreamer" #: transcoder/transcoder.cpp:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "No se ha podido encontrar un codificador (encoder) para %1, compruebe que tiene instalados los complementos (plugins) correctos de GStreamer." #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "No se pudo cargar la estación de radio de Last.fm" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "No se pudo abrir el archivo de salida %1" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:149 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:684 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Gestor de portadas" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "Portadas desde imagen embebida" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Portada cargada automáticamente desde %1" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "Portada eliminada manualmente" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "Portada no definida" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "Portada establecida desde %1" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "Portadas de %1" #: internet/groovesharkservice.cpp:518 internet/groovesharkservice.cpp:1242 msgid "Create a new Grooveshark playlist" msgstr "Creá una lista de reproducción nueva en Grooveshark " #: ../bin/src/ui_playbacksettingspage.h:269 msgid "Cross-fade when changing tracks automatically" msgstr "Fundir cuando se cambie la pista automáticamente" #: ../bin/src/ui_playbacksettingspage.h:268 msgid "Cross-fade when changing tracks manually" msgstr "Fundir cuando se cambie la pista manualmente" #: ../bin/src/ui_mainwindow.h:656 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:660 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:667 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:677 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:697 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:665 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:658 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:711 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:699 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:681 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:673 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:654 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:701 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:679 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:703 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:108 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "Personalizado" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "Imagen personalisada" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "Opciones de mensaje personalizado" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "Radio personalizada" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Personalizado..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "Ruta DBus" #: ui/equalizer.cpp:111 msgid "Dance" msgstr "Dance" #: core/database.cpp:664 msgid "" "Database corruption detected. Please read https://code.google.com/p" "/clementine-player/wiki/DatabaseCorruption for instructions on how to " "recover your database" msgstr "Corrupción de la base de datos detectada. Por favor lea https://code.google.com/p/clementine-player/wiki/DatabaseCorruption para instrucciones acerca de cómo recuperar su base de datos" #: playlist/playlist.cpp:1231 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Fecha de creación" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Fecha de modificación" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "Días" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "Por &defecto" #: core/commandlineoptions.cpp:157 msgid "Decrease the volume by 4%" msgstr "Reducir el volumen en 4%" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Disminuir volumen" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "Imagen de fondo preconcebida" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "Valores por defecto" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "Retardo entre visualizaciones" #: playlist/playlistlistcontainer.cpp:75 #: ../bin/src/ui_playlistlistcontainer.h:122 msgid "Delete" msgstr "Eliminar" #: internet/groovesharkservice.cpp:521 internet/groovesharkservice.cpp:1289 msgid "Delete Grooveshark playlist" msgstr "Eliminá la lista de reproducción de Grooveshark " #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "Borrar los datos bajados" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1875 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Borrar archivos" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Eliminar del dispositivo..." #: library/libraryview.cpp:391 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Eliminar del disco..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "Borrar los episodios leidos" #: playlist/playlistlistcontainer.cpp:295 msgid "Delete playlists" msgstr "" #: ui/equalizer.cpp:190 ../bin/src/ui_equalizer.h:124 msgid "Delete preset" msgstr "Eliminar predefinición" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "Eliminar lista de reproducción inteligente" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "Borrar archivos originales" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Borrando archivos" #: ui/mainwindow.cpp:1358 msgid "Dequeue selected tracks" msgstr "Retirar las pistas seleccionadas de la cola de reproducción" #: ui/mainwindow.cpp:1356 msgid "Dequeue track" msgstr "Retirar la pista de la cola de reproducción" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Destino" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Detalles..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Dispositivo" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Propiedades del dispositivo" #: ../bin/src/ui_podcastsettingspage.h:254 devices/wmdmlister.cpp:360 msgid "Device name" msgstr "Nombre del dispositivo" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Propiedades del dispositivo..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Dispositivos" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Quisiste decir" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "Importado Digitalmente" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "Contraseña Importada Digitalmente" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "Nombre de Usuario Importado Digitalmente" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "Conexión directa a Internet" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Directorio" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "Desactivar duración" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Desactivado" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Disco" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "Transmisión discontinua" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "Opciones de visualización" #: core/commandlineoptions.cpp:167 msgid "Display the on-screen-display" msgstr "Mostrar la indicación-en-pantalla" #: ../bin/src/ui_mainwindow.h:712 msgid "Do a full library rescan" msgstr "Hacer un re-escaneo completo de la colección" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "No convertir ninguna música" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "No repetir" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "No mostrar en Varios artistas" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "No mezclar" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:202 msgid "Don't stop!" msgstr "¡No parar!" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Doble clic para abrir" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Double clicking a song will..." msgstr "Doble clic sobre una canción..." #: podcasts/podcastservice.cpp:345 #, c-format msgid "Download %n episodes" msgstr "Bajar %n episodios" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "Carpeta de descargas" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "Bajar los episodios asia" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "Membrecía para descarga" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "Bajar los nuevos episodios automaticamente" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "Bajar en fila" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Descarga este álbum" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Descargar este álbum..." #: podcasts/podcastservice.cpp:347 msgid "Download this episode" msgstr "Bajar este episodio" #: ../bin/src/ui_spotifysettingspage.h:216 msgid "Download..." msgstr "Descargar..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "Bajando (%1%)..." #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "Descargar el directorio de Icecast" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "Descargando el catálogo de Jamendo" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "Descargando el catálogo de Magnatune" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "Descargando el plug-in Spotify" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "Descargando metadatos" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "Arrastrar para reposicionar" #: devices/wmdmlister.cpp:357 msgid "Drive letter" msgstr "Letra de unidad" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "Modo dinámico activado" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "Mezcla dinámica aleatoria" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "Editar lista de reproducción inteligente..." #: ui/mainwindow.cpp:1391 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Editar etiqueta \"%1\"..." #: ../bin/src/ui_mainwindow.h:670 msgid "Edit tag..." msgstr "Editar etiqueta..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "Editar etiquetas" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Editar información de la pista" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:666 msgid "Edit track information..." msgstr "Editar información de la pista..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Editar información de pistas" #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Editar..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "Habilitar soporte para Wiimote" #: ../bin/src/ui_equalizer.h:126 msgid "Enable equalizer" msgstr "Habilitar el ecualizador" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "Activar atajos solo cuando Clementine tenga el foco" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "Activa/Desactiva la compartición de Last.fm" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "Complejidad de codificación" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "Calidad del motor de codificación" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "Modo de codificación" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "Entre una URL" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "Ingresá una dirección URL para descargar una portada de Internet:" #: playlist/playlisttabbar.cpp:128 msgid "Enter a new name for this playlist" msgstr "Ingresá un nuevo nombre para esta lista de reproducción" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Ingresá un artista o etiqueta para escuchar la radio de Last.fm." #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Ingrese las palabras a buscar debajo para buscar música en su PC y en Internet" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Ingrese las palabras a buscar debajo para buscar podcasts en Itunes Store" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Ingrese las palabras a buscar debajo para buscar podcasts en gpodder.net" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:153 msgid "Enter search terms here" msgstr "Ingresá acá los términos de búsqueda" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "Ingresá la URL de un flujo de radio por internet:" #: playlist/playlistlistcontainer.cpp:183 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:184 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "Colección completa" #: ../bin/src/ui_equalizer.h:118 ../bin/src/ui_mainwindow.h:693 msgid "Equalizer" msgstr "Ecualizador" #: core/commandlineoptions.cpp:170 msgid "Equivalent to --log-levels *:1" msgstr "Equivalente a --log-levels*:1" #: core/commandlineoptions.cpp:171 msgid "Equivalent to --log-levels *:3" msgstr "Equivalente a --log-levels*:3" #: internet/groovesharkservice.cpp:1015 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1827 ui/mainwindow.cpp:1943 msgid "Error" msgstr "Error" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Error al conectar al dispositivo MTP" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "Error copiando canciones" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "Error al borrar canciones" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "Error al descargar el plugin Spotify" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "Error cargando %1" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Error cargando lista de reproducción di.fm" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "Error procesando %1: %2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "Error al cargar el CD de audio" #: library/library.cpp:63 msgid "Ever played" msgstr "Reproducidos alguna vez" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "Cada 10 minutos" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "Cada 12 horas" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "Cada 2 días" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "Cada 20 minutos" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "Cada 30 minutos" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "Cada 6 días" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "Cada hora" #: ../bin/src/ui_playbacksettingspage.h:270 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_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "Expandir" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "Expira en %1" #: ../bin/src/ui_mainwindow.h:675 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:671 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:646 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:648 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:650 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:652 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:267 msgid "Fade out when stopping a track" msgstr "Disolver cuando pare la reproducción" #: ../bin/src/ui_playbacksettingspage.h:266 msgid "Fading" msgstr "Disolver" #: ../bin/src/ui_playbacksettingspage.h:271 msgid "Fading duration" msgstr "Duración de disolución" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "Error al acceder al directorio" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "Error al obtener podcasts" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "Error al cargar podcast" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "Error al analizar el XML de este canal RSS" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "Rápida" #: internet/groovesharkservice.cpp:615 msgid "Favorites" msgstr "Favoritos" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "Canciones favoritas" #: ../bin/src/ui_albumcovermanager.h:155 msgid "Fetch Missing Covers" msgstr "Descargar las portadas que faltan" #: ../bin/src/ui_albumcovermanager.h:150 msgid "Fetch automatically" msgstr "Obtener carátula" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "Descarga completada" #: internet/subsonicservice.cpp:218 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Error obteniendo portada" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "Extensión del archivo" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "Formatos de archivo" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Nombre del archivo" #: playlist/playlist.cpp:1227 msgid "File name (without path)" msgstr "Nombre del archivo (sin ruta)" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Tamaño del archivo" #: playlist/playlist.cpp:1229 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Tipo de Archivo" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Nombre del archivo" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Archivos" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "Archivos para convertir" #: devices/wmdmlister.cpp:359 msgid "Filesystem name" msgstr "Nombre del sistema de archivos" #: devices/wmdmlister.cpp:364 msgid "Filesystem serial number" msgstr "Número de serie del sistema de archivos" #: devices/wmdmlister.cpp:358 msgid "Filesystem type" msgstr "Tipo de sistema de archivos" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "Encontrá canciones en tu colección que coinciden con el criterio que especificaste." #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "Obteniendo huella digital de la canción" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "Finalizar" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "Primer nivel" #: core/song.cpp:333 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Tamaño de letra" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Por razones de licenciamiento, para usar Spotify se necesita un complemento separado." #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "Forzar la codificación en mono" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "Olvidar dispositivo" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:119 #: ../bin/src/ui_playlistlistcontainer.h:117 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Formulario" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "Formato" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Tasa de muestreo" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "Cuadros por búfer" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Amigos" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "Congelado" #: ui/equalizer.cpp:112 msgid "Full Bass" msgstr "Bajos completos" #: ui/equalizer.cpp:114 msgid "Full Bass + Treble" msgstr "Bajos y Agudos completos" #: ui/equalizer.cpp:113 msgid "Full Treble" msgstr "Agudos completos" #: ../bin/src/ui_playbacksettingspage.h:283 msgid "GStreamer audio engine" msgstr "Motor de audio GStreamer" #: ui/settingsdialog.cpp:132 msgid "General" msgstr "General" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Preferencias generales" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Género" #: internet/groovesharkservice.cpp:540 msgid "Get a URL to share this Grooveshark playlist" msgstr "Obtener una URL para compartir esta liste de reproducción de Grooveshark" #: internet/groovesharkservice.cpp:537 internet/groovesharkservice.cpp:1108 msgid "Get a URL to share this Grooveshark song" msgstr "Obtenga una URL para compartir esta canción de Grooveshark" #: internet/groovesharkservice.cpp:788 msgid "Getting Grooveshark popular songs" msgstr "Obteniendo canciones populares de Grooveshark" #: internet/somafmservice.cpp:100 msgid "Getting channels" msgstr "Obteniendo canales" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "Obteniendo transmisiones" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "Escribí un nombre:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "Ir" #: ../bin/src/ui_mainwindow.h:704 msgid "Go to next playlist tab" msgstr "Ir a la siguiente lista de reproducción" #: ../bin/src/ui_mainwindow.h:705 msgid "Go to previous playlist tab" msgstr "Ir a la lista de reproducción anterior" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:413 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "Se obtuvieron %1 portadas de %2 (%3 fallaron)" #: ../bin/src/ui_behavioursettingspage.h:190 msgid "Grey out non existent songs in my playlists" msgstr "Oscurecer canciones inexistentes de mis listas de reproducción" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:406 msgid "Grooveshark login error" msgstr "Error de inicio de sesión en Grooveshark" #: internet/groovesharkservice.cpp:1160 msgid "Grooveshark playlist's URL" msgstr "URL de las lists de reproducción de Grooveshark" #: internet/groovesharkservice.cpp:601 msgid "Grooveshark radio" msgstr "Grooveshark radio" #: internet/groovesharkservice.cpp:1138 msgid "Grooveshark song's URL" msgstr "Dirección Url de la canción de Grooveshark" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "Agrupar Colección por..." #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "Agrupar por" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "Agrupar por Álbum" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "Agrupar por Artista" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "Agrupar por Artista/Álbum" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "Agrupar por Artista/Año - Álbum" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "Agrupar por Género/Álbum" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "Agrupar por Género/Artista/Álbum" #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "La página HTML no contiene ningún feed RSS" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "Proxy HTTP" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "Feliz" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "Información del Hardware" #: ../bin/src/ui_deviceproperties.h:372 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:202 msgid "High" msgstr "Alto" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "Alto (%1 fps)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "Alta (1024x1024)" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "Horas" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "No tengo una cuenta en Magnatune" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Ícono" #: widgets/fancytabwidget.cpp:655 msgid "Icons on top" msgstr "Íconos en la parte superior" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "Identificando canción" #: devices/devicemanager.cpp:584 devices/devicemanager.cpp:592 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "Si continúa, este dispositivo trabajará con lentitud y las canciones que se copien a él podrán no funcionar." #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Si conoce la URL de un podcast, ingrésela debajo y haga click en Ir" #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "Ignorar el \"The\" en los nombres de los artistas" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Imágenes (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:143 #, qt-format msgid "In %1 days" msgstr "En %1 días" #: core/utilities.cpp:147 #, qt-format msgid "In %1 weeks" msgstr "En %1 semanas" #: ../bin/src/ui_wizardfinishpage.h:86 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/spotifyservice.cpp:360 msgid "Inbox" msgstr "Bandeja de entrada" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "Incluir carátula en la notificación" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "Incluir todas las canciones" #: internet/subsonicsettingspage.cpp:87 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:91 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: core/commandlineoptions.cpp:156 msgid "Increase the volume by 4%" msgstr "Subir el volumen en 4%" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Subir volumen" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "Indexando %1" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "Información" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "Insertar..." #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Instalado" #: core/database.cpp:649 msgid "Integrity check" msgstr "Comprobación de integridad" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:154 msgid "Internet providers" msgstr "Proveedores de Internet" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "Clave API inválida" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Formato inválido" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "Metodo inválido" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "Parámetros inválidos" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "Recurso especificado inválido" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "Servicio inválido" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "Clave de sesión inválida" #: internet/groovesharkservice.cpp:399 msgid "Invalid username and/or password" msgstr "Nombre de usuario y/o contraseña inválida" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "Pistas más escuchadas de Jamendo" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "Mejores canciones de Jamendo" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "Mejores canciones del mes de Jamendo" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "Mejores canciones de la semana en Jamendo" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "Base de datos de Jamendo" #: ../bin/src/ui_mainwindow.h:696 msgid "Jump to the currently playing track" msgstr "Ir a la pista actualmente reproduciéndose" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Presione los botones por %1 segundo..." #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Presione los botones por %1 segundo..." #: ../bin/src/ui_behavioursettingspage.h:178 msgid "Keep running in the background when the window is closed" msgstr "Continuar ejecutando cuando la ventana sea cerrada" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "Mantener los archivos originales" #: ../bin/src/ui_mainwindow.h:688 msgid "Kittens" msgstr "Gatitos" #: ../bin/src/ui_behavioursettingspage.h:179 msgid "Language" msgstr "Idioma" #: ui/equalizer.cpp:115 msgid "Laptop/Headphones" msgstr "Laptop/Auriculares" #: ui/equalizer.cpp:116 msgid "Large Hall" msgstr "Salón grande" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "Portada de álbum grande" #: widgets/fancytabwidget.cpp:651 msgid "Large sidebar" msgstr "Barra lateral grande" #: library/library.cpp:71 playlist/playlist.cpp:1220 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "Último escuchado" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "Radio personalizada de Last.fm: %1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Colección en Last.fm de %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "Radio Mix de Last.fm - %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Radio de vecinos en Last.fm de %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Estación de radio en Last.fm de %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Artistas en Last.fm similares a %1" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Radio en Last.fm de la etiqueta %1" #: internet/lastfmservice.cpp:437 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm está actualmente saturado, intente nuevamente en unos minutos" #: ../bin/src/ui_lastfmsettingspage.h:154 msgid "Last.fm password" msgstr "Contraseña" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "Recuento de reproducciones de Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Etiquetas de Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Usuario" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "wiki de Last.fm" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "Últimas canciones favoritas" #: ../bin/src/ui_playbacksettingspage.h:290 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "Dejá en blanco para asignar el valor por defecto. Ejemplos: \"/dev/dsp\", \"front\", etc." #: playlist/playlist.cpp:1207 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Duración" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Colección" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "Agrupamiento avanzado de la colección" #: ui/mainwindow.cpp:2060 msgid "Library rescan notice" msgstr "Aviso de re-escaneo de la colección" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "Búsqueda en Colección" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Limites" #: internet/groovesharkservice.cpp:602 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "Escucha canciones en Grooveshark con base en las que has escuchado previamente." #: ui/equalizer.cpp:117 msgid "Live" msgstr "En vivo" #: ../bin/src/ui_albumcovermanager.h:151 msgid "Load" msgstr "Cargar" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "Cargar portada desde dirección URL" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "Cargar portada desde dirección URL..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "Cargar carátula desde el disco" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "Cargar portada desde el disco..." #: playlist/playlistcontainer.cpp:279 msgid "Load playlist" msgstr "Cargar lista de reproducción" #: ../bin/src/ui_mainwindow.h:702 msgid "Load playlist..." msgstr "Cargar lista de reproducción" #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Cargando radio de Last.fm" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Cargando dispositivo MTP" #: devices/wmdmloader.cpp:47 msgid "Loading Windows Media device" msgstr "Cargando dispositivo Windows Media" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "Cargando base de datos del iPod" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "Cargando lista de reproducción inteligente" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "Cargando canciones" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:49 msgid "Loading stream" msgstr "Cargando streaming" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "Cargando pistas" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "Cargando información de pistas" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "Cargando ..." #: core/commandlineoptions.cpp:164 msgid "Loads files/URLs, replacing current playlist" msgstr "Cargar archivos/URLs, remplazando la actual lista de reproducción" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:212 #: ../bin/src/ui_subsonicsettingspage.h:121 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:112 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Iniciar sesión" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "Falla de autenticación" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "Perfil de predicción a largo plazo (LTP)" #: ../bin/src/ui_mainwindow.h:657 msgid "Love" msgstr "Me encanta" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Bajo (%1 fps)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "Bajo (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "Perfil de baja complejidad (LC)" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "Letras" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "Letra de %1" #: core/song.cpp:336 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP# 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:334 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:335 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Descarga de Magnatune" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Descarga de Magnatune finalizada" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "Perfil principal (MAIN)" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:687 msgid "Make it so!" msgstr "¡Hazlo!" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "Hacer disponible la lista de reproducción fuera de línea" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "Respuesta malformada" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "Configuración manual del proxy" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "Manualmente" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "Fabricante" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "Marcar como leído" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "Marcar como nuevo" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "Coincide cualquier término de búsqueda (Y)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "Coincide uno o más términos de búsqueda (O)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "Tasa de bits máxima" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "Medio (%1 fps)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "Mediana (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "Tipo de membrecía" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "Tasa de bits mínima" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "Faltan los ajustes por defecto de projectM" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "Modelo" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "Seguir cambios en la colección" #: ../bin/src/ui_playbacksettingspage.h:296 msgid "Mono playback" msgstr "Reproducción en mono" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "Meses" #: playlist/playlist.cpp:1235 msgid "Mood" msgstr "Humor" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "Estilo de moodbar" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "Moodbars" #: library/library.cpp:74 msgid "Most played" msgstr "Más reproducidas" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "Punto de montaje" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "Puntos de montaje" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "Mover hacia abajo" #: ui/mainwindow.cpp:505 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "Mover a la colección..." #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "Mover hacia arriba" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1600 msgid "Music" msgstr "Música" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Colección de Música" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:710 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "Silenciar" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "Mi colección de Last.fm" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "Mi radio mix de Last.fm" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "Mis vecinos de Last.fm" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "Mi radio recomendada de Last.fm" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "Mi Mix Radio" #: internet/groovesharkservice.cpp:606 msgid "My Music" msgstr "Mi Música" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "Mi Vecindario" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "Mi Estación de Radio" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "Mis Recomendaciones" #: internet/groovesharkservice.cpp:1243 internet/groovesharkservice.cpp:1336 #: ui/equalizer.cpp:172 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Nombre" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "Opciones de nombrado" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "Banda estrecha (NB)" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "Vecinos" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "Red" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "Proxy de la red" #: ../bin/src/ui_networkremotesettingspage.h:168 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "Nunca" #: library/library.cpp:67 msgid "Never played" msgstr "Nunca reproducidos" #: ../bin/src/ui_behavioursettingspage.h:194 #: ../bin/src/ui_behavioursettingspage.h:208 msgid "Never start playing" msgstr "Nunca empezar a reproducir" #: playlist/playlistlistcontainer.cpp:74 #: playlist/playlistlistcontainer.cpp:182 #: ../bin/src/ui_playlistlistcontainer.h:119 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1440 ../bin/src/ui_mainwindow.h:698 msgid "New playlist" msgstr "Nueva lista de reproducción" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "Nueva lista de reproducción inteligente..." #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "Nuevas canciones" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "Nuevas pistas serán añadidas automáticamente" #: library/library.cpp:80 msgid "Newest tracks" msgstr "Nuevas canciones" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "Siguiente" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:651 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Pista siguiente" #: core/utilities.cpp:145 msgid "Next week" msgstr "La próxima semana" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "Sin Analizador" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "Sin imagen de fondo" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "Sin bloques largos" #: playlist/playlistcontainer.cpp:389 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "No se encontraron coincidencias. Limpiar el cuadro de búsqueda para mostrar la lista completa nuevamente." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "Sin bloques cortos" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "Ninguno" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1828 ui/mainwindow.cpp:1944 msgid "None of the selected songs were suitable for copying to a device" msgstr "Ninguna de las canciones seleccionadas fueron aptas para ser copiadas a un dispositivo" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "Normal" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "Tipo de bloque normal" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "No disponible al utilizar una lista de reproducción dinámica" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "No conectado" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "No hay suficiente contenido" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "No hay suficientes seguidores" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "No hay suficientes miembros" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "No hay suficientes vecinos" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "No instalado" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "No ha iniciado sesión" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "Dispositvo no montado - doble click para montar" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "Tipo de notificación" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Notificaciones" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "En reproducción" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "Previsualización del OSD" #: core/song.cpp:337 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:340 msgid "Ogg Opus" msgstr "" #: core/song.cpp:338 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:339 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:172 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_querysortpage.h:142 msgid "Only show the first" msgstr "Solo mostrar el primero" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "Opacity" msgstr "" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:544 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:91 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "Abrir %1 en explorador" #: ../bin/src/ui_mainwindow.h:683 msgid "Open &audio CD..." msgstr "Abrir CD de &audio..." #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "Abrir archivo OPML" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "Abrir archivo OPML..." #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "Abrir dispositivo" #: ../bin/src/ui_mainwindow.h:682 msgid "Open file..." msgstr "Abrir archivo..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "Abrir en Google Drive" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:203 msgid "Open in new playlist" msgstr "Abrir en una lista de reproducción nueva" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Abrir..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "Falló la operación" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "Optimizar para tasa de bits" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "Optimizar para calidad" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "Opciones..." #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "Organizar archivos" #: library/libraryview.cpp:387 ui/mainwindow.cpp:506 msgid "Organise files..." msgstr "Organizar archivos" #: core/organise.cpp:65 msgid "Organising files" msgstr "Organizando archivos" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "Etiquetas originales" #: core/commandlineoptions.cpp:166 msgid "Other options" msgstr "Otras opciones" #: ../bin/src/ui_playbacksettingspage.h:289 msgid "Output device" msgstr "Dispositivo de salida" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "Opciones de salida" #: ../bin/src/ui_playbacksettingspage.h:284 msgid "Output plugin" msgstr "Extensión de salida" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "Sobreescribir archivos existentes" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "Propietario" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "Analizando el catalogo de Jamendo" #: ui/equalizer.cpp:118 msgid "Party" msgstr "Fiesta" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:120 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "Contraseña" #: devices/ilister.cpp:119 msgid "Password Protected" msgstr "Protegido con contraseña" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:850 ui/mainwindow.cpp:1281 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Pausar" #: core/commandlineoptions.cpp:151 msgid "Pause playback" msgstr "Pausar reproducción" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Pausado" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: widgets/fancytabwidget.cpp:653 msgid "Plain sidebar" msgstr "Barra lateral simple" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:489 ui/mainwindow.cpp:818 #: ui/mainwindow.cpp:837 ui/mainwindow.cpp:1284 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:647 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Reproducir" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "Reproducir Artista o Etiqueta" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "Reproducir radio del artista..." #: playlist/playlist.cpp:1218 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "Número de reproducciones" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "Reproducir Radio Personalizada" #: core/commandlineoptions.cpp:150 msgid "Play if stopped, pause if playing" msgstr "Reproducir si está detenida, pausar si se está reproduciendo" #: ../bin/src/ui_behavioursettingspage.h:195 #: ../bin/src/ui_behavioursettingspage.h:209 msgid "Play if there is nothing already playing" msgstr "Reproducir si no hay nada en reproducción" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "Reproducir radio de la etiqueta..." #: core/commandlineoptions.cpp:165 msgid "Play the th track in the playlist" msgstr "Reproducir la pista número de la lista de reproducción" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "Reproducir/Pausar" #: ../bin/src/ui_playbacksettingspage.h:264 msgid "Playback" msgstr "Reproducción" #: core/commandlineoptions.cpp:148 msgid "Player options" msgstr "Opciones del reproductor" #: playlist/playlistcontainer.cpp:273 playlist/playlistmanager.cpp:79 #: playlist/playlistmanager.cpp:397 playlist/playlisttabbar.cpp:290 msgid "Playlist" msgstr "Lista de reproducción" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "Lista de reproducción finalizada" #: core/commandlineoptions.cpp:162 msgid "Playlist options" msgstr "Opciones de la lista de reproducción" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "Tipo de lista de reproducción" #: internet/groovesharkservice.cpp:624 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "Listas de reproducción" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "Por favor cierre su navegador y vuelva a Clementine." #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Plugin status:" msgstr "Estado del complemento:" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "podcasts" #: ui/equalizer.cpp:119 msgid "Pop" msgstr "Pop" #: internet/groovesharkservice.cpp:575 msgid "Popular songs" msgstr "Canciones populares" #: internet/groovesharkservice.cpp:578 msgid "Popular songs of the Month" msgstr "Canciones populares del mes" #: internet/groovesharkservice.cpp:585 msgid "Popular songs today" msgstr "Canciones populares de hoy" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "Duracion de la notificación" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:170 msgid "Port" msgstr "Puerto" #: ui/equalizer.cpp:46 ../bin/src/ui_playbacksettingspage.h:281 msgid "Pre-amp" msgstr "Preamplificación" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:217 ../bin/src/ui_settingsdialog.h:115 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "Preferencias" #: ../bin/src/ui_mainwindow.h:672 msgid "Preferences..." msgstr "Preferencias…" #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "Nombres preferidos para portadas de álbum (separados por coma)" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "Formato de audio preferido" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Preferred bitrate" msgstr "Bitrate preferido" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "Formato preferido" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "Audio Premium" #: ../bin/src/ui_equalizer.h:119 msgid "Preset:" msgstr "Preconfiguración:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "Pulsá una combinación de botón para" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "Presione cualquier tecla" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Ingrese una combinación de teclas para usarse con %1" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "Opciones del OSD Estético" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "Vista previa" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "Anterior" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:645 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "Pista anterior" #: core/commandlineoptions.cpp:173 msgid "Print out version information" msgstr "Mostrar información de versión" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "Perfil" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "Progreso" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 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 orden aleatorio" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "Calidad" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "Leyendo dispositivo..." #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:708 msgid "Queue Manager" msgstr "Gestor de cola de reproducción" #: ui/mainwindow.cpp:1362 msgid "Queue selected tracks" msgstr "Añadir las pistas seleccionadas a la cola de reproducción" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1360 msgid "Queue track" msgstr "Añadir a la cola de reproducción" #: ../bin/src/ui_playbacksettingspage.h:278 msgid "Radio (equal loudness for all tracks)" msgstr "Radio (volumen igual para todas las pistas)" #: internet/groovesharkservice.cpp:593 msgid "Radios" msgstr "Radios" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:685 msgid "Rain" msgstr "Lluvia" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "Visualización al azar" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "Calificar la canción actual 0 estrellas" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "Calificar la canción actual 1 estrellas" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "Calificar la canción actual 2 estrellas" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "Calificar la canción actual 3 estrellas" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "Calificar la canción actual 4 estrellas" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "Calificar la canción actual 5 estrellas" #: playlist/playlist.cpp:1217 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "Valoración" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:199 msgid "Really cancel?" msgstr "¿Realmente querés cancelar?" #: internet/groovesharkservice.cpp:547 msgid "Refresh" msgstr "Refrescar" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:89 msgid "Refresh catalogue" msgstr "Actualizar catálogo" #: internet/somafmservice.cpp:92 msgid "Refresh channels" msgstr "Actualizar canales" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "Refrescar lista de amigos" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "Actualizar lista de estaciones" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "Refrescar transmisiones" #: ui/equalizer.cpp:120 msgid "Reggae" msgstr "Reggae" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "Recordar el movimiento del Wiimote" #: ../bin/src/ui_behavioursettingspage.h:188 msgid "Remember from last time" msgstr "Recordar de la ultima vez" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Quitar" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "Eliminar acción" #: ../bin/src/ui_mainwindow.h:717 msgid "Remove duplicates from playlist" msgstr "Eliminar duplicados de la lista de reproducción" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "Remover carpeta" #: internet/groovesharkservice.cpp:534 msgid "Remove from My Music" msgstr "Eliminar de Mi Música" #: internet/groovesharkservice.cpp:531 msgid "Remove from favorites" msgstr "Sacar de favoritos" #: internet/groovesharkservice.cpp:528 ../bin/src/ui_mainwindow.h:692 msgid "Remove from playlist" msgstr "Eliminar de la lista de reproducción" #: internet/groovesharkservice.cpp:1537 msgid "Removing songs from My Music" msgstr "Eliminando canciones de Mi Música" #: internet/groovesharkservice.cpp:1487 msgid "Removing songs from favorites" msgstr "Eliminando canciones de favoritos" #: internet/groovesharkservice.cpp:1335 #, qt-format msgid "Rename \"%1\" playlist" msgstr "Renombrar \"%1\" lista de reproducción" #: internet/groovesharkservice.cpp:524 msgid "Rename Grooveshark playlist" msgstr "Renombrar lista de reproducción de Grooveshark" #: playlist/playlisttabbar.cpp:128 msgid "Rename playlist" msgstr "Renombrar lista de reproducción" #: playlist/playlisttabbar.cpp:48 msgid "Rename playlist..." msgstr "Renombrar lista de reproducción..." #: ../bin/src/ui_mainwindow.h:668 msgid "Renumber tracks in this order..." msgstr "Reenumerar pistas en este orden..." #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Repetir" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "Repetir álbum" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "Repetir lista de reproducción" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "Repetir pista" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Reemplazar lista de reproducción actual" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Replace the playlist" msgstr "Reemplazar la lista de reproducción" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "Reemplazar espacios con guión bajo" #: ../bin/src/ui_playbacksettingspage.h:273 msgid "Replay Gain" msgstr "Ganancia de Repetición" #: ../bin/src/ui_playbacksettingspage.h:275 msgid "Replay Gain mode" msgstr "Modo Ganancia de Repetición" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "Repoblar" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "Restablecer" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" msgstr "Reiniciar contador de reproducción" #: ../bin/src/ui_organisedialog.h:206 msgid "Restrict to ASCII characters" msgstr "Restringir a caracteres ASCII" #: ../bin/src/ui_behavioursettingspage.h:189 msgid "Resume playback on start" msgstr "" #: internet/groovesharkservice.cpp:756 msgid "Retrieving Grooveshark My Music songs" msgstr "Recuperando canciones de Mi Música en Grooveshark" #: internet/groovesharkservice.cpp:724 msgid "Retrieving Grooveshark favorites songs" msgstr "Recuperando canciones favoritas de Grooveshark" #: internet/groovesharkservice.cpp:661 msgid "Retrieving Grooveshark playlists" msgstr "Recuperando listas de reproducción de Grooveshark" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "Volver a Clementine" #: ui/equalizer.cpp:121 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "Ejecutar" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "Proxy para SOCKS" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "Quitar dispositivo con seguridad" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "Quitar dispositivo con seguridad después de copiar" #: playlist/playlist.cpp:1225 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "Tasa de muestreo" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "Tasa de muestreo" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "Guardar archivos .mood en la biblioteca de música" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "Guardar portada del álbum" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "Guardar portada al disco..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "Guardar imagen" #: playlist/playlistcontainer.cpp:316 msgid "Save playlist" msgstr "Guardar lista de reproducción" #: playlist/playlisttabbar.cpp:49 ../bin/src/ui_mainwindow.h:700 msgid "Save playlist..." msgstr "Guardar lista de reproducción" #: ui/equalizer.cpp:172 ../bin/src/ui_equalizer.h:121 msgid "Save preset" msgstr "Guardar predefinición" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "Guardar este flujo en la pestaña de Internet" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "Guardando pistas" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "Perfil de tasa de muestreo escalable (SSR)" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "Auto-puntaje" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "Enviar las pistas que reproduzco" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "Buscar" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "Buscar estaciones Icecast" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "Buscar en Jamendo" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Buscar en Magnatune" #: internet/subsonicservice.cpp:72 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "Buscar portadas de álbumes..." #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "Buscá lo que sea" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "Busacr en gpodder.net" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "Buscar en iTunes" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "Modo de búsqueda" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "Opciones de búsqueda" #: internet/groovesharkservice.cpp:567 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "Resultados de búsqueda" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "Términos de Búsqueda" #: internet/groovesharkservice.cpp:268 msgid "Searching on Grooveshark" msgstr "Buscando en Grooveshark" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "Segundo nivel" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "Retroceder" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "Avanzar" #: core/commandlineoptions.cpp:161 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" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "Seleccionar Todo" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "No seleccionar nada" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "Elegí el color de fondo:" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "Seleccionar imagen de fondo " #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "Seleccionar la mejor conincidencia posible" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "Elegí el color de primer plano:" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "Seleccionar visualizaciones" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "Seleccionar visualizaciones..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "Nº de serie" #: ../bin/src/ui_subsonicsettingspage.h:118 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:117 msgid "Server details" msgstr "" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "Servicio fuera de línea" #: ui/mainwindow.cpp:1389 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Escribir \"%2\" en la etiqueta \"%1\"..." #: core/commandlineoptions.cpp:155 msgid "Set the volume to percent" msgstr "Coloca el volumen en porciento" #: ../bin/src/ui_mainwindow.h:669 msgid "Set value for all selected tracks..." msgstr "Cambiar valor para todas las pistas seleccionadas..." #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Acceso rápido" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "Combinación de teclas para %1" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Ya existe un atajo para %1" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Mostrar" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "Mostrar OSD" #: ../bin/src/ui_playbacksettingspage.h:265 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:293 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "Mostrar la notificacion propia del escritorio" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Mostrar notificación cuando cambie entre los modos repetir/aleatorio" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "Mostrar una notificación cuando cambio el volúmen" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "Mostrar la notificación en la bandeja de sistema" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "Mostrar OSD Estético" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "Mostrar la barra de estado superior" #: ui/mainwindow.cpp:462 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:209 msgid "Show cover art in library" msgstr "Mostrar portadas en la colección" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "Mostrar divisores" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "Mostrar carátula..." #: library/libraryview.cpp:399 ui/mainwindow.cpp:509 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "Mostrar en navegador de archivos..." #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "Mostrar en Varios artistas" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "Mostrar moodbar" #: ui/mainwindow.cpp:463 msgid "Show only duplicates" msgstr "Mostrar duplicados solamente" #: ui/mainwindow.cpp:464 msgid "Show only untagged" msgstr "Mostrar canciones sin etiquetar solamente" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "Mostrar sugerencias de bísqueda" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "Mostrar los botones \"Me encanta\" y \"Prohibir\"" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "Muestra el botón de compartir en la ventana principal" #: ../bin/src/ui_behavioursettingspage.h:177 msgid "Show tray icon" msgstr "Mostrar icono en el área de notificación" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "Mostrar qué fuentes están habilitadas y deshabiltadas" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "Mostrar/ocultar" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Aleatorio" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "Mezclar álbumes" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "Mezclar todo" #: ../bin/src/ui_mainwindow.h:676 msgid "Shuffle playlist" msgstr "Mezclar lista de reproducción" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "Mezclar canciones de este álbum" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "Inscribirse" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "Cerrar sesión" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "Iniciar Sesión..." #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "Artistas Similares" #: ui/equalizer.cpp:123 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:1219 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "Saltar cuenta" #: core/commandlineoptions.cpp:154 msgid "Skip forwards in playlist" msgstr "Saltar hacia adelante en la lista de reproducción" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "Portada de álbum pequeña" #: widgets/fancytabwidget.cpp:652 msgid "Small sidebar" msgstr "Barra lateral pequeña" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "Lista de reproducción inteligente" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "Listas de reproducción inteligentes" #: ui/equalizer.cpp:122 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:124 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "Información de la canción" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "Info de la canción" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "Sonograma" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "Disculpá" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "Ordenar por género (alfabéticamente)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "Ordenar por género (popularidad)" #: ../bin/src/ui_icecastfilterwidget.h:77 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 "Ordenando" #: playlist/playlist.cpp:1234 msgid "Source" msgstr "Fuente" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "Fuentes" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:208 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "Error de inicio de sesión de Spotify" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "Spotify plugin" msgstr "Complemento de Spotify" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "El complemento de Spotify no está instalado" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "Estándar" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "Destacado" #: core/commandlineoptions.cpp:149 msgid "Start the playlist currently playing" msgstr "Iniciar la lista de reproducción actualmente reproduciendose" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "Empezar conversión" #: internet/groovesharkservice.cpp:568 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Comience a escribir en la caja de búsqueda para llenar esta lista de resultados" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "Iniciando %1" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "Iniciando..." #: internet/groovesharkservice.cpp:596 msgid "Stations" msgstr "Estaciones" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:649 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Detener" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "Detener después" #: ui/mainwindow.cpp:491 ../bin/src/ui_mainwindow.h:655 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:49 msgid "Stop playing after current track" msgstr "Detener la reproducción después de la pista actual" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "Reproducción Finalizada" #: core/song.cpp:346 msgid "Stream" msgstr "Transmisión" #: internet/subsonicsettingspage.cpp:29 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "Membrecía de streaming" #: internet/groovesharkservice.cpp:627 msgid "Subscribed playlists" msgstr "Listas de reproducción suscritas" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "Abonados" #: internet/subsonicservice.cpp:102 ../bin/src/ui_subsonicsettingspage.h:116 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "Operación Exitosa!" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "%1 se ha escrito con éxito" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "Etiquetas sugeridas" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "Resumen" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "Muy alto (%1 fps)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "Super alta (2048x2048)" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "Formatos soportados" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "Sincronizando bandeja de entrada de Spotify" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "Sincronizando lista de reproducción de Spotify" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "Sincronizando canciones destacadas de Spotify" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "Colores del sistema" #: widgets/fancytabwidget.cpp:654 msgid "Tabs on top" msgstr "Pestañas en la parte superior" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Etiqueta" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "Obtener etiquetas" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "Etiquetar radio" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "Tasa de bits destino" #: ui/equalizer.cpp:125 msgid "Techno" msgstr "Tecno" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "Opciones del texto" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Gracias a" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "El comando \"%1\" no pudo iniciarse." #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "La covertura del album de la cancion actual" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "El directorio %1 es inválido" #: playlist/playlistmanager.cpp:155 playlist/playlistmanager.cpp:173 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "La lista de reproducción '%1' estaba vacía o no pudo ser cargada." #: smartplaylists/searchtermwidget.cpp:330 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 "¡No existe la dirección que ha indicado!" #: ui/coverfromurldialog.cpp:82 msgid "The site you requested is not an image!" msgstr "¡La dirección que ha indicado no es una imagen!" #: internet/subsonicsettingspage.cpp:95 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:2053 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 que acabas de instalar/actualizar necesita re-escanear la colección completa, debido a las nuevas características listadas a continuación:" #: library/libraryview.cpp:529 msgid "There are other songs in this album" msgstr "Hay otras canciones eneste album" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "Problema de comunicacion con gpodder.net" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Hubo un problema obteniendo los metadatos desde Magnatune" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Problema durante la lecture de respuesta del servicio iTunes Store" #: ui/organiseerrordialog.cpp:56 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "Hubo problemas al copiar algunas canciones. Los siguientes ficheros no se pudieron copiar:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "Hubo problemas al borrar algunas canciones. Los siguientes ficheros no se pudieron borrar:" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1876 widgets/fileview.cpp:188 msgid "" "These files will be deleted from disk, are you sure you want to continue?" msgstr "Estos ficheros serán borrados del disco, seguro que desea continuar?" #: devices/deviceview.cpp:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Estos ficheros serán borrados del dispositivo, seguro que desea continuar?" #: ../bin/src/ui_librarysettingspage.h:187 msgid "These folders will be scanned for music to make up your library" msgstr "Estas carpetas serán analizadas en busca de música para crear su colección" #: ../bin/src/ui_transcodersettingspage.h:174 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "Ésta configuración es usada en el diálogo \"Convertir Música\", y cuando se convierte la música antes de copiarla a un dispositivo." #: ../bin/src/ui_groupbydialog.h:151 msgid "Third level" msgstr "Tercer nivel" #: internet/jamendoservice.cpp:171 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 a tener hasta 150 MB.\n¿Quiere continuar de todas formas?" #: internet/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "Este álbum no se encuentra disponible en el formato solicitado" #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Este dispositivo ha de conectarse y abrirse antes de que Clementine pueda ver qué formatos de archivo soporta." #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "Este dispositivo soporta los siguientes formatos de archivo:" #: devices/devicemanager.cpp:582 devices/devicemanager.cpp:590 msgid "This device will not work properly" msgstr "Este dispositivo no funcionará correctamente" #: devices/devicemanager.cpp:583 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "Este es un dispositivo MTP, pero compiló Clementine sin soporte para libmtp." #: devices/devicemanager.cpp:591 msgid "This is an iPod, but you compiled Clementine without libgpod support." msgstr "Esto es un iPod, pero ha compilado Clementine sin soporte para libgpod." #: devices/devicemanager.cpp:340 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 conectas este dispositivo. Clementine buscara archivos de música en el dispositivo - Esto puede tomar algún tiempo." #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "Este streaming es sólo para Suscriptores de Pago" #: devices/devicemanager.cpp:603 #, qt-format msgid "This type of device is not supported: %1" msgstr "Tipo de dispositivo no soportado: %1" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "Tiempo agotado" #: devices/ilister.cpp:120 msgid "Timezone" msgstr "Zona horaria" #: playlist/playlist.cpp:1204 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Título" #: internet/groovesharkservice.cpp:1016 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "Para iniciar la radio de Grooveshark, debes primero escuchar algunas canciones de Grooveshark." #: core/utilities.cpp:123 core/utilities.cpp:139 msgid "Today" msgstr "Hoy" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "Cambiar a OSD Estético" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Pantalla completa" #: ui/mainwindow.cpp:1364 msgid "Toggle queue status" msgstr "Cambiar estado de la cola" #: ../bin/src/ui_mainwindow.h:715 msgid "Toggle scrobbling" msgstr "Cambiar compartición" #: core/commandlineoptions.cpp:168 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Cambiar visibilidad de la indicación-en-pantalla estética" #: core/utilities.cpp:141 msgid "Tomorrow" msgstr "Mañana" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "demaciadas direcciones" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "Temas favoritos" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "Total de bytes transferidos" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "Total de solicitudes hechas a la red" #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Pista" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:694 msgid "Transcode Music" msgstr "Convertir Música" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "Registo de Codificación" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "Transcodificación" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Codificando %1 archivo(s) usando %2 proceso(s)" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "Opciones de transcodificación" #: core/song.cpp:343 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "Turbina" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "Apagar" #: devices/giolister.cpp:161 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:148 msgid "URL(s)" msgstr "URL(s)" #: ../bin/src/ui_ubuntuonesettingspage.h:110 msgid "Ubuntu One" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "Banda ultra ancha (UWB)" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Imposible descargar %1 (%2)" #: core/song.cpp:350 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:405 playlist/playlistmanager.cpp:408 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Desconocido" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "Tipo de contenido desconocido" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Error desconocido" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "Quitar portada" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "Desinscribirse" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "Próximos Conciertos" #: internet/groovesharkservice.cpp:1198 msgid "Update Grooveshark playlist" msgstr "Actualizar lista de reproducción de Grooveshark" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "poner al día todos los podcast" #: ../bin/src/ui_mainwindow.h:706 msgid "Update changed library folders" msgstr "Actualizar carpetas de la colección modificadas" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "Actualizar la colección cuando Clementine inicia" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "poner al día este podcast" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "Puesta al día " #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Actualizando %1" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "Actualizando %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Actualizando colección" #: core/commandlineoptions.cpp:148 msgid "Usage" msgstr "Uso" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "Utilizar el tag \"Album Artist\" cuando se encuentre disponible" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "Usar las combinaciones de teclas de Gnome" #: ../bin/src/ui_networkremotesettingspage.h:169 msgid "Use Remotecontrol" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:274 msgid "Use Replay Gain metadata if it is available" msgstr "Usar metadatos de ganancia de repetición si están disponibles" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "Usar Wiimote" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "Usá un juego de colores a tu gusto" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "Usar un mensaje personalizado para las notificaciones" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "Utilizar autenticación" #: ../bin/src/ui_networkremotesettingspage.h:181 msgid "Use authentication code" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "Usar el motor de gestión de flujo de bits" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "Usar modo dinámico" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "Usar notificaciones para informar del estado del Wiimote" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "Usar noise shaping temporalmente" #: ../bin/src/ui_behavioursettingspage.h:182 msgid "Use the system default" msgstr "Usar los ajustes por defecto del sistema" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "Usá el juego de colores del sistema" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "Utilizar la configuración para proxy del sistema" #: ../bin/src/ui_spotifysettingspage.h:219 msgid "Use volume normalisation" msgstr "Usar normalización de volumen" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "Usado" #: internet/groovesharkservice.cpp:402 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "El usuario %1 no tiene una cuenta Grooveshark Anywhere" #: ui/settingsdialog.cpp:146 msgid "User interface" msgstr "Interfaz de usuario" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:119 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Nombre de Usuario" #: ../bin/src/ui_behavioursettingspage.h:191 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:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "Tasa de bits variable" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:420 ui/albumcovermanager.cpp:247 msgid "Various artists" msgstr "Varios Artistas" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "Versión %1" #: ../bin/src/ui_albumcovermanager.h:154 msgid "View" msgstr "Ver" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "Modo Visualización" #: ../bin/src/ui_mainwindow.h:707 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "Visualizaciones" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "Preferencias de visualizaciones" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "Detección de actividad de voz" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "Volumen %1%" #: devices/wmdmlister.cpp:361 msgid "Volume name" msgstr "Nombre del volumen" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: core/song.cpp:342 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "Sitio web" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "Semanas" #: ../bin/src/ui_behavioursettingspage.h:185 msgid "When Clementine starts" msgstr "Cuando Clementine inicia" #: ../bin/src/ui_librarysettingspage.h:204 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 portadas de álbum Clementine primero buscará imágenes que contienen una de estas palabras.\nSi no hay resultados, entonces se usará la imagen más grande en el directorio." #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "Cuando las lista está vacía..." #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "Por qué no intentar..." #: devices/ilister.cpp:121 msgid "WiFi MAC Address" msgstr "Dirección MAC del WiFi" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "Banda ancha (WB)" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wiimote %1: activo" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wiimote %1: conectado" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wiimote %1: batería en estado crítico (%2%) " #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wiimote %1: desactivado" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wiimote %1: desconectado" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wiimote %1: batería baja (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:332 msgid "Windows Media audio" msgstr "Audio de Windows Media" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Quieres desplasar las otras canciones de este album en la categoria \"compilacion de artistas\"" #: ui/mainwindow.cpp:2058 msgid "Would you like to run a full rescan right now?" msgstr "¿Querés hacer un re-escaneo completo ahora?" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "" #: internet/subsonicsettingspage.cpp:83 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "Año" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "Año - Álbum" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "Años" #: core/utilities.cpp:125 msgid "Yesterday" msgstr "Ayer" #: playlist/playlistlistcontainer.cpp:296 #, qt-format msgid "You are about to delete %1 playlists, are you sure?" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "Estas a punto de descargar los siguientes álbumes" #: ../bin/src/ui_loginstatewidget.h:172 msgid "You are not signed in." msgstr "No has iniciado sesión." #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "Has iniciado sesión como %1." #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "Has iniciado sesión." #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "Podés cambiar el modo en que las canciones de la colección son organizadas." #: internet/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "Podés escuchar gratuitamente sin cuenta de usuario, pero los miembros Premium pueden escuchar transmisiones de más alta calidad sin publicidad." #: internet/magnatunesettingspage.cpp:53 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 "Podés 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "Podés escuchar transmisiones de fondo al mismo tiempo que a otra música." #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "Podés enviar de forma gratuita la información de las canciones escuchadas, pero solo los suscriptores de pago pueden escuchar la radio de Last.fm desde Clementine." #: ../bin/src/ui_wiimotesettingspage.h:184 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 "Podés usar tu Wiimote como un mando a distancia para Clementine. Visita la página en el wiki de Clementine para más información.\n" #: internet/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "No tenés una cuenta Grooveshark Anywhere." #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "No tenés una cuenta Spotify Premium." #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "No tiene ninguna subscripción activa" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Has cerrado tu sesión en Spotify, por favor re-ingresa tu contraseña en el diálogo de opciones." #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Su sesión en Spotify ha caducado, por favor re-ingresa tu contraseña." #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "Te encanta esta canción" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "Necesitas ejecutar Sistema - Preferencias y activar \"Activar acceso para dispositivos de asistencia\" para utilizar los atajos de teclado globales en Clementine." #: ../bin/src/ui_behavioursettingspage.h:184 msgid "You will need to restart Clementine if you change the language." msgstr "Vas a necesitar reiniciar Clementine si cambias el idioma." #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "No podrás reproducir las estaciones de radio de Last.fm hasta que no seas un suscriptor de Last.fm." #: ../bin/src/ui_networkremotesettingspage.h:186 msgid "Your IP address:" msgstr "" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Tus credenciales de Last.fm fueron incorrectas" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "Tus credenciales de Magnatune son incorrectas" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "Tu colección está vacía." #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "Tus streamings de radio" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "Sus scrobbles: %1" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Su sistema no es compatible con OpenGL, las visualisaciones no son disponibles." #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 msgid "Your username or password was incorrect." msgstr "Tu nombre de usuario o contraseña es incorrecta." #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:126 msgid "Zero" msgstr "Cero" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "añadir %n pistas" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "después" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "atrás" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "y" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "automático" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "antes" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "entre" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "más grande primero" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "contiene" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "deshabilitado" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "Disco %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "no contiene" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "termina con" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "sea igual a" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "gpodder.net" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "Repertorio gpodder.net" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "mayor que" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "en los últimos" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "menor que" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "más largo primero" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "mover %n canciones" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "más nuevo primero" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "no sea igual a" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "no en los últimos" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "no en" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "más antiguo primero" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "en" #: core/commandlineoptions.cpp:148 msgid "options" msgstr "opciones" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "Presiona enter" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "remover %n pistas" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "más corto primero" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "reproducción aleatoria" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "más pequeño primero" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "ordernar canciones" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "comienza con" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "detener" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "Pista %1" clementine-1.2.0+dfsg/src/translations/et.po000066400000000000000000003745511223327513400210550ustar00rootroot00000000000000# 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 # Nasretdinov.R.R , 2013 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:07+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Estonian (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " msek" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " punkti" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " sekundit" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " laulu" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 albumit" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 päeva" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 päeva tagasi" #: podcasts/gpoddersync.cpp:79 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 плейлист (%2)" #: playlist/playlistmanager.cpp:413 #, qt-format msgid "%1 selected of" msgstr "выбрано %1 из" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 lugu" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 lugu" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "Leiti %1 lugu" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "Найдено %1 записей (показано %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 pala" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: moodul Wiimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, qt-format msgid "%L1 other listeners" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n ebaõnnestus" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n lõpetatud" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "&Kohandatud" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "Lisad" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "Abi" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "Peida %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "Peida..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Vasakule" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "Muusika" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Puudub" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "Lugude nimekiri" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Välju" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "Kordav režiim" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Paremale" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "Segatud režiim" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "Растянуть столбцы по размеру окна" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "Töövahendid" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "..ja kõik Amaroki toetajad" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 päev" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 lugu" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 случайных треков" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "Купить Премиум" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "" #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:78 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:153 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "%1 info" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "Clementine info..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "Qt info..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Konto üksikasjad" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "Банковские реквизиты (Премиум)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Toiming" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Aktiveeri/deaktiveeri Wiiremote" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Raadiovoo lisamine" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "Lisa tegevus" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "" #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Lisa kaust..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Lisa fail..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Lisa failid Transkodeerimisele" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Lisa kaust" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Lisa kaust..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Lisa uus kaust..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Lisa raadiovoog..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Lisa esitusnimekirja" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Lisa wiimotedev tegevus" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Lisa..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Lisatud sel kuul" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Lisatud sel nädalal" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Lisatud sel aastal" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Lisatud täna" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Lisatud kolme kuu jooksul" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "Pärast kopeerimist..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Album (kõigil radadel ideaalne valjus)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Albumi esitaja" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "" #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Album koos kaanega" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Kõik failid (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "Kõik au Hüpnokärnkonnale!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Kõik albumid" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Kõikesitajad" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "Kõik failid (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "" #: ui/about.cpp:74 msgid "All the translators" msgstr "Kõik tõlkiad" #: library/library.cpp:84 msgid "All tracks" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "" #: internet/spotifyblobdownloader.cpp:60 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:61 msgid "An error occurred loading the iTunes database" msgstr "" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:78 msgid "And:" msgstr "" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Väljanägemine" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Esitaja" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Esitaja info" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "Artisti sildipilv" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Heli vorming" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Autentimine ebaõnnestus" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "" #: ui/about.cpp:65 msgid "Authors" msgstr "Autorid" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Automaatne uuendamine" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "Saadaolevad" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Taustavärv" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Tausta läbipaistvus" #: core/database.cpp:734 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Keela" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Paas sinine" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Käitumine" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "Parim" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Bitikiirus" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Sirvi..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Nupud" #: core/song.cpp:339 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "Loobu" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Muuda kirja suurust..." #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "" #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Muuda keelt" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Kontrolli uuendusi..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Vali automaatselt" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Vali värv..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "" #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Vali nimekirjast" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "" #: ui/equalizer.cpp:115 msgid "Classical" msgstr "Klassikaline" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Puhasta" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Esitusloendi puhastamine" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: internet/lastfmsettingspage.cpp:110 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 "" #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Klikka siin et lisada muusikat" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "Sulge visualiseerimine" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "" #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:116 msgid "Club" msgstr "Klubi" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Märkus" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "" #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Helilooja" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "" #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "" #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "" #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Kiirklahvide seadistamine" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "" #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "" #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "" #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "Seadista..." #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "Ühenda seade" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Kopeeri seadmesse..." #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:64 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: transcoder/transcoder.cpp:432 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "Ei suuda avada väljund faili %1" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Kaanepildi haldur" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "Kohanda" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Kohandatud..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Tantsumuusika" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Loomise kuupäev" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Muutmise kuupäev" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "&Vaikeväärtus" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Heli vaiksemaks" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "Vaikeväärtused" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Kustuta failid" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Kustuta seadmest..." #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Kustuta kettalt..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "Kustuta valmisseadistus." #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "Kustuta originaal failid" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Failide kustutamine" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Sihtkoht" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Üksikasjad..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Seade" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Seadme seadistus" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Seadme nimi" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Seadme omadused..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Seadmed" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Kataloog" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "Näita kestust" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Keelatud" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Ketas" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "Ekraani seaded" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Ära korda" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "Ära sega" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "Ära peata!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Avamiseks tee topeltklikk" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "" #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "Lae kaust alla" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "Lae liikmelisus" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Lae see album alla" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Lae see album..." #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "" #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "Lohista asukoha muutmiseks" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Muuda silti \"%1\"..." #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "Muuda silti..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Muuda loo infot" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "Muuda loo infot..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Muuda lugude infot" #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Muuda..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "Luba Wii kaug tugi" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "Luba ekvalaiser" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Sisesta artist või tag et alustada Last.fm raadio kuulamist." #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "Sisesta siia otsingusõnad" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Viga" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "Viga laulude kopeerimisel" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:63 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "Hajumine" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "Tõmba puuduvad kaanepildid" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "Faililaiend" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "Faili vormingud" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Faili nimi" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Faili suurus" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Faili tüüp" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Faili nimi" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Failid" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "Transkodeerida failid" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "Esimene tase" #: core/song.cpp:328 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Kirja suurus" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Vorm" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "Vorming" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Kaadrisagedus" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Sõbrad" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Täisbass" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Üldised seadistused" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Žanr" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "Anna sellele nimi:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "Rühmitamise alus" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "Rühmita albumite järgi" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "Rühmita esitajate järgi" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "Grupeeri esitaja/albumi järgi" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "Grupeeri esitaja/aasta albumi järgi" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "Grupeeri zanri/albumi järgi" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "Grupeeri zanri/esitaja/albumi järgi" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "HTTP-puhverserver" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "Riistvara info" #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "Kõrge (1024x1024)" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "Mul pole Magnatune kontot" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Ikoon" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "ikoonid üleval" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:43 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Heli valjemaks" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "Informatsioon" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "Lisa..." #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Paigaldatud" #: core/database.cpp:673 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "Vigane API võti" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Sobimatu formaat" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "Vigane meetod" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "Vigased parameetrid" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "Vigane teenus" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "Vigane sessiooni võti" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "Jamendo andmebaas" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "Säiilita originaalfailid" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "Kassipojad" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Keel" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "Rüpperaal/Kõrvikud" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Suur ruum" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "Suur albumi kaanepilt" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "Suur külgriba" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "Viimati esitatud" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Last.fm sildipilve raadio: %1" #: internet/lastfmservice.cpp:437 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:154 msgid "Last.fm password" msgstr "Last.fm parool" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Last.fm sildipilv" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Last.fm wiki" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Kestvus" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Helikogu" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Rajad" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "" #: ui/equalizer.cpp:123 msgid "Live" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Laadi" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "Lae ümbris URL-ilt---" #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "Lae ümbris plaadilt..." #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "Laadi esitusnimekiri" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "Lae esitusnimekiri..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "Voo laadimine" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "Laadimine..." #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Logi sisse" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "Meeldib" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "Madal (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "Laulusõnad" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "Vigane vastus" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "Puhvri käsitsiseadistus" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "Tootja" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "Keskmine (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "Mudel" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "" #: library/library.cpp:74 msgid "Most played" msgstr "" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "Haakepunkt" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "Liiguta alla" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "Liiguta üles" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Muusika kogu" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "Vaigista" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "Minu naabrus" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Nimi" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "Nimetamise valikud" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "Naabrid" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "Mitte kunagi" #: library/library.cpp:67 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "Uus esitusnimekiri" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "Uued laulud" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:80 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Järgmine lugu" #: core/utilities.cpp:147 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:366 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "Puudub" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "Pole ühendatud" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "Pole piisavalt sisu" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "Pole piisavalt fänne" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "Pole piisavalt liikmeid" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "Pole piisavalt naabreid" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Teavitused" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Hetkel mängib" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "" #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "Ava seade" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "" #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Ava..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "Operatsioon ebaõnnestus" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "" #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "Organiseeri faile" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "Organiseeri faile..." #: core/organise.cpp:65 msgid "Organising files" msgstr "Organiseerin faile" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Muud valikud" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "Väljundi valikud" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "Kirjuta olemasolev fail üle" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:124 msgid "Party" msgstr "Pidu" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "Parool" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Paus" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "Peata esitus" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Peatatud" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Mängi" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "Mängi Esitaja või Sildipilve" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "" #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "Esitamiste arv" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "" #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "Mängi, kui on peatatud, paus, kui mängitakse" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "Mängi sildipilve raadiot..." #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "Esita/paus" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Taasesitus" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Esitaja valikud" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "Lugude nimekiri" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "Esitusnimekiri läbi" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "Esitusnimekirja valikud" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Pop" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "Eelmoonutus" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "Seadistused" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "Seadistused..." #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "Eelistatud heli vorming" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "Eelistatud vorming" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "Valmisvalik:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "Eelvaade" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "Eelmine lugu" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "Progress" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "Kvaliteet" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "Järjekorrahaldur" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "Raadio (kõigil paladel võrdne valjus)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "Vihm" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "Hinnang" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Regemuusika" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Eemalda" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "Eemalda toiming" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "Eemalda kaust" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "Eemalda esitusnimekirjast" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "Nimeta lugude nimekiri ümber" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Korda" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" 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:206 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Rokk" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "Diskreetimissagedus" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "Diskreetimissagedus" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "Pildi salvestamine" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "Salvesta lugude nimekiri" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "Salvesta esitusnimekiri..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "Eelmääratluse salvestamine" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "Otsing" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "Otsingu valikud" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "Teine tase" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "Vali kõik" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "Tühista valik." #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "" #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "Seerianumber" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Kiirklahv" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Näita" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "Näita ekraanimenüüd" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:460 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:209 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "" #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "" #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "Paneeliikooni näitamine" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "Näita/peida" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Sega" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "Sega kõik" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "Sega esitusnimistu" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "Logi välja" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "Sarnased esitajad" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "Lugude nimekirjas tagasi hüppamine" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "Lugude nimekirjas edasi" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "Väike külgriba" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Mahe" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "Laulu andmed" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "Sonogramm" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 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" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "Käivitatakse %1" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "Alustamine..." #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Peata" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Esitamise lõpetamine" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "Peatatud" #: core/song.cpp:341 msgid "Stream" msgstr "Voog" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "Toetatud vormingud" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Silt" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "Sildiraadio" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Tehno" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Tänud" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "" #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:56 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:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:174 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:151 msgid "Third level" msgstr "Kolmas tase" #: internet/jamendoservice.cpp:171 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Pealkiri" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "Täna" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Lülita täisekraani" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Rada" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "Transkodeeri muusikat" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "Transkodeerimis logi" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "" #: core/song.cpp:338 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "Turbiin" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "" #: devices/giolister.cpp:161 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Tundmatu" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Tundmatu viga" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "Kasutus" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "Kasutuses" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Kasutajanimi" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "Erinevad esitajad" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "Versioon %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "Vaade" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "Visualiseeringud" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "Virtualiseerimise seaded" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "Aasta" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "Aasta - Album" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "Eile" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "" #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "" #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "" #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Null" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "lisa %n laulu" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "pärast" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "enne" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "sisaldab" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "suurem kui" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "vähem kui" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "valikud" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "peata" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "" clementine-1.2.0+dfsg/src/translations/eu.po000066400000000000000000004546331223327513400210560ustar00rootroot00000000000000# 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 # azken_tximinoa , 2012 # azken_tximinoa , 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:07+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Basque (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr "egun" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " pt" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " segundu" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " abesti" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 album" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 egun" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "duela %1 egun" #: podcasts/gpoddersync.cpp:79 #, 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:413 #, qt-format msgid "%1 selected of" msgstr "%1 aukeraturik" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 abestia" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 abesti" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 abesti aurkiturik" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 abesti aurkiturik (%2 erakusten)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 pista" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 transferitua" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimotedev modulua" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n-(e)k huts egin du" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n amaituta" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "&Pertsonalizatua" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "&Gehigarriak" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "&Laguntza" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "&Ezkutatu %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "&Ezkutatu..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "Ez&kerrera" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "&Musika" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Bat ere ez" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "&Erreprodukzio-zerrenda" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Itxi" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "E&rrepikatze-modua" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "E&skuinera" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "Au&sazko modua" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "&Tiratu zutabeak leihoan egokitzeko" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "&Tresnak" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(desberdinak zenbait abestien zehar)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "...eta Amarok-eko laguntzaile guztiei" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "0px" #: core/utilities.cpp:108 msgid "1 day" msgstr "Egun 1" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "Pista 1" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 ausazko pista" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "Eguneratu Premium-era orain" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "Beharrezkoa da Grooveshark Anywhere kontua izatea" #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "Beharrezkoa da Spotify Premium kontua izatea." #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:78 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:153 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:297 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC 64K" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "LORIA OSOA HIPNOAPOARENTZAT" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "%1-(r)i buruz" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "Clementine-ri buruz..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "Qt-ri buruz..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Kontuaren xehetasunak" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "Kontuaren xehetasunak (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Ekintza" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Wiiremote-a aktibatu/desaktibatu" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "Podcast-a gehitu" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Gehitu jarioa" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "Lerro berria gehitu jakinarazpen motak onartzen badu" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "Gehitu ekintza" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Gehitu beste jario bat..." #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Gehitu direktorioa..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "Gehitu fitxategia" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Gehitu fitxategia..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Gehitu transkodetzeko fitxategiak" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Gehitu karpeta" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Gehitu karpeta..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Gehitu karpeta berria..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "Podcast-a gehitu" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "Podcast-a gehitu..." #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Gehitu bilaketa-terminoa" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "Gehitu album etiketa abestiari" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "Gehitu bildumaren artista etiketa abestiari" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "Gehitu artista etiketa abestiari" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "Gehitu konpositore etiketa kantari" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "Gehitu diska etiketa kantari" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "Gehitu kantaren fitxategi-izena" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "Gehitu generoa etiketa kantari" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "Gehitu iraupena etiketa kantari" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "Gehitu kantaren erreprodukzio-kontagailua" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "Gehitu kantaren jauzi-kontagailua" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "Gehitu titulua etiketa kantari" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "Gehitu pista etiketa kantari" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "Gehitu urtea etiketa kantari" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Gehitu jarioa..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "Gehitu Grooveshark-eko gogokoenetara" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "Gehitu Grooveshark-eko erreprodukzio-zerrendetara" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "Gehitu beste erreprodukzio-zerrenda batera" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Gehitu erreprodukzio-zerrendara" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "Gehitu ilarara" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Gehitu wiimotedev ekintza" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Gehitu..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Hilabete honetan gehitua" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Aste honetan gehitua" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Aurten gehitua" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Gaur gehitua" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Azken hiru hilabeteetan gehitua" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "Abestia Nire Musikara gehitzen" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "Abestia gogokoenetara gehitzen" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Taldekatze aurreratua..." #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "Ondoren" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "Kopiatu ondoren..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Albuma" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Albuma (pista guztientzako bolumen ideala)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Albumeko artista" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "Albumeko azala" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Albumeko informazioa jamendo.com-en..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Azaldun albumak" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Azal gabeko albumak" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Fitxategi guztiak (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "Loria osoa Hipnoapoarentzat!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Album guztiak" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Artista guztiak" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "Fitxategi guztiak (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Erreprodukzio-zerrenda guztiak (%1)" #: ui/about.cpp:74 msgid "All the translators" msgstr "Itzultzaile guztiak" #: library/library.cpp:84 msgid "All tracks" msgstr "Pista guztiak" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "Mid/side kodeketa baimendu" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "Jatorrizkoekin batera" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Leiho nagusia beti ezkutatu" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Leiho nagusia beti erakutsi" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "Beti hasi erreproduzitzen" #: internet/spotifyblobdownloader.cpp:60 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:61 msgid "An error occurred loading the iTunes database" msgstr "Errorea gertatu da iTunes datu-basea kargatzerakoan" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Errorea gertatu da '%1'-(e)ra metadatuak idazterakoan" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "Errore ezezagun bat gertatu da." #: ui/about.cpp:78 msgid "And:" msgstr "Eta:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "Haserre" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Itxura" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Erantsi Fitxategiak/URL-ak erreprodukzio-zerrendari" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "Erantsi oraingo erreprodukzio-zerrendari" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "Erantsi erreprodukzio-zerrendari" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "Konpresioa aplikatu laburketak ekiditeko" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "\"%1\" aurrezarpena ezabatu?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "Erreprodukzio-zerrenda hau ezabatu?" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "Abesti honen estatistikak berrezarri?" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Artista" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Artis. infor." #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "Artistaren irratia" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "Artistaren etiketak" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "Artistaren inizialak" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Audio formatua" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Autentifikazioak huts egin du..." #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "Egilea" #: ui/about.cpp:65 msgid "Authors" msgstr "Egileak" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Automatikoa" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Eguneratze automatikoa" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "Bilduma-zuhaitzean automatikoki ireki banako kategoriak" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "Eskuragarri" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "Batez besteko bit-tasa" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "Batez besteko irudi-tamaina" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "BBC-ko podcast-ak" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "Hondo-jarioak" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Atzeko planoko kolorea" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "Atzeko planoko irudia" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Atzeko planoko opakotasuna" #: core/database.cpp:734 msgid "Backing up database" msgstr "Datu-basearen babeskopia burutzen" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Galarazi" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "Barra-analizatzailea" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Oinarrizko urdina" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "Oinarrizko audio mota" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Portaera" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "Onena" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "%1-ko biografia" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Bit-tasa" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "Bit-tasa" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "Bloke-analizatzailea" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "Bloke-mota" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "Gorputza" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "Boom analizatzailea" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Arakatu..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "Bufferra betetzen" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "Baina iturri hauek desgaiturik daude:" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Botoiak" #: core/song.cpp:339 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "CUE orriaren euskarria" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "Utzi" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Aldatu azala" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Aldatu letra-tipo tamaina..." #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "Aldatu errepikatze-modua" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Aldatu laster-tekla..." #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "Aldatu ausazko modua" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Aldatu hizkuntza" #: ../bin/src/ui_playbacksettingspage.h:330 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:228 msgid "Check for new episodes" msgstr "Atal berriak bilatu" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Eguneraketak bilatu..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "Erreprodukzio-zerrenda adimendunaren izena hautatu" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Automatikoki hautatu" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Hautatu kolorea..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "Hautatu letra-tipoa..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Hautatu zerrendatik" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Hautatu zerrendaren ordena eta izango duen abesti kopurua." #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "Podcast-a deskargatzeko direktorioa aukeratu" #: ../bin/src/ui_songinfosettingspage.h:188 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:115 msgid "Classical" msgstr "Klasikoa" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "Garbiketa" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Garbitu" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Erreprodukzio-zerrenda garbitu" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Clementine-ren errorea" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Clementine laranja" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Clementine-ren bistaratzea" #: ../bin/src/ui_deviceproperties.h:376 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_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:104 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:104 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_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "Clementine-k Ubuntu One-ra igo duzun musika erreproduzitu dezake" #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "Clementine-k mezua erakutsi dezake pista aldatzen denean." #: ../bin/src/ui_podcastsettingspage.h:250 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:128 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." #: internet/lastfmsettingspage.cpp:110 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 "Clementine-k ezin izan du zure harpidetza-egoera hartu, konexioarekin arazoak baitaude. Erreproduzituriko abestiak katxean gorde eta beranduago bidaliko dira Last.fm-ra" #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Clementine irudi-ikustailea" #: ../bin/src/ui_trackselectiondialog.h:206 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:210 msgid "Clementine will find music in:" msgstr "Hemen bilatuko du musika Clementine-k:" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Egin klik hemen musika gehitzeko" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "Egin klik geratzen den denbora eta denbora osoaren artean txandakatzeko" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "Erreprodukzio-zerrenda itxi" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "Itxi bistaratzea" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "Leiho hau ixteak deskarga bertan-behera utziko du." #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "Leiho hau ixteak albumen azalen bilaketa geldituko du." #: ui/equalizer.cpp:116 msgid "Club" msgstr "Club-a" #: ../bin/src/ui_appearancesettingspage.h:272 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:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Iruzkina" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "Bete etiketak automatikoki" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "Bete etiketak automatikoki..." #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Konpositorea" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "%1 konfiguratu..." #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "Konfiguratu Grooveshark..." #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Konfiguratu Last.fm" #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "Konfiguratu Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Konfiguratu laster-teklak" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "Konfiguratu Spotify..." #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "Subsonic konfiguratu" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "Bilaketa globala konfiguratu..." #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "Konfiguratu bilduma..." #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "Podcast-ak konfiguratu" #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "Konfiguratu..." #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "Konektatu Wii urruneko kontrola aktibatu/desaktibatu botoia erabiliz" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "Konektatu gailua" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "Konektatu Spotify-ra" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "Kontsola" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "Bit-tasa konstantea" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "Musika guztia bihurtu" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "Gailuak erreproduzitu ezin dezakeen musika bihurtu" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "Kopiatu arbelean" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Kopiatu gailura..." #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Kopiatu bildumara..." #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "Copyright" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:64 #, 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" #: transcoder/transcoder.cpp:432 #, 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:426 #, 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/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "Ezin izan da last.fm-ko irratia kargatu" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "Ezin izan da %1 irteera-fitxategia ireki" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Azal-kudeatzailea" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "Irudi txertatu bateko azalak" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "%1-(e)tik automatikoki kargaturiko azalak" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "Eskuz berrezarritako azalak" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "Ezarri gabeko azalak" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "%1-(e)tik ezarritako azalak" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "%1-(e)ko azalak" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "Grooveshark-eko erreprodukzio-zerrenda berria sortu" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "Iraungi automatikoki kantak aldatzen direnean" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "Iraungi eskuz kantak aldatzen direnean" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Behera" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Maius+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Maius+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Gora" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "Pertsonalizatua" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "Irudi pertsonalizatua:" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "Mezu-ezarpen pertsonalizatuak" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "Irrati pertsonalizatua" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Pertsonalizatua..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "DBus bide-izena" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Dance" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Sorrera-data" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Aldatze-data" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "Egun" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "&Lehenetsia" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "Bolumena % 4 jaitsi" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Bolumena jaitsi" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "Atzeko planoko irudi lehenetsia" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "Lehenetsiak" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "Bistaratzeen arteko atzerapena" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "Ezabatu" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "Ezabatu Grooveshark-eko erreprodukzio-zerrenda" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "Ezabatu deskargatutako datuak" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Ezabatu fitxategiak" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Ezabatu gailutik..." #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Ezabatu diskotik..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "Erreproduzitutako atalak ezabatu" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "Ezabatu aurre-ezarpena" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "Ezabatu erreprodukzio-zerrenda adimenduna" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "Ezabatu jatorrizko fitxategiak" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Fitxategiak ezabatzen" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "Atera aukeraturiko pistak ilaratik" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "Atera pista ilaratik" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Helmuga" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Xehetasunak..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Gailua" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Gailuaren propietateak" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Gailuaren izena" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Gailuaren propietateak..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Gailuak" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Esan nahi zenuen" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "Digitally Imported-eko pasahitza" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "Digitally Imported-eko erabiltzaile-izena" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "Internet-konexio zuzena" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Direktorioa" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "Iraupena desgaitu" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "Aldarte-barren sortzea desgaitu" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Desgaituta" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Diska" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "Transmisio ez-jarraitua" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 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:715 msgid "Do a full library rescan" msgstr "Bildumaren berreskaneo osoa egin" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "Ez bihurtu musikarik" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Ez errepikatu" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "Ez erakutsi hainbat artista" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "Ez nahastu" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "Ez gelditu!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Klik bikoitza irekitzeko" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "Abesti batean klik bikoitza eginez gero..." #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "%n atal deskargatu" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "Direktorioa deskargatu" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "Atalak hemen deskargatu" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "Deskargarako bazkidetza" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "Atal berriak automatikoki deskargatu" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "Deskarga zerrendaren zain" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Deskargatu album hau" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Deskargatu album hau..." #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "Atal hau deskargatu" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "Deskargatu..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "Deskargatzen (%%1)..." #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "Icecast direktorioa deskargatzen" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "Jamendo katalogoa deskargatzen" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "Magnatune katalogoa deskargatzen" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "Spotify plugina deskargatzen" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "Metadatuak deskargatzen" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "Arrastatu birkokatzeko" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "Dropbox" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "Modu dinamikoa aktibaturik" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "Ausazko nahasketa dinamikoa" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "Editatu erreprodukzio-zerrenda adimenduna..." #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Editatu \"%1\" etiketa" #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "Editatu etiketa..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "Editatu etiketak" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Editatu pistaren informazioa" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "Editatu pistaren informazioa..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Editatu pisten informazioa..." #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Editatu..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "Gaitu Wii urruneko kontrolaren euskarria" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "Gaitu ekualizadorea" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "Gaitu lasterbideak Clementine fokaturik dagoenean bakarrik" #: ../bin/src/ui_globalsearchsettingspage.h:147 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:62 msgid "Enable/disable Last.fm scrobbling" msgstr "Gaitu/desgaitu Last.fm-ko partekatzea" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "Kodeketaren konplexutasuna" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "Kodeketa-motorearen kalitatea" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "Kodetze modua" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "URL bat sartu" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "Sartu URL bat Internetetik azala jaisteko:" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "Sartu izen berria erreprodukzio-zerrenda honentzat" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Sartu artista edo etiketa bat Last.fm irratia entzuten hasteko." #: ../bin/src/ui_globalsearchview.h:209 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:77 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:77 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:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "Sartu bilaketa-terminoak hemen" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "Sartu interneteko irratiko jarioaren URLa:" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "Sartu karpetaren izena" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "Bilduma osoa" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Errorea" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Errorea MTP gailua konektatzean" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "Errorea abestiak kopiatzean" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "Errorea abestiak ezabatzean" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "Errorea Spotify plugin-a deskargatzean" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "Errorea %1 kargatzean" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Errorea di.fm erreprodukzio-zerrenda kargatzean" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "Errorea %1 prozesatzean: %2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "Errorea audio CDa kargatzean" #: library/library.cpp:63 msgid "Ever played" msgstr "Inoiz erreproduzitutakoak" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "10 minuturo" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "12 orduro" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "2 orduro" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "20 minuturo" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "30 minuturo" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "6 orduro" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "Orduro" #: ../bin/src/ui_playbacksettingspage.h:303 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:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "Zabaldu" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "%1-(e)an iraungitzen da" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "Pista gelditzerakoan iraungitu" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "Iraungitzea" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "Iraungitzearen iraupena" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "Direktorioa ezin izan da eskuratu" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "Podcast-ak ezin izan dira lortu" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "Podcast-a ezin izan da kargatu" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "RSS kanal honen XML ezin izan da parseatu" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "Azkarra" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "Gogokoenak" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "Pista gogokoenak" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "Falta diren azalak eskuratu" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "Automatikoki eskuratu" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "Eskuraketa eginda" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Errorea azalak eskuratzean" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "Fitxategi-luzapena" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "Fitxategi-formatuak" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Fitxategi-izena" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "Fitx.-izena (bidea gabe)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Fitxategi-tamaina" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Fitxategi-mota" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Fitxategi-izena" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Fitxategiak" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "Transkodetzeko fitxategiak" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "Ezarritako irizpideak betetzen dituzten bildumako abestiak bilatu." #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "Abestiaren hatz-marka eskuratzen" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "Amaitu" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "Lehen maila" #: core/song.cpp:328 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Letra-tipoaren tamaina" #: ../bin/src/ui_spotifysettingspage.h:213 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:204 msgid "Force mono encoding" msgstr "Mono kodeketa behartu" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "Gailua ahaztu" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Inprimakia" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "Formatua" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Laginketa-abiadura" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "Koadroak buffer-eko" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Lagunak" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "Izoztuta" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Baxu osoak" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "Baxu osoak + Altua" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "Altu osoak" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "GStreamer audio motorea" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "Orokorra" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Ezarpen orokorrak" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Generoa" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "URL bat lortu erreprodukzio-zerrenda hau Grooveshark-en partekatzeko" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "URL bat lortu abesti hau Grooveshark-en partekatzeko" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "Grooveshark-eko abesti ezagunak eskuratzen" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "Kateak eskuratzen" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "Jarioak eskuratzen" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "Izendatu:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "Joan" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "Hurrengo erreprodukzio-zerrendara joan" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "Aurreko erreprodukzio-zerrendara joan" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, 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:206 msgid "Grey out non existent songs in my playlists" msgstr "Existitzen ez diren abestiak ilundu erreprodukzio-zerrendetan" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "Grooveshark-eko saio-hasierak huts egin du" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "Grooveshark-eko erreprodukzio-zerrendaren URLa" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "Grooveshark irratia" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "Grooveshark-eko kantaren URLa" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "Bilduma taldekatu honela..." #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "Taldekatu" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "Taldekatu albumaren arabera" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "Taldekatu artistaren arabera" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "Taldekatu artista/albumaren arabera" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "Taldekatu artista/urtea - albumaren arabera" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "Taldekatu genero/albumaren arabera" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "Taldekatu generoa/artista/albumaren arabera" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "HTML orriak ez du inongo RSS kanalik" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "HTTP proxy-a" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "Pozik" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "Hardware-informazioa" #: ../bin/src/ui_deviceproperties.h:372 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:202 msgid "High" msgstr "Altua" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "Altua (%1 fps)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "Altua (1024x1024)" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "Orduak" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "Hipnoapoa" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "Ez daukat Magnatune-ko konturik" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Ikonoa" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "Ikonoak goian" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "Abestia identifikatzen" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 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:77 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:204 msgid "Ignore \"The\" in artist names" msgstr "Artisten izenetako \"The\"-ak ezikusi" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Irudiak (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "%1 egunetan" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "%1 asteetan" #: ../bin/src/ui_wizardfinishpage.h:86 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/spotifyservice.cpp:360 msgid "Inbox" msgstr "Sarrera-ontzia" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "Jakinarazpenean albumaren azala gehitu" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "Kanta guztiak erantsi" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "Bolumena % 4 igo" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Bolumena igo" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "Indexatzen: %1" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "Informazioa" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "Txertatu" #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Instalatuta" #: core/database.cpp:673 msgid "Integrity check" msgstr "Osotasunaren egiaztapena" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "Internet hornitzaileak" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "API gako baliogabea" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Formatu baliogabea" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "Metodo baliogabea" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "Parametro baliogabeak" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "Baliabide baliogabea zehaztua" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "Zerbitzu baliogabea" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "Sesio-gako baliogabea" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "Erabiltzaile-izen edota pasahitz baliogabea" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "Jamendo-ko pista entzunenak" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "Jamendo-ko kantarik onenak" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "Jamendo-ko hilabeteko kantarik onenak" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "Jamendo-ko asteko kantarik onenak" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "Jamendo datu-basea" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "Erreproduzitzen ari den pistara jauzi egin" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Sakatu botoiak segundu %1-ez..." #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Sakatu botoiak %1 segunduz..." #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "Jarraitu atzealdean exekutatzen leihoa ixten denean" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "Jatorrizko fitxategiak mantendu" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "Katakumeak" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Hizkuntza" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "Eramangarria/Aurikularrak" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Areto handia" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "Albumeko azal handia" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "Albo-barra handia" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "Erreproduzitutako azkena" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "Last.fm-ko irrati pertsonalizatua: %1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Last.fm-ko bilduma -%1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "Last.fm Mix irratia - %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Last.fm auzokoen irratia - %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Last.fm irratia - %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Last.fm-ko %1-ren antzekoak diren artistak" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Last.fm etiketaren irratia: %1" #: internet/lastfmservice.cpp:437 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:154 msgid "Last.fm password" msgstr "Last.fm-ko pasahitza" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "Last.fm erreprodukzio kontagailua" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Last.fm etiketak" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Last.fm-ko erabiltzaile-izena" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Last.fm-ko wikia" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "Gutxien gogoko diren pistak" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "Hutsik utzi lehenetsirako. Adibideak: \"/dev/dsp\", \"front\", e.a." #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Iraupena" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Bilduma" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "Bildumaren taldekatze aurreratua" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "Bildumaren berreskaneoaren abisua" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "Bilatu bilduman" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Limiteak" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "Entzun Grooveshark-eko abestiak aurretik entzun duzunean oinarrituz" #: ui/equalizer.cpp:123 msgid "Live" msgstr "Zuzenean" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Kargatu" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "Kargatu azala URLtik" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "Kargatu azala URLtik..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "Kargatu azala diskotik" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "Kargatu azala diskotik..." #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "Kargatu erreprodukzio-zerrenda" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "Kargatu erreprodukzio-zerrenda..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Last.fm irratia kargatzen" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "MTP gailua kargatzen" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "iPod-eko datu-basea kargatzen" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "Erreprodukzio-zerrenda adimenduna kargatzen" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "Abestiak kargatzen" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "Jarioa kargatzen" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "Pistak kargatzen" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "Pisten informazioa kargatzen" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "Kargatzen..." #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "Fitxategiak/URLak kargatzen ditu, momentuko erreprodukzio-zerrenda ordezkatuz" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Saio-hasiera" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "Saio hasieraren huts egitea" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "Epe luzerako predikzio profila (LTP)" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "Oso gustukoa" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Baxua (%1 fps)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "Baxua (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "Konplexutasun baxuko profila (LC)" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "Letrak" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "%1-eko letrak" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Magnatune deskarga" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Magnatune deskarga eginda" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "Profil nagusia (MAIN)" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "Egin ezazu!" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "Erreprodukzio-zerrenda eskuragarri egin lineaz-kanpo" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "Gaizki eratutako erantzuna" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "Eskuzko proxy konfigurazioa" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "Eskuz" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "Fabrikatzailea" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "Entzunda bezala markatu" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "Berri bezala markatu" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "Bilaketa-termino guztiak parekatu (AND)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "Bilaketa-termin bat edo gehiago parekatu (OR)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "Bit-tasa maximoa" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "Ertaina (%1 fps)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "Ertaina (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "Bazkidetza mota" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "Bit-tasa minimoa" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "projectM-ko aurre-ezarpenak falta dira" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "Modeloa" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "Bildumako aldaketen segimendua egin" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "Mono erreprodukzioa" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "Hilabete" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "Aldarte" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "Aldarte-barraren itxura" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "Aldarte-barra" #: library/library.cpp:74 msgid "Most played" msgstr "Gehien erreproduzitutakoak" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "Muntatze-puntua" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "Muntatze-puntuak" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "Eraman behera" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "Eraman bildumara..." #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "Eraman gora" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "Musika" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Musika-bilduma" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "Mututu" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "Nire Last.fm bilduma" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "Nire Last.fm Mix irratia" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "Nire Last.fm-ko auzoa" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "Nire Last.fm-ko irrati gomendatua" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "Nire Mix irratia" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "Nire Musika" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "Nire auzoa" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "Nire irratia" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "Nire gomendioak" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Izena" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "Izendapen-aukerak" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "Banda estua (NB)" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "Auzokoak" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "Sarea" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "Sareko proxy-a" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "Sareko urruneko kontrola" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "Inoiz ez" #: library/library.cpp:67 msgid "Never played" msgstr "Inoiz ez erreproduzituak" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "Inoiz ez hasi erreproduzitzen" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "Karpeta berria" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "Erreprodukzio-zerrenda berria" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "Adimendun erreprodukzio-zerrenda berria" #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "Abesti berriak" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "Abesti berriak automatikoki gehituko dira." #: library/library.cpp:80 msgid "Newest tracks" msgstr "Pista berrienak" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "Hurrengoa" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Hurrengo pista" #: core/utilities.cpp:147 msgid "Next week" msgstr "Hurrengo astea" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "Analizatzailerik ez" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "Atzeko planoko irudirik ez" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "Bloke luzerik ez" #: playlist/playlistcontainer.cpp:366 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:145 msgid "No short blocks" msgstr "Bloke laburrik ez" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "Bat ere ez" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 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:155 msgid "Normal" msgstr "Arrunta" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "Bloke-mota normala" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "Ez dago eskuragarri erreprodukzio-zerrenda dinamikoa erabiltzean" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "Konektatu gabe" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "Ez dago eduki nahikorik" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "Zale nahikorik ez" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "Kide nahikorik ez" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "Auzokide nahikorik ez" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Ez dago instalatua" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "Saioa hasi gabe" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "Muntatu gabe - klik bikoitza egin muntatzeko" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "Jakinarazpen mota" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Jakinarazpenak" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Orain erreproduzitzen" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "OSD aurrebista" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "%1 nabigatzailean ireki" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "Ireki &audio CDa..." #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "OPML fitxategia ireki" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "OPML fitxategia ireki" #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "Ireki gailua" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "Ireki fitxategia..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "Google Drive-n iriki" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "Ireki erreprodukzio-zerrenda berrian" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Ireki..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "Eragiketak huts egin du" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "Bit-tasarako optimizatu" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "Kalitaterako optimizatu" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "Aukerak..." #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "Antolatu fitxategiak" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "Antolatu fitxategiak..." #: core/organise.cpp:65 msgid "Organising files" msgstr "Fitxategiak antolatzen" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "Jatorrizko etiketak" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Bestelako aukerak" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "Irteerako aukerak" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "Existitzen diren fitxategiak gainidatzi" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "Jabea" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "Jamendoko katalogoa analizatzen" #: ui/equalizer.cpp:124 msgid "Party" msgstr "Jaia" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "Pasahitza" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Pausarazi" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "Erreprodukzioa pausatu" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Pausatua" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "Albo-barra sinplea" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Erreproduzitu" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "Erreproduzitu artista edo etiketa" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "Erreproduzitu artistaren irratia..." #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "Erreprodukzio kopurua" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "Erreproduzitu irrati pertsonalizatua..." #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "Erreproduzitu pausatua badago, pausarazi erreproduzitzen ari bada" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "Erreproduzitu ez badago ezer aurretik erreproduzitzen" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "Erreproduzitu etiketaren irratia..." #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "Erreproduzitu erreprodukzio-zerrendako . pista" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "Erreproduzitu/Pausarazi" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Erreprodukzioa" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Erreproduzitzailearen aukerak" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "Erreprodukzio-zerrenda" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "Erreprodukzio-zerrenda amaituta" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "Erreprodukzio-zerrendaren aukerak" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "Erreprodukzio-zerrenda mota" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "Erreprodukzio-zerrendak" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "Mesedez, itxi nabigatzailea eta itzuli Clementine-ra." #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "Pluginaren egoera:" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "Podcast-ak" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Pop" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "Abesti ezagunak" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "Hilabeteko abesti ezagunak" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "Abesti ezagunak gaur" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "Laster-leihoaren iraupena" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "Ataka" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "Aurre-anplifikadorea" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "Hobespenak" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "Hobespenak..." #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "Hobetsitako album-azalen fitxategi-izenak (komaz bereizita)" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "Hobetsitako audio-formatua" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "Hobetsitako bit-tasa" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "Hobetsitako formatua" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "Audio-mota premium-a" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "Aurre-ezarpena:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "Sakatu erabiliko den tekla-konbinazioa" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "Sakatu edozein tekla" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Sakatu %1 egiteko erabiliko den tekla-konbinazioa..." #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "OSD itxurosoaren aukerak" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "Aurrebista" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "Aurrekoa" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "Aurreko pista" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Bertsio-informazioa erakutsi" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "Profila" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "Aurrerapena" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 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:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "Kalitatea" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "Gailua galdekatzen..." #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "Ilara-kudeatzailea" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "Aukeraturiko pistak ilaran jarri" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "Pista ilaran jarri" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "Irratia (ozentasun berdina pista denentzat)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "Irratiak" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "Euria" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "Ausazko bistaratzea" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "Oraingo kantari 0 izarretako balioa eman" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "Oraingo kantari izar 1eko balioa eman" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "Oraingo kantari 2 izarretako balioa eman" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "Oraingo kantari 3 izarretako balioa eman" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "Oraingo kantari 4 izarretako balioa eman" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "Oraingo kantari 5 izarretako balioa eman" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "Balioztatzea" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "Benetan utzi?" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "Freskatu" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "Katalogoa freskatu" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "Kateak freskatu" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "Lagun-zerrenda freskatu" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "Irrati-zerrenda freskatu" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "Jarioak freskatu" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Reggae" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "Wiimote-aren mugimendua gogoratu" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "Azken alditik gogoratu" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Kendu" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "Kendu ekintza" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "Abesti bikoiztuak kendu erreprodukzio-zerrendatik " #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "Kendu karpeta" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "Nire Musikatik kendu" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "Kendu gogokoenetatik" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "Kendu erreprodukzio-zerrendatik" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "Abestiak Nire Musikatik kentzen" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "Abestiak gogokoenetatik kentzen" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "Berrizendatu \"%1\" erreprodukzio-zerrenda" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "Berrizendatu Grooveshark-eko erreprodukzio-zerrenda" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "Berrizendatu erreprodukzio-zerrenda" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "Berrizendatu erreprodukzio-zerrenda..." #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "Zenbakitu berriro pistak ordena honetan..." #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Errepikatu" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "Errepikatu albuma" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "Errepikatu erreprodukzio-zerrenda" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "Errepikatu pista" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Ordeztu oraingo erreprodukzio-zerrenda" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "Ordeztu erreprodukzio-zerrenda" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "Zuriuneak azpimarrekin ordezten ditu" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "Errepikatze-irabazia" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "Birpopulatu" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "Berrezarri" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" msgstr "Berrezarri erreprodukzio kopurua" #: 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:206 msgid "Restrict to ASCII characters" msgstr "Mugatu ASCII karaktereetara" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "Grooveshark-eko Nire Musikako abestiak berreskuratzen" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "Grooveshark-eko abesti gogokoenak eskuratzen" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "Grooveshark-eko erreprodukzio-zerrendak eskuratzen" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "Clementine-ra itzuli" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "Exekutatu" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "SOCKS proxy-a" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "Kendu gailua arriskurik gabe" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "Kopiatu ondoren kendu gailua arriskurik gabe" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "Lagintze-tasa" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "Lagintze-tasa" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr ".mood fitxategiak musika-bilduman gorde" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "Gorde albumeko azala" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "Gorde azala diskoan..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "Gorde irudia" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "Gorde erreprodukzio-zerrenda" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "Gorde erreprodukzio-zerrenda..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "Gorde aurre-ezarpena" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "Gorde jario hau Internet fitxan" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "Pistak gordetzen" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "Lagintze-tasa eskalagarriaren profila (SSR)" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "Puntuazioa" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "Entzuten ditudan pistak partekatu" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "Bilatu" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "Bilatu Icecast irratiak" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "Bilatu Jamendo-n" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Bilatu Magnatune-n" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "Subsonic-en bilatu" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "Bilatu albumetako azalak" #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "Bilatu edozer" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "gpodder.net-en bilatu" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "iTunes-en bilatu" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "Bilaketa-modua" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "Bilaketa-aukerak" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "Bilaketaren emaitzak" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "Bilaketa terminoak" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "Grooveshark-en bilatzen" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "Bigarren maila" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "Atzera egin" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "Aurrera egin" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "Oraingo pistan mugitu posizio erlatibo baten arabera" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "Oraingo pistan mugitu posizio absolutu baten arabera" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "Hautatu dena" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "Ez hautatu ezer" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "Hautatu atzeko planoaren kolorea:" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "Hautatu atzeko planoko irudia" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "Hautatu bat-etortze posiblerik onena" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "Aukeratu aurreko planoaren kolorea:" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "Hautatu bistaratzeak" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "Hautatu bistaratzeak..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "Serie-zenbakia" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "Zerbitzariaren xehetasunak" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "Zerbitzua lineaz kanpo" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Ezarri %1 \"%2\"-(e)ra..." #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "Ezarri bolumena ehuneko -ra" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "Ezarri balioa aukeratutako pista guztiei..." #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Lasterbidea" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "%1-(r)en laster-tekla" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "%1-(r)en laster-tekla existitzen da jada" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Erakutsi" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "Erakutsi OSD" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "Erakutsi oraingo pistaren animazio distiratsua" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "Aldarte-barra erakutsi aurrerapen barran" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "Erakutsi mahaigaineko jakinarazpen jatorrizkoa" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Erakutsi jakinarazpena errepikapen/ausazko modua aldatzean" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "Erakutsi jakinarazpena bolumena aldatzean" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "Erakutsi laster-leihoa sistema-erretiluan" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "Erakutsi OSD itxurosoa" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "Erakutsi egoera-barraren gainean" #: ui/mainwindow.cpp:460 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:209 msgid "Show cover art in library" msgstr "Erakutsi azalak bilduman" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "Erakutsi zatitzaileak" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "Erakutsi tamaina osoan..." #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "Erakutsi fitxategi arakatzailean..." #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "Erakutsi hainbat artista" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "Aldarte-barra erakutsi" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "Erakutsi bakarrik errepikapenak" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "Erakutsi etiketa gabeak bakarrik" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "Bilaketaren iradokizunak erakutsi" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "Erakutsi \"oso gustuko\" eta \"galarazi\" botoiak" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "Erakutsi partekatu botoia leiho nagusian" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "Erakutsi erretilu-ikonoa" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "Erakutsi zein iturri dauden gaiturik/desgaiturik" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "Erakutsi/Ezkutatu" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Ausazkoa" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "Albumak nahastu" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "Dena nahastu" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "Erreprodukzio-zerrenda nahastu" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "Album honetako pistak nahastu" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "Saioa hasi" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "Saioa itxi" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "Saioa hasten..." #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "Antzeko artistak" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "Saltatu atzerantz erreprodukzio-zerrendan" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "Saltatu kontagailua" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "Saltatu aurrerantz erreprodukzio-zerrendan" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "Albumaren azal txikia" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "Albo-barra txikia" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "Erreprodukzio-zerrenda adimenduna" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "Erreprodukzio-zerrenda adimendunak" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "Abestiaren informazioa" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "Abes. infor." #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "Sonograma" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "Barkatu" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "Ordenatu generoaren arabera (alfabetikoki)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "Ordenatu generoaren arabera (ospearen arabera)" #: ../bin/src/ui_icecastfilterwidget.h:77 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" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "Iturria" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "Iturriak" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "Spotify-ko saio-hasiera errorea" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "Spotify plugina" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "Spotify plugina ez dago instalatuta" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "Estandarra" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "Izarduna(k)" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "Hasi oraingo erreprodukzio-zerrenda" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "Hasi transkodetzen" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 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:405 #, qt-format msgid "Starting %1" msgstr "%1 hasten" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "Hasten..." #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "Irratiak" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Gelditu" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "Ondoren gelditu" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "Gelditu pista honen ondoren" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Gelditu erreprodukzioa" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "Gelditu oraingo pistaren ondoren" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "Geldituta" #: core/song.cpp:341 msgid "Stream" msgstr "Jarioa" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "Streaming bazkidetza" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "Harpidetutako erreprodukzio-zerrenda" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "Harpidetzak" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "Eginda!" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "%1 ondo idatzi da" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "Etiketa gomendatuak" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "Laburpena" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "Oso altua (%1 fps)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "Oso altua (2048x2048)" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "Onartutako formatuak" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "Spotify-ko sarrera-ontzia sinkronizatzen" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "Spotify-ko erreprodukzio-zerrenda sinkronizatzen" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "Spotify-ko pista izardunak sinkronizatzen" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "Sistemako koloreak" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "Fitxak goian" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Etiketa" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "Etiketa eskuratzailea" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "Etiketa-irratia" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "Helburu bit-tasa" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "Testu-aukerak" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Eskerrak hauei" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "\"%1\" komandoa ezin izan da hasi." #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "Orain erreproduzitzen ari den kantaren albumaren azala" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "%1 direktorioa ez da baliagarria" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "'%1' erreprodukzio-zerrenda hutsik zegoen edo ezin izan da kargatu." #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "Adierazitako helbidea ez da irudi bat" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "Album honetan beste abesti batzuk daude" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "Arazo bat gertatu da gpodder.net-ekin komunikatzerakoan" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Arazo bat egon da Magnatune-ko metadatuak eskuratzean" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Arazo bat gertatu da iTunes dendako erantzuna aztertzerakoan" #: ui/organiseerrordialog.cpp:56 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:389 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:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 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:174 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:151 msgid "Third level" msgstr "Hirugarren maila" #: internet/jamendoservice.cpp:171 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/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "Album hau ez dago adierazitako formatuan" #: ../bin/src/ui_deviceproperties.h:381 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:375 msgid "This device supports the following file formats:" msgstr "Gailu honek hurrengo fitxategi-formatuak onartzen ditu:" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Gailu hau ez da era egokian ibiliko" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "Jario hau ordainpeko harpidedunentzat da bakarrik" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "Gailu mota hau ez da onartzen :%1" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "Denbora-muga" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Izenburua" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "Grooveshark irratia hasteko, aurretik beste Grooveshark abesti batzuk entzun behar dituzu" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "Gaur" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "Txandakatu OSD itxurosoa" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Txandakatu pantaila-osoa" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "Txandakatu ilara-egoera" #: ../bin/src/ui_mainwindow.h:718 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:143 msgid "Tomorrow" msgstr "Bihar" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "Redirekzio gehiegi" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "Pista gogokoenak" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "Transferituriko byte-ak guztira" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "Eginiko sareko eskaerak guztira" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Pista" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "Transkodetu musika" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "Transkodetzearen loga" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "Transkodeketa" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "%1 fitxategi %2 hari erabiliz transkodetzen" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "Transkodetze-aukerak" #: core/song.cpp:338 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "Turbina" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "Itzali" #: devices/giolister.cpp:161 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "URLa(k)" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "Banda ultra zabala (UWB)" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Ezin izan da %1 deskargatu (%2)" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Ezezaguna" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "Eduki-mota ezezaguna" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Errore ezezaguna" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "Ezarri gabeko azala" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "Harpidetza kendu" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "Hurrengo Kontzertuak" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "Grooveshark erreprodukzio-zerrenda eguneratu" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "Eguneratu podcast guztiak" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "Eguneratu bildumako aldatutako karpetak" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "Eguneratu bilduma Clementine abiaraztean" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "Podcast hau eguneratu" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "Eguneratzen" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "%1 eguneratzen" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "%1 eguneratzen..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Bilduma eguneratzen" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "Erabilera" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "Bildumaren artista etiketa erabili erabilgarri bada" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "Erabili Gnome-ren laster-teklak" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "Erabili errepikatze-irabaziaren metadatuak eskuragarri daudenean" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "Erabili Wii-aren urruneko kontrola" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "Erabili kolore-multzo pertsonalizatua" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "Erabili mezu pertsonalizatua jakinarazpenetan" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "Erabili autentifikazioa" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "Erabili bit-tasaren kudeaketa motorea" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "Erabili modu dinamikoa" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "Erabili jakinarazpenak Wii-ko urruneko kontrolaren egoera jakinarazteko" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "Erabili zarata karrakaketa behin-behinekoa" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "Erabili sistemako lehenetsia" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "Erabili sistemako kolore-multzo lehenetsia" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "Erabili sistemaren proxy-ezarpenak" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "Erabili bolumenaren normalizazioa" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "Erabilia" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "%1 erabiltzaileak ez du Grooveshark Anywhere konturik" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "Erabiltzaile-interfazea" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Erabiltzaile-izena" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "Abesti bat gehitzeko menua erabiltzeak ondorengoa egingo du..." #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "Bit-tasa aldakorra" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "Hainbat artista" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "%1 bertsioa" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "Ikusi" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "Bistaratze-modua" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "Bistaratzeak" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "Bistarate-ezarpenak" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "Ahotsaren jardueraren detekzioa" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "%1 bolumena" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "Webgunea" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "Aste" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "Clementine abiaraztean" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "Zerrenda hutsik dagoenean..." #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "Zergatik ez probatu..." #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "Banda zabala (WB)" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "%1 Wii urruneko kontrola: aktibaturik" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "%1 Wii urruneko kontrola: konektaturik" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "%1 Wii urruneko kontrola: bateria oso gutxi (% %2) " #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "%1 Wii urruneko kontrola: desaktibaturik" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "%1 Wii urruneko kontrola: deskonektaturik" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "%1 Wii urruneko kontrola: bateria gutxi (% %2)" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "Windows Media audio" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:530 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:2088 msgid "Would you like to run a full rescan right now?" msgstr "Berreskaneo osoa orain egitea nahi duzu?" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "Erabiltzailea edo pasahitza ez da zuzena." #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "Urtea" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "Urtea - Albuma" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "Urte" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "Atzo" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "Ondorengo albumak deskargatzekotan zaude" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "Ez duzu saioa hasi" #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "%1 modura hasi duzu saioa" #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "Saioa hasi duzu." #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "Bildumako abestiak antolaturik dauden era alda dezakezu." #: internet/digitallyimportedsettingspage.cpp:46 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/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "Beste musikarekin batera hondoko-jarioak entzun ditzakezu." #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "Pistak doan partekatu ditzakezu baina ordainpeko harpidedunek bakarrik entzun dezakete Last.fm irratia Clementine-tik." #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "Ez daukazu Grooveshark Anywhere konturik." #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Ez daukazu Spotify Premium konturik." #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "Ez duzu harpidetza aktiborik" #: internet/spotifyservice.cpp:170 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/spotifysettingspage.cpp:158 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:87 msgid "You love this track" msgstr "Pista hau oso gustukoa duzu" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "Lasterbide globalak Clementinen erabiltzeko, sistemaren hobespenetan \"laguntza-gailuen sarbidea baimendu\" behar da." #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "Hizkuntzaz aldatuz gero, Clementine berrabiarazi behar da." #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "Ezingo duzu Last.fm-ko irratirik entzun, ez baitzara Last.fm-ko harpideduna." #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Last.fm-ko egiaztagiriak ez ziren egokiak" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "Magnatuneko egiaztagiriak ez ziren egokiak" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "Bilduma hutsik dago!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "Irrati-jarioak" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "Partekatzeak: %1" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Zure sistema ez da bateragarria OpenGL-rekin, bistaratzeak erabilezinak daude." #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "Erabiltzaile-izena edo pasahitza ez zen zuzena." #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Zero" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "Gehitu %n abesti" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "ondoren" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "orain dela" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "eta" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "automatikoa" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "aurretik" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "tartean" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "handienak aurretik" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "honakoa du" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "desgaituta" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "%1 diskoa" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "ez du honakoa" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "honakoarekin amaitzen da" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "berdin" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "gpodder.net" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "gpodder.net direktorioa" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "handiagoa baino" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "azkenean" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "gutxiago baino" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "luzeenak arinago" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "%n abesti mugitu" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "berrienak arinago" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "ez berdin" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "azkenean ez" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "honetan ez" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "zaharrenak arinago" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "honen barruan" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "aukerak" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "enter sakatu" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "%n abesti ezabatu" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "laburrenak arinago" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "abestiak nahastu" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "txikienak arinago" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "abestiak ordenatu" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "honekin hasten da" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "gelditu" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "%1 pista" clementine-1.2.0+dfsg/src/translations/fa.po000066400000000000000000005224141223327513400210240ustar00rootroot00000000000000# 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 # saeedzeyghami , 2013 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:08+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Persian (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr " روز" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " ک.ب.د.ث" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " م.ث" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " پوینت" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " ثانیه" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " آهنگ‌ها" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 آلبوم" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 روز" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 روز پیش" #: podcasts/gpoddersync.cpp:79 #, 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:413 #, qt-format msgid "%1 selected of" msgstr "%1 گزیده از" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 آهنگ" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 آهنگ" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 آهنگ پیدا شد" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 آهنگ پیدا شد (نمایش %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 ترک" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 ترابرده شد" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: پیمانه‌ی ویموتدو" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n ناکام ماند" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n پایان یافت" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "&سفارشی‌" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "ا&فزونه‌ها" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "&راهنما" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "&پنهاندن %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "&پنهاندن..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&چپ‌" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "آ&هنگ" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&هیچ‌کدام‌" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "&لیست‌پخش" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&برونرفتن" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "سبک &تکرار" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&راست‌" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "سبک &درهم" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "&کشیدن ستون‌ها برای پرکردن پنجره" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "&ابزارها‌" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(متفاوت میان چند آهنگ)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "...و دیگر گسترش‌دهنده‌های آماروک" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "0px" #: core/utilities.cpp:108 msgid "1 day" msgstr "۱ روز" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "۱ ترک" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "٪۴۰" #: library/library.cpp:60 msgid "50 random tracks" msgstr "۵۰ ترک تصادفی" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "هم‌اکنون به اکانت برتر پیشرفت بده" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "نیاز به اکانت «گرووشارک همه‌جا» دارد." #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "نیاز به اکانت برتر اسپاتیفای دارد." #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "یک مشتری می‌تواند بپیوندد تنها زمانی که کد درست وارد شود." #: smartplaylists/wizard.cpp:78 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:153 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "آهنگ‌هایی به این لیست‌پخش افزوده می‌شوند که این ویژگیها را داشته باشند." #: smartplaylists/searchterm.cpp:297 msgid "A-Z" msgstr "الف-ی" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "همه‌ی افتخار برای HYPNOTOAD" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "درباره‌ی %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "درباره‌ی کلمنتاین..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "درباره‌ی کیو‌ت..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "ویژگی‌های اکانت" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "ویژگی‌های اکانت (برتر)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "کنش" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "پویا/ناپویا سازی وای‌ریموت" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "افزودن پادکست" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "افزودن جریان" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "افزودن خط نو اگر توسط آگاه‌ساز پشتیبانی شود" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "افزودن کنش" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "افزودن جریان دیگر..." #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "افزودن پوشه..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "افزودن پرونده" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "افزودن پرونده..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "افزودن پرونده‌ها به تراکد" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "افزودن پوشه" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "افزودن پوشه..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "افزودن پوشه‌ی نو..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "افزودن پادکست" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "افزودن پادکست..." #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "افزودن عبارت جستجو" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "افزودن برچسب آلبوم آهنگ" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "افزودن برچسب هنرمند آلبوم آهنگ" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "افزودن برچسب هنرمند آهنگ" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "افزودن نمره خودکار آهنگ" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "افزودن برچسب تنظیم‌کننده‌ی آهنگ" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "افزودن برچسب دیسک آهنگ" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "افزودن نام‌پرونده‌ی آهنگ" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "افزودن برچسب ژانر آهنگ" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "افزودن برچسب زمان آهنگ" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "افزودن شماره‌ی پخش آهنگ" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "افزودن پایه آهنگ" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "افزودن شماره‌ی پرش آهنگ" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "افزودن برچسب عنوان آهنگ" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "افزودن برچسب ترک آهنگ" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "افزودن برچسب سال آهنگ" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "افزودن جریان..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "افزودن به دلخواه گرووشارک" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "افزودن به لیست‌پخش‌های گرووشارک" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "افزودن به لیست‌پخش دیگر" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "افزودن به لیست‌پخش" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "افزودن به صف" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "افزودن کنش ویموتدو" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "افزودن..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "افزوده شده در ماه جاری" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "افزوده شده در هفته‌ی جاری" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "افزوده شده در سال جاری" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "افزوده شده در امروز" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "افزوده شده در سه ماه گذشته" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "افزودن آهنگ به آهنگ‌های من" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "اضافه کردن آهنگ به پسندیده‌ها" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "دسته‌بندی پیشرفته..." #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "پس از" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "پس از کپی‌کردن..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "آلبوم" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "آلبوم (بلندی صدای ایده‌آل برای همه‌ی ترک‌ها)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "هنرمند آلبوم" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "جلد آلبوم" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "دانستنی‌های آلبوم در جامندو..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "آلبوم‌های با جلد" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "آلبوم‌های بدون جلد" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "همه‌ی پرونده‌ها(*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "همه‌ی افتخار برای Hypnotoad!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "همه‌ی آلبوم‌ها" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "همه‌ی هنرمندان" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "همه‌ی پرونده‌ها (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "همه‌ی لیست‌پخش‌ها (%1)" #: ui/about.cpp:74 msgid "All the translators" msgstr "همه‌ی برگردانان" #: library/library.cpp:84 msgid "All tracks" msgstr "همه‌ی ترک‌ها" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "کدگذاری میانه/کنار" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "در کنار اصلی‌ها" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "پنجره اصلی را همواره بپنهان" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "پنجره اصلی را همواره بنمایان" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "همواره آغاز به پخش می‌کند" #: internet/spotifyblobdownloader.cpp:60 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "کلمنتاین به افزونه‌ی دیگری برای استفاده‌ی اسپاتیفای نیاز دارد. آیا می‌خواهید این افزونه را بارگیری و نصب نمایید؟" #: devices/gpodloader.cpp:61 msgid "An error occurred loading the iTunes database" msgstr "مشکلی هنگام فراخوانی پایگاه داده‌ی آی‌تیون پیش آمد" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "مشکلی در نوشتن ابرداده در '%1' پیش آمد" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "خطای ناشناخته‌ای پدید آمد." #: ui/about.cpp:78 msgid "And:" msgstr "و:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "خشمگین" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "شمایل" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "پیوست پرونده/نشانی اینترنتی به لیست‌پخش" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "پیوست به لیست‌پخش جاری" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "پیوست به لیست‌پخش" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "فشرده‌سازی برای چیده نشدن" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "آیا مطمئنید که می‌خواهید پیش‌نشانده‌ی «%1» را پاک کنید؟" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "آیا مطمئن هستید که می‌خواهید این لیست‌پخش را پاک کنید." #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "آیا مطمئنید که می‌خواهید آماره‌ی این آهنگ را پاک کنید؟" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "هنرمند" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "اطلاعات هنرمند" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "رادیوی هنرمند" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "برچسب هنرمند" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "حرف اول هنرمند" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "گونه‌ی آوا" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "ناکامی در شناسایی" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "نویسنده" #: ui/about.cpp:65 msgid "Authors" msgstr "نویسندگان‌" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "خودکار" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "به‌روز رسانی خودکار" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "رسته‌های تنها را خودکار در درخت کتابخانه باز کن" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "در دسترس" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "میانگین ضرباهنگ" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "میانگین اندازه‌ی فرتور" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "پادکست بی‌بی‌سی" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "ض.د.د" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "جریان پس‌زمینه" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "رنگ پس‌زمینه" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "فرتور پس‌زمینه" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "تاری پس‌زمینه" #: core/database.cpp:734 msgid "Backing up database" msgstr "پشتیبان‌گیری از پایگاه داده" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "تحریم" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "آنالیزور میله‌ای" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "آبی ابتدایی" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "گونه‌ی ابتدایی آوا" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "رفتار" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "بهترین" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "بیوگرافی از %1" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "ضرب آهنگ" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "ضرباهنگ" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "آنالیزور بلوکی" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "گونه‌ی بلوک" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "اندازه تیرگی" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "بدنه" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "آنالیزور نرده‌ای" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "باکس" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "مرور..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "میان‌گیری" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "اما این سرچشمه‌ها ناپویا هستند:" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "دکمه‌ها" #: core/song.cpp:339 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "پشتیبانی از سیاهه" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "کنسل" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "تغییر جلد هنری" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "تغییر اندازه‌ی قلم..." #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "تغییر سبک تکرار" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "تغییر میانبر..." #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "تغییر سبک درهم" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "تغییر زبان" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "تغییر ترجیح‌های بازپخش مونو برای آهنگ‌های پسین کاراست" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "بررسی برای داستان‌های تازه" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "بررسی به‌روز رسانی..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "گزینش نام برای لیست‌پخش هوشمند" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "گزینش خودکار" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "گزینش رنگ..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "گزینش قلم..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "گزینش از لیست" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "گزینش روش مرتب‌سازی لیست و تعداد آهنگهای آن" #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "گزیدن پوشه‌ی بارگیری پادکست" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "پایگاه اینترنتی را برگزینید که می‌خواهید کلمنتاین متن آهنگ‌ها را بارگیری کند" #: ui/equalizer.cpp:115 msgid "Classical" msgstr "کلاسیک" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "پالایش" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "پاک کن" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "پاک کردن لیست‌پخش" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "کلمنتاین" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "خطای کلمنتاین" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "پرتقالی کلمنتاین" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "فرتورسازی کلمنتاین" #: ../bin/src/ui_deviceproperties.h:376 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "کلمنتاین می‌تواند خودکار، آهنگ‌هایی را که روی این دستگاه ذخیره می‌کنید به سبکی پخش‌پذیر در دستگاه تبدیل کند." #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "کلمنتاین می‌تواند آهنگ‌های را پخش کند که شما در باکس بارگذاشته‌اید" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "کلمنتاین می‌تواند آهنگ‌های را پخش کند که شما در دراپ‌باکس بارگذاشته‌اید" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "کلمنتاین می‌تواند آهنگ‌های را پخش کند که شما در درایو گوگل بارگذاشته‌اید" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "کلمنتاین می‌تواند آهنگ‌های را پخش کند که شما در ابونتو وان بارگذاشته‌اید" #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "کلمنتاین می‌تواند پیامی در صورت تغییر ترک بنمایاند." #: ../bin/src/ui_podcastsettingspage.h:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "کلمنتاین می‌تواند لیست هموندی‌های شما را با رایانه‌های دیگر و کاربری‌های پادکست همگام کند. یک اکانت بسازید." #: visualisations/projectmvisualisation.cpp:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "کلمنتاین نمی‌تواند هیچ فرتورسازی projectM را بارگذاری کند. درستی نصب کلمنتاین را بررسی کنید." #: internet/lastfmsettingspage.cpp:110 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 "به واسطه‌ی مشکل در ارتباط، کلمنتاین نمی‌تواند وضعیت هموندی شما را بیاورد. ترک‌های پخش‌شده، ذخیره، و در آینده به لست‌‌اف‌ام فرستاده می‌شوند." #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "نمایشگر فرتور کلمنتاین" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "کلمنتاین نتوانست دستاوردهای این پرونده را بیابد" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "پوشه‌ای که کلمنتاین در آن به دنبال آهنگ می‌گردد:" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "برای افزودن آهنگ‌ها، اینجا را بفشارید" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "برای سویچ بین زمان رفته و زمان باقیمانده، اینجا را کلیک کنید" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "بستن لیست‌پخش" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "بستن فرتورسازی" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "بستن این پنجره، بارگیری را کنسل می‌کند." #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "بستن این پنجره، جستجوی جلد آلبوم‌ها را کنسل می‌کند." #: ui/equalizer.cpp:116 msgid "Club" msgstr "باشگاه" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Colors" msgstr "رنگ" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "لیست مجزا بوسیله‌ی ویرگول از کلاس:طبقه، طبقه ۰-۳ است" #: playlist/playlist.cpp:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "توضیح" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "تکمیل خودکار برچسب‌ها" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "تکمیل خودکار برچسب‌ها..." #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "تنظیم‌کننده" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "پیکربندی %1..." #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "پیکربندی گرووشارک..." #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "پیکربندی لست‌‌اف‌ام..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "پیکربندی مگناتیون..." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "پیکربندی میان‌برها" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "پیکربندی اسپاتیفای..." #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "پیکربندی ساب‌سونیک..." #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "پیکربندی جستجوی سراسری..." #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "پیکربندی کتابخانه..." #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "پیکربندی پادکست..." #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "پیکربندی..." #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "کنترل Wii را با استفاده از کنش پویا/ناپویا وصل کنید" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "اتصال دستگاه" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "اتصال به اسپاتیفای" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "پیشانه" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "ضرباهنگ ثابت" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "برگرداندن تمام آهنگ‌ها" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "برگردان تمام آهنگ‌هایی که دستگاه نمی‌تواند پخش کند" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "کپی به کلیپ‌بورد" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "کپی‌کردن در دستگاه..." #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "کپی‌کردن در کتابخانه..." #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "کپی‌رایت" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "نمی‌توانم به ساب‌سونیک بپیوندم، نشانی سرور را بررسی کنید. نمونه: http://localhost:4040/" #: transcoder/transcoder.cpp:64 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "نمی‌توانم عنصر «%1» از GStream را بسازم - مطمئن شوید که همه‌ی افزونه‌های مورد نیاز GStream را نصب کرده‌اید" #: transcoder/transcoder.cpp:432 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "نمی‌توانم موکسر را برای %1 پیدا کنم، بررسی کنید که افزونه‌ی مناسب GStream را نصب کرده‌اید" #: transcoder/transcoder.cpp:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "نمی‌توانم رمزگذاری برای %1 پیدا کنم، بررسی کنید که افزونه‌ی مناسب GStream را نصب کرده‌اید" #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "نمی‌توانم ایستگاه رادیویی لست‌‌اف‌ام را بارگذاری کنم" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "نمی‌توانم پرونده‌ی بروندادی %1 را باز کنم" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "مدیریت جلد" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "جلد هنری را از فرتور نشانده شده بردار" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "جلد هنری از %1 خودکار فراخوانی شد" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "جلد هنری دستی بازنشانده شد" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "جلد هنری نشانده نشد" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "جلد هنری از %1 نشانده شد" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "جلدها از %1" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "افزودن لیست‌پخش تازه‌ی گرووشارک" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "پژمردن آهنگ زمانی که ترک‌ها خودکار تغییر می‌کنند" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "پژمردن آهنگ زمانی که ترک‌ها دستی تغییر می‌کنند" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "سفارشی" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "فرتور دلخواه:" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "تنظیم پیام سفارشی" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "رادیوی سفارشی" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "سفارشی..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "مسیر DBus" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "رقص" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "تاریخ ساخت" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "تاریخ بازسازی" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "روز" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "پیش‌&فرض" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "کاهش صدا ۴٪" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "صدا را درصد کاهش بده" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "کاهش صدا" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "فرتور پس‌زمینه‌ی پیشفرض" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "پیش‌نشان‌ها" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "تأخیر بین فرتورسازیها" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "پاک‌کردن" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "پاک‌کردن لیست پخش گرووشارک" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "پاک‌کردن دانستنی‌های بارگیری شده" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "پاک کردن پرونده‌ها" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "پاک کردن از دستگاه..." #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "پاک کردن از دیسک..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "پاک‌کردن داستانهای پخش‌شده" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "پاک کردن پیش‌نشانده" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "پاک کردن لیست‌پخش هوشمند" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "پاک کردن اصل پرونده‌ها" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "پاک کردن پرونده‌ها" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "صف‌بندی دوباره‌ی ترک‌های برگزیده" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "صف‌بندی دوباره‌ی ترک" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "مقصد" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "جزئیات..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "دستگاه" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "ویژگی‌های دستگاه" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "نام دستگاه" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "ویژگی‌های دستگاه..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "‌دستگاه‌ها" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "منظورت این بود که" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "واردات دیجیتالی" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "گذرواژه‌های وارداتی دیجیتالی" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "نام‌های کاربری وارداتی دیجیتالی" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "ارتباط مستقیم اینترنت" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "فهرست راهنما" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "مدت ناپویا‌سازی" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "ناپویا کردن ساخت میله‌ی مود" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "ناپویا شد" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "دیسک" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "ارسال ناپیوسته" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "گزینه‌های نمایش" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "نمایش نمایش پرده‌ای" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "انجام وارسی دوباره‌ی کامل کتابخانه" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "هیچ آهنگی را تبدیل نکن" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "تکرار نکن" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "در هنرمندان گوناگون نشان نده" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "پخش مرتب" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "نایست!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "برای گشودن دو بار کلیک کنید" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "دو بار کلیک یک آهنگ باعث..." #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "بارگیری %n داستان" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "بارگیری پوشه" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "بارگیری داستان‌های تا" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "بارگیری هموندی" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "بارگیری خودکار داستان‌های تازه" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "صف بارگیری" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "بارگیری این آلبوم" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "بارگیری این آلبوم..." #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "بارگیری این داستان" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "بارگیری..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "درحال بارگیری (%1%)..." #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "بارگیری پوشه‌ی آیس‌کست" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "بارگیری کاتالوگ جامندو" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "بارگیری کاتالوگ مگناتیون" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "بارگیری افزونه‌ی اسپاتیفای" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "بارگیری ابرداده" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "برای مکان‌گذاری دوباره بکشید" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "دراپ‌باکس" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "سبک دینامیک پویاست" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "درهم‌ریختن تصادفی دینامیک" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "ویرایش لیست‌پخش هوشمند..." #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "ویرایش برچسب \"%1\"..." #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "ویرایش برچسب..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "ویرایش برچسب‌ها" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "ویرایش دانستنی‌های ترک" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "ویرایش دانستنی‌های ترک..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "ویرایش دانستنی‌های ترک‌ها..." #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "ویرایش...." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "پویا‌سازی پشتیبانی کنترل Wii" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "پویاسازی برابرساز" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "پویاسازی میان‌برها تنها زمانی که کلمنتاین در کانون است" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "در پایین سرچشمه‌ها را پویا کنید تا در جستجو منظور شوند. دستاوردها به این ترتیب نمایانده می‌شوند." #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "پویا/ناپویاسازی واکشی لست‌‌اف‌ام" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "پیچیدگی رمزینه" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "کیفیت موتور رمزینه" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "سبک رمزینه" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "یک نشانی اینترنتی وارد کنید" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "برای بارگیری جلد از اینترنت، یک نشانی اینترنتی وارد کنید:" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "نامی برای این لیست‌پخش وارد کنید" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "یک هنرمند یا برچسبوارد کنید تا به رادیوی لست‌‌اف‌ام گوش کنید." #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "برای یافتن آهنگ در رایانه و اینترنت، عبارت جستجو را در بالا وارد کنید" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "برای یافتن پادکست در فروشگاه آی‌تیون، عبارت جستجو را در پایین وارد کنید" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "برای یافتن پادکست در gpodder.net، عبارت جستجو را در پایین وارد کنید" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "واژه‌های جستجو را در اینجا وارد کنید" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "نشانی اینترنتی یک ایستگاه رادیویی اینترنتی را وارد کنید:" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "نام پوشه را وارد کنید" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "همه‌ی مجموعه" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "خطا" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "خطا در اتصال به دستگاه MTP" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "خطا در کپی کردن آهنگ‌ها" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "خطا در پاک کردن آهنگ‌ها" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "خطا در بارگیری افزونه‌ی Spotify" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "خطا در فراخوانی %1" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "خطا در بارگیری لیست پخش di.fm" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "خطای پردازش %1:%2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "خطا هنگام فراخوانی سی‌دی آوایی" #: library/library.cpp:63 msgid "Ever played" msgstr "همواره پخش‌شده" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "هر ۱۰ دقیقه" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "هر ۱۲ دقیقه" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "هر ۲ ساعت" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "هر ۲۰ دقیقه" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "هر ۳۰ دقیقه" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "هر ۶ ساعت" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "هر ساعت" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "به جز بین ترک‌ها یک آلبوم یا یک سیاهه" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "گسترش" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "در %1 انقضا می‌یابد" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "پژمردن هنگام ایست یک ترک" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "پژمردن" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "زمان پژمردن" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "ناتوان در واکشی پوشه" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "ناتوان در واکشی پادکست" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "ناتوان در بارگذاری پادکست" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "ناتوان در موشکافی XML برای خوراک RSS" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "تند" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "دلخواه" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "ترک‌های برگزیده" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "واکشی جلدهای ناموجود" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "واکشی خودکار" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "واکشی کامل شد" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "واکشی کتابخانه‌ی ساب‌سونیک" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "خطای واکشی جلد" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "پسوند پرونده" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "گونه‌ی پرونده" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "نام پرونده" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "نام پرونده (بدون مسیر)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "اندازه پرونده" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "گونه‌ی پرونده" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "نام‌پرونده" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "پرونده‌ها" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "پرونده‌های برای تراکد" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "یافتن آهنگ‌های در کتابخانه که با معیارهای شما همخوانی دارند." #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "انگشت‌نگاری آهنگ" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "پایان" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "طبقه‌ی اول" #: core/song.cpp:328 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "اندازه‌ی قلم" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "به دلایل اجازه‌نامه، پشتیبانی اسپاتیفای در افزونه‌ای جداگانه است." #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "واداشتن به رمزینه‌ی مونو" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "فراموشیدن دستگاه" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "فرم" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "قالب" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "آهنگ فریم" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "فریم در هر بافر" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "دوستان" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "منجمد" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "باس کامل" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "باس کامل + لرزش" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "لرزش کامل" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "موتور آوای GStreamer" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "عمومی" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "تنظیم‌های عمومی" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "ژانر" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "دریافت یک نشانی اینترنتی برای اشتراک این لیست‌پخش گرووشارک" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "دریافت یک نشانی اینترنتی برای اشتراک این آهنگ گرووشارک" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "دریافت آهنگ‌های مردمی گرووشارک" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "دریافت کانال" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "گرفتن جریان‌ها" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "نامی به آن دهید:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "برو" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "برو به نوار پسین لیست‌پخش" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "برو به نوار پیشین لیست‌پخش" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "درایو گوگل" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "%1 از %2 جلدها دریافت شد (%3 ناموفق)" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "آهنگ‌های ناموجود لیست‌پخش‌های من را خاکستری کن" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "گرووشارک" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "خطا در ورود به گرووشارک" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "نشانی اینترنتی لیست‌پخش گرووشارک" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "رادیوی گرووشارک" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "نشانی اینترنتی آهنگ‌های گرووشارک" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "کتابخانه را گروه‌بندی کن برپایه‌ی..." #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "گروه‌بندی برپایه‌ی" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "آلبوم" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "هنرمند" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "هنرمند/آلبوم" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "هنرمند/سال - آلبوم" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "ژانر/آلبوم" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "ژانر/هنرمند/آلبوم" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "برگه‌ی اچ‌تی‌ام‌ال بدون هیچ‌گونه خوراک آراس‌اس است" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "پراکسی HTTP" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "خوشحال" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "دانستنی‌های سخت‌افزاری" #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "اطلاعات سخت‌افزاری تنها در صورتی در دسترس است که دستگاه متصل باشد." #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "زیاد" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "زیاد (%1 ف.د.ث)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "زیاد (1024x1024)" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "ساعت" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "اکانت مگناتیون ندارم" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "آیکون" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "آیکون در بالا" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "تشخیص آهنگ" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "اگر ادامه دهید، این دستگاه آهسته کار خواهد کرد و آهنگهای کپی شده روی آن ممکن است پخش نشوند." #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "اگر نشانی اینترنتی یک پادکست را می‌دانید، آن را در پایین وارد کنید و «برو» را فشار دهید." #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "صرف نظر از «The» در نام هنرمندان" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "تصاویر (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "در %1 روز " #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "در %1 هفته" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "در سبک دینامیک پس از پایان هر آهنگ، ترک‌های تازه برگزیده و به لیست‌پخش افزوده می‌شوند." #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "صندوق ورودی" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "آلبوم هنری را در آگاه‌ساز قرار بده" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "دربر داشتن همه‌ی آهنگها" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "ویرایش پروتکل REST ناسازگار است. مشتری باید پیشرفت کند. " #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "ویرایش پروتکل REST ناسازگار است. سرور باید پیشرفت کند." #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "بلندی صدا را ٪۴ بیفزا" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "افزایش بلندی درصد" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "افزایش صدا" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "نمایه‌گذاری %1" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "اطلاعات" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "قرار دادن..." #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "نصب شد" #: core/database.cpp:673 msgid "Integrity check" msgstr "بررسی درستی" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "اینترنت" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "فراهم‌کنندگان اینترنت" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "کلید API نامعتبر" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "قالب نامعتبر" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "روش نامعتبر" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "پارامترهای نامعتبر" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "منابع مشخص‌شده نامعتبرند" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "سرویس نامعتبر" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "کلید جلسه‌ی نامعتبر" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "شناسه و/یا گذرواژه‌ی نادرست" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "جامندو" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "ترک‌های بیشتر شنیده شده‌ی جامندو" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "ترک‌های برتر جامندو" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "ترک‌های برتر ماه جامندو" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "ترک‌های برتر هفته‌ی جامندو" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "پایگاه داده‌ی جامندو" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "پرش به ترک در حال پخش" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "دکمه‌ها را %1 ثانیه نگه دار..." #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "دکمه‌ها را %1 ثانیه نگه دار..." #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "پخش را در پس‌زمینه ادامه بده زمانی که پنجره بسته می‌شود" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "اصل پرونده‌ها را نگه دار" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "توله گربه‌ها" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "زبان" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "لپتاپ/هدفون" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "سالن بزرگ" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "جلد آلبوم بزرگ" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "میله‌ی کناری بزرگ" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "پخش پایانی" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "لست‌‌اف‌ام" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "رادیوی سفارشی لست‌‌اف‌ام: %1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "کتابخانه لست‌‌اف‌ام- %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "رادیوی میکس لست‌‌اف‌ام- %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "رادیوی همسایه لست‌‌اف‌ام- %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "ایستگاه رادیویی لست‌‌اف‌ام- %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "هنرمندهایی مانند %1 در لست‌‌اف‌ام" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "برچسب رادیویی لست‌‌اف‌ام: %1" #: internet/lastfmservice.cpp:437 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "لست‌‌اف‌ام در حال پخش است، پس از چند دقیقه دوباره تلاش کنید" #: ../bin/src/ui_lastfmsettingspage.h:154 msgid "Last.fm password" msgstr "گذرواژه‌ی لست‌‌اف‌ام" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "لست‌‌اف‌ام شمارش پخش‌شده‌ها" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "برچسب لست‌‌اف‌ام" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "شناسه‌ی لست‌‌اف‌ام" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "ویکی لست‌‌اف‌ام" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "ترک‌های کمتر برگزیده" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "برای پیش‌نشان، تهی رها کنید. مثال: \"/dev/dsp\"، \"front\"، و ..." #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "طول" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "کتابخانه" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "گروه‌بندی پیشرفته‌ی کتابخانه" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "آگاه‌سازی پویش دوباره‌ی کتابخانه" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "جستجوی کتابخانه" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "محدودیت‌ها" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "شنیدن آهنگ‌های گرووشارک برپایه‌ی چیزهایی که پیش از این شنیده‌اید" #: ui/equalizer.cpp:123 msgid "Live" msgstr "زنده" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "بارگیری" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "بارگیری جلدها از اینترنت" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "بارگیری جلدها از اینترنت..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "بارگیری جلد از دیسک" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "بارگیری جلدها از دیسک" #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "بارگیری لیست‌پخش" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "بارگیری لیست‌پخش..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "بارگیری رادیوی لست‌‌اف‌ام" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "بارگیری دستگاه MTP" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "بارگیری پایگاه داده‌ی آی‌پاد" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "بارگیری لیست‌پخش هوشمند" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "بارگیری آهنگ‌ها" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "بارگیری جریان" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "بارگیری ترک" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "بارگیری اطلاعات ترک‌ها" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "در حال بارگیری..." #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "بارگیری پرونده‌ها/نشانی‌ها، جانشانی دوباره‌ی لیست‌پخش جاری" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "ورود به سیستم" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "ورود شکست خورد" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "نمایه‌ی پیش‌بینی بلندمدت" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "عشق" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "پایین (%1 ف.د.ث)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "پایین (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "نمایه‌ی با پیچیدگی کم (LC)" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "متن آهنگ" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "متن آهنگ از %1" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "مگناتیون" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "بارگیری مگناتیون" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "بارگیری مگناتیون پایان یافت" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "نمایه‌ی اصلی (MAIN)" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "همین‌جوریش کن!" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "لیست‌پخش را بیرون‌خط در دسترس بگذار" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "پاسخ ناهنجار" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "پیکربندی دستی پراکسی" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "دستی" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "تولید‌کننده" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "نشان‌گذاری شنیده شده" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "نشان‌گذاری تازه" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "همخوانی همه‌ی واژه‌های جستجو (و)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "همخوانی یک یا بیشتر از یک واژه‌ی جستجو (یا)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "بیشترین ضرباهنگ" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "میانه (%1 ف.د.ث)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "میانه (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "گونه‌ی هموندی" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "کمترین ضرباهنگ" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "نبود پیش‌نشان‌های projectM" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "مدل" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "رسد کتابخانه برای تغییرات" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "پخش مونو" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "ماه" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "مود" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "شمایل میله‌ی مود" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "میله‌های مود" #: library/library.cpp:74 msgid "Most played" msgstr "بیشترین پخش‌شده‌ها" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "سوارگاه" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "سوارگاه‌ها" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "پایین بردن" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "جابه‌جایی به کتابخانه..." #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "بالا بردن" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "آهنگ" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "کتابخانه‌ی آهنگ" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "بی‌صدا" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "کتابخانه‌ی لست‌‌اف‌ام من" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "رادیوی میکس لست‌‌اف‌ام من" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "همسایه‌ی لست‌‌اف‌ام من" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "رادیوهای پیشنهادی لست‌‌اف‌ام من" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "رادیوی میکس من" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "آهنگ‌های من" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "همسایه‌ی من" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "ایستگاه رادیویی من" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "پیشنهادهای من" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "نام" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "گزینه‌های نام‌گذاری" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "نوار باریک (NB)" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "همسایه‌ها" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "شبکه" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "پیشکار پراکسی" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "کنترل از راه دور شبکه " #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "هرگز" #: library/library.cpp:67 msgid "Never played" msgstr "هرگز پخش‌نشده" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "هرگز آغاز به پخش نمی‌کند" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "پوشه‌ی تازه" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "لیست‌پخش تازه" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "لیست‌پخش هوشمند تازه..." #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "آهنگ‌‌های تازه" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "ترک‌های تازه خودکار اضافه می‌شوند." #: library/library.cpp:80 msgid "Newest tracks" msgstr "تازه‌ترین ترک‌ها" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "پسین" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "ترک پسین" #: core/utilities.cpp:147 msgid "Next week" msgstr "هفته‌ی پسین" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "بدون آنالیزور" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "بدون فرتور پس‌زمینه" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "بدون بلوک‌های بلند" #: playlist/playlistcontainer.cpp:366 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "همخوانیی پیدا نشد. جعبه‌های جستجو را پاک کنید تا همه‌ی لیست‌پخش‌ها دوباره نمایش داده شوند." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "بدون بلوک‌های کوتاه" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "هیچ‌کدام" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "هیچ‌کدام از آهنگ‌های برگزیده مناسب کپی کردن در دستگاه نیستند" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "نرمال" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "گونه‌ی بلوک نرمال" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "مهیا نیست زمانی که از یک لیست‌پخش دینامیک استفاده می‌کنید" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "متصل نیست" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "بدون محتوای کافی" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "بدون هوادار کافی" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "بدون عضو کافی" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "بدون همسایه‌ی کافی" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "نصب نشده" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "وارد نشده‌اید" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "سوار نشده است - دو بار فشار دهید تا سوار شود" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "گونه‌ی آگاه‌سازی‌ها" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "آگاه‌سازی‌ها" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "در حال پخش" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "پیش‌مشاهده‌ی OSD" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "تاری" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "گشودن %1 در مرورگر" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "گشودن &سی‌دی آوایی..." #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "گشودن پرونده‌ی اوپی‌ام‌ال" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "گشودن پرونده‌ی اوپی‌ام‌ال..." #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "گشودن دستگاه" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "گشودن پرونده..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "گشوده در درایو گوگل" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "گشودن در لیست‌پخش تازه شود" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "گشودن..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "شکست عملیات" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "بهینه‌سازی ضرباهنگ" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "بهینه‌سازی کیفیت" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "گزینه‌ها..." #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "سازماندهی پرونده‌ها" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "سازماندهی پرونده‌ها..." #: core/organise.cpp:65 msgid "Organising files" msgstr "پرونده‌های سازماندهی شونده" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "برچسب‌های اصلی" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "گزینه‌های دیگر" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "گزینه‌های بروندادی" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "رونویسی پرونده‌های موجود" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "دارنده" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "بررسی کاتالوگ جامندو" #: ui/equalizer.cpp:124 msgid "Party" msgstr "مهمانی" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "گذرواژه" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "درنگ" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "درنگ پخش" #: widgets/osd.cpp:156 msgid "Paused" msgstr "درنگ‌شده" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "میله‌کنار ساده" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "پخش" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "پخش هنرمند یا برچسب" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "پخش رادیوی هنرمند..." #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "شمار پخش" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "پخش رادیوی دلخواه..." #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "پخش در صورت ایست، درنگ در صورت پخش" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "آغاز به پخش می‌کند اگر چیزی در حال پخش نیست" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "پخش رادیوی برچسب..." #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "ترک -ام در لیست‌پخش را پخش کن" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "پخش/درنگ" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "بازپخش" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "گزینه‌های پخش‌کننده" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "لیست‌پخش" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "لیست‌پخش پایان یافت" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "گزینه‌های لیست‌پخش" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "سبک لیست‌پخش" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "لیست‌های پخش" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "خواهشمندم مرورگر را ببندید و به کلمنتاین بازگردید." #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "وضعیت افزونه" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "پادکست" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "پاپ" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "آهنگ‌های مردمی" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "ترانه‌های محبوب ماه" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "ترانه‌های محبوب امروز" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "پنجرک" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "درگاه" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "پیش‌تقویت" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "تنظیم‌ها" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "تنظیم‌ها..." #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "پرونده‌های جلد هنری دلخواه (جداشده با ویرگول)" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "فرمت آوایی دلخواه" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "ضرباهنگ برگزیده" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "فرمت دلخواه" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "سبک آوایی برتر" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "پیش‌نشانده:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "یک ترکیب از دکمه‌ها را فشار دهید برای استفاده در" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "کلیدی را فشار دهید" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "یک ترکیب از دکمه‌ها را فشار دهید برای استفاده در %1..." #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "گزینه‌های زیبای OSD" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "پيش‌نمايش" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "پیشین" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "ترک پیشین" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "اطلاعات ویرایش را چاپ کن" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "نمایه" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "پیشرفت" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 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:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "کیفیت" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "جستجوی دستگاه..." #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "مدیر به‌خط کردن" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "به‌خط کردن ترک‌های گزیده" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "به‌خط کردن ترک" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "رادیو (بلندی یکسان برای همه‌ی ترک‌ها)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "رادیوها" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "باران" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "فرتورسازی تصادفی" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "رتبه‌ی آهنگ جاری را صفر ستاره کن" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "رتبه‌ی آهنگ جاری را یک ستاره کن" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "رتبه‌ی آهنگ جاری را دو ستاره کن" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "رتبه‌ی آهنگ جاری را سه ستاره کن" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "رتبه‌ی آهنگ جاری را چهار ستاره کن" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "رتبه‌ی آهنگ جاری را پنج ستاره کن" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "رتبه‌بندی" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "واقعا کنسل شود؟" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "نوسازی" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "بازخوانی کاتالوگ" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "بازخوانی کانالها" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "نوسازی لیست دوستان" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "بازخوانی لیست ایستگاه‌ها" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "نوسازی جریان‌ها" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "رگه" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "دورکنترل تابی Wii را به‌یاد بیاور" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "از بار پایانی به‌یاد بیاور" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "پاک کردن" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "پاک کردن عملیات" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "پاک‌کردن تکراری‌ها از لیست‌پخش" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "پاک کردن پوشه" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "پاک‌کردن از آهنگ‌های من" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "پاک‌کردن از دلخواه" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "از لیست‌پخش پاک کن" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "پاک‌کردن آهنگ از آهنگ‌های من" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "پاک‌کردن آهنگ از دلخواه‌ها" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "نام‌گردانی لیست‌پخش «%1»" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "نام‌گردانی لیست‌پخش گرووشارک" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "لیست‌پخش را دوباره نامگذاری کن" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "لیست‌پخش را دوباره نامگذاری کن..." #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "ترک‌ها را به این ترتیب دوباره شماره‌گذاری کن..." #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "تکرار" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "تکرار آلبوم" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "تکرار لیست‌پخش" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "تکرار ترک" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "دوباره جانشانی لیست‌پخش جاری" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "دوباره جانشانی لیست‌پخش شود" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "فاصله‌ها را با زیرخط جانشانی کن" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "پخش دوباره‌ی دستاورد" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "ساکن شدن دوباره" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "بازنشانی" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" 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:206 msgid "Restrict to ASCII characters" msgstr "محدود به حروف اَسکی کن" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "بازبینی آهنگ‌های «آهنگ‌های من» از گرووشارک" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "بازبینی آهنگ‌های دلخواه گرووشارک" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "بازبینی لیست‌پخش‌های گرووشارک" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "برگشتن به کلمنتاین" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "راک" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "انجام" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "پراکسی ساکس" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "دستگاه را با امنیت پاک کن" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "دستگاه را پس از کپی، با امنیت پاک کن" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "الگوی ضرباهنگ" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "ضرباهنگ‌الگو" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "ذخیره‌ی پرونده‌ی .mod در کتابخانه‌ی آهنگ‌های شما" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "ذخیره‌ی جلد آلبوم" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "در حال ذخیره‌ی جلد در دیسک" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "ذخیره‌ی فرتور" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "ذخیره‌ی لیست‌پخش" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "ذخیره‌ی لیست‌پخش..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "ذخیره‌ی بازنشانده" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "ذخیره‌ی این جریان در باریکه‌ی اینترنت" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "ذخیره‌ی ترک‌ها" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "نمایه‌ی الگوی ضرباهنگ سنجه‌پذیر (SSR)" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "امتیاز" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "وارانی ترک‌هایی که گوش می‌دهم" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "جستجو" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "جستجوی ایستگاه‌های آیس‌کست" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "جستجوی جامندو" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "جستجوی مگناتیون" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "جستجوی ساب‌سونیک" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "جستجوی جلد آلبوم..." #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "جستجو برای هرچیزی" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "جستجوی جی‌پادر (gpodder.net)" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "جستجوی آی‌تیون" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "سبک جستجو" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "گزینه‌های جستجو" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "دستاورد جستجو" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "عبارات جستجو" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "جستجو در گرووشارک" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "مرتبه‌ی دوم" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "جستجوی پس‌گرد" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "جستجوی پیش‌گرد" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "جستجوی ترک در حال پخش بوسیله‌ی مقداری نسبی" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "جستجوی ترک در حال پخش به یک جایگاه ویژه" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "گزینش همه" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "برگزیدن هیچ‌کدام" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "رنگ پس‌زمینه را برگزینید:" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "فرتور پس‌زمینه را برگزینید" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "گزینش بهترین تطبیق ممکن" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "گزینش رنگ پیش‌زمینه:" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "گزینش فرتورسازها" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "گزینش فرتورسازها..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "شماره سریال" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "نشانی سرور" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "جزئیات سرور" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "سرویس برون‌خط" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "%1 را برابر \"%2‌\"قرار بده..." #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "بلندی صدا را برابر درصد قرار بده" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "این مقدار را برای همه‌ی ترک‌های گزیده قرار بده..." #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "میان‌بر" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "میان‌بر برای %1" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "میان‌بر برای %1 از پیش وجود دارد" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "نمایش" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "نمایش OSD" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "انیمیشنی درخشان در ترک جاری نمایش بده" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "نمایش یک میله‌مود در میله‌ی پیشرفت ترک" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "یک آگاه‌سازی ذاتی میزکار نمایش بده" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "یک آگاه‌سازی نمایش بده زمانی که سبک تکرار/برزدن را تغییر می‌دهم" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "نمایش یک آگاه‌سازی زمانی بلندی صدا را تغییر می‌دهم" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "نمایش یک پنجرک در سینی سیستم" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "نمایش یک OSD زیبا" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "نمایش در بالای میله‌ی وضعیت" #: ui/mainwindow.cpp:460 msgid "Show all songs" msgstr "نمایش همه‌ی آهنگ‌ها" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "نمایش همه‌ی آهنگ‌ها" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show cover art in library" msgstr "نمایش جلد هنری در کتابخانه" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "نمایش جداسازها" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "نمایش اندازه‌ی کامل..." #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "نمایش در مرورگر پرونده..." #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "نمایش در هنرمندان گوناگون" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "نمایش میله‌مود" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "نمایش تنها تکراری‌ها" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "نمایش تنها بی‌برچسب‌ها" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "نمایش پیشنهادهای جستجو" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "نمایش دکمه‌های «عشق» و «تحریم»" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "نمایش دکمه‌ی واکشی در پنجره اصلی" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "نمایش آیکون سینی" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "نمایش سرچشمه‌های پویا و ناپویا" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "آشکار/پنهان" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "پخش درهم" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "برزدن آلبوم‌ها" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "پخش درهم همه" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "پخش درهم لیست‌پخش" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "برزدن ترک‌های این آلبوم" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "راه‌یابی" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "برونرفت از سیستم" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "ورود به ..." #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "هنرمندان مشابه" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "پرش پس در لیست‌پخش" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "پرش شمار" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "پرش پیش در لیست‌پخش" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "جلد آلبوم کوچک" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "میله‌ی کنار کوچک" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "لیست‌پخش هوشمند" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "لیست‌پخش‌های هوشمند" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "ملایم" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "راک ملایم" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "اطلاعات آهنگ" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "اطلاعات آهنگ" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "سونوگرام" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "شرمنده" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "مرتب‌سازی برپایه‌ی ژانر (الفبایی)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "مرتب‌سازی برپایه‌ی ژانر ( برپایه‌ی محبوبیت)" #: ../bin/src/ui_icecastfilterwidget.h:77 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 "مرتب‌سازی" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "سرچشمه" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "سرچشمه‌ها" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "اسپاتیفای" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "خطای ورود به سیستم اسپاتیفای" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "افزونه‌ی اسپاتیفای" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "افزونه‌ی اسپاتیفای نصب نیست" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "استاندارد" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "ستاره‌دار" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "شروع لیست‌پخش در حال پخش" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "آغاز تراکد" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "چیزی در جعبه‌ی جستجوی بالا بنویسید تا این لیست دستاوردهای جستجو را پرکنید" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "شروع %1" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "شروع..." #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "ایستگاه‌ها" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "ایست" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "ایست پس از" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "ایست پس از این آهنگ" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "ایست پخش" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "ایست پخش پس از ترک جاری" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "ایست‌شده" #: core/song.cpp:341 msgid "Stream" msgstr "جریان" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "جریان‌گیری از یک سرور ساب‌سونیک نیازمند لیسانس معتبر پس از ۳۰ روز دوره‌ی آزمایشی است." #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "هموندی جریان" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "لیست‌پخش‌های عضو شده" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "هموندی‌ها" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "ساب‌سونیک" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "کامیاب!" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "%1 با موفقیت نوشته شد" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "برچسب‌های پیشنهادی" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "چکیده" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "بسیار بالا (%1 ف.د.ث)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "ابربالا (2048x2048)" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "فرمت‌های قابل پشتیبانی" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "همگام‌سازی صندوق ورودی اسپاتیفای" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "همگام‌سازی لیست‌پخش اسپاتیفای" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "همگام‌سازی ترک‌های ستاره‌دار اسپاتیفای" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "رنگ سیستم" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "باریکه‌ها در بالا" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "برچسب" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "واکش برچسب‌ها" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "برچسب رادیو" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "ضرباهنگ هدف" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "تکنو" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "گزینه‌های متن" #: ui/about.cpp:70 msgid "Thanks to" msgstr "تشکر از" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "فرمان «%1» نمی‌تواند شروع شود." #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "جلد آلبوم آهنگ درحال پخش" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "پرونده‌ی «%1» معتبر نیست" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "لیست‌پخش '%1' تهی بود با قابل بارگذاری نبود." #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "پایگاه درخواستی فرتور نیست!" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "آهنگ‌های دیگری در این آلبوم وجود دارند" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "مشکلی در گفتگو با gpodder.net پدیدار شد" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "مشکلی در واکشی ابرداده‌ها از مگناتیون پیش آمد" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "مشکلی در موشکافی پاسخ فروشگاه آی‌تیون پدید آمد" #: ui/organiseerrordialog.cpp:56 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:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "این پرونده‌ها از دستگاه پاک خواهند شد، آیا مطمئنید که می‌خواهید ادامه دهید؟" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "These folders will be scanned for music to make up your library" msgstr "برای درست کردن کتابخانه، این پوشه‌ها بررسی خواهند شد" #: ../bin/src/ui_transcodersettingspage.h:174 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:151 msgid "Third level" msgstr "طبقه‌ی سوم" #: internet/jamendoservice.cpp:171 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/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "این آلبوم در فرمت درخواست‌شده در دسترس نیست." #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "این دستگاه باید متصل و باز شده باشد پیش از اینکه کلمنتاین ببیند چه فرمت‌هایی پشتیبانی می‌شوند." #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "این دستگاه از فرمت‌های زیر پشتیبانی می‌کند:" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "این دستگاه درست کار نخواهد کرد" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "این جریان تنها برای مشترکان پولی است" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "این گونه از دستگاه پشتیبانی نمی‌شود: %1" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "میانگاه" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "عنوان" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "برای راه‌اندازی رادیوی گرووشارک، ابتدا باید چند آهنگ دیگر از گرووشارک را بشنوید" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "امروز" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "تبدیل به OSD زیبا" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "تبدیل به تمام‌صفحه" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "تبدیل به وضعیت صف" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "تبدیل به وارانی" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "تبدیل به پدیداری برای نمایش‌برصفحه‌ی زیبا" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "فردا" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "بیش از اندازه بازگردانی‌ها" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "ترک‌های برتر" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "همه‌ی بایت‌های ارسال شده" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "همه‌ی درخواست‌های شبکه انجام شد" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "ترک" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "آهنگ‌های تراکد" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "صورت عملیات تراکدگر" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "تراکدکردن" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "تراکدکردن فایلهای %1 با استفاده از سرنخ‌های %2" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "گزینه‌های تراکد" #: core/song.cpp:338 msgid "TrueAudio" msgstr "آوای واقعی" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "توربین" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "خاموش" #: devices/giolister.cpp:161 msgid "URI" msgstr "نشانی" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "نشانی" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "اوبونتو وان" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "نوار ابرپهن (UWB)" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "ناکام در باگیری %1 (%2)" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "ناشناخته" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "سبک محتوای ناشناخته" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "خطای ناشناخته" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "قرار ندادن جلد" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "لغو هموندی" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "کنسرت‌های پیش‌رو" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "به‌روز رسانی لیست‌پخش گرووشارک" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "به‌روز رسانی همه‌ی پادکست‌ها" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "تغییرات پوشه‌های کتابخانه را به‌روز برسان" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "زمانی که کلمنتاین شروع می‌شود کتابخانه را به‌روز کن" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "به‌روز رسانی این پادکست" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "به‌روز رسانی" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "به‌روز رسانی %1" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "به‌روز رسانی %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "به‌روز رسانی کتابخانه" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "کاربرد" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "بکاربردن برچسب «هنرمند آلبوم» زمانی که وجود داشته باشد" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "بکار بردن کلیدهای میان‌بر گنوم" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "در صورت وجود، از ابرداده‌ی Replay Gain استفاده کن" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "بکار بردن دورکنترل Wii" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "بکاربردن یک دسته دلخواه رنگ" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "بکار بردن پیام پیشنهادی برای آگاه‌سازی‌ها" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "بکار بردن سندیت" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "بکار بردن موتور مدیریتی ضرباهنگ" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "بکار بردن روش دینامیک" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "بکاربردن آگاه‌سازی برای گزارش وضعیت دور Wii" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "بکاربردن شکل زمانی پارازیت" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "بکاربردن پیش‌نشان‌های سیستم" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "بکاربردن دسته‌ی رنگ پیش‌نشان سیستم" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "بکاربردن تنظیم‌های پراکسی سیستم" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "استفاده از نرمال‌سازی صدا" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "استفاده‌شده" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "کاربر %1 اکانت گرووشارک در هیچ‌جا ندارد" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "رابط کاربری" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "شناسه" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "بکاربردن منو برای افزودن آهنگ..." #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "آهنگ ضرب متغیر" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "هنرمندان گوناگون" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "ویرایش %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "نما" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "روش فرتورسازی" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "فرتورسازی‌ها" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "تنظیم‌های فرتورسازی‌ها" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "تشخیص پویایی صدا" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "حجم %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "تارنما" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "هفته" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "زمانی که کلمنتاین شروع می‌شود" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "زمانی که سیاهه تهی است..." #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "چرا این را نمی‌آزمایید:..." #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "باند پهن (WB)" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "دورکنترل Wii %1: پویا است" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "دورکنترل Wii %1: وصل است" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "دورکنترل Wii %1: باتری بحرانی است (%2%) " #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "دورکنترل Wii %1: ناپویا است" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "دورکنترل Wii %1: نصب نیست" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "دورکنترل Wii %1: باتری اندک (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "ویموتدو" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "فرمت آوایی مدیای ویندوز" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "آیا می‌خواهید آهنگ‌های دیگر در این آلبوم را به «هنرمندان گوناگون» تراببرید؟" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "آیا مایل هستید که الان بازبینی کامل انجام دهید؟" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "شناسه و گذرواژه‌ی نادرست" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "سال" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "سال - آلبوم" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "سال" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "دیروز" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "هم‌اکنون آلبوم‌های زیر بارگیری خواهند شد" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "هنوز وارد نشده‌اید." #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "با نام %1 وارد شده‌اید." #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "وارد شده‌اید." #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "روشی را که آهنگ‌ها در کتابخانه سازماندهی می‌شوند، می‌توانید تغییر دهید." #: internet/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "بدون اکانت می‌توانید رایگان بشنوید، اما عضوهای برجسته می‌توانند با کیفیت بالا و بدون تبلیغ جریان‌ها را بشنوند." #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "به جریان پس‌زمینه همزمان با دیگر آهنگ‌ها می‌توانید گوش دهید." #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "ترک‌ها را رایگان می‌توانید برونکشی کنید، اما تنها اعضای پولی می‌توانند رادیوی لست‌‌اف‌ام را از کلمنتاین پخش کنند." #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "شما در هیچ‌جا اکانت گرووشارک ندارید." #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "شما اکانت برجسته‌ی اسپاتیفای ندارید." #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "شما هیچ هموندی پویایی ندارید" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "از اسپاتیفای بیرون آمده‌اید، خواهشمندم دوباره گذرواژه‌ی خود را در گفتگوی «تنظیم‌ها» وارد کنید." #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "از اسپاتیفای بیرون آمده‌اید، خواهشمندم دوباره گذرواژه‌ی خود را وارد کنید." #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "عاشق این آهنگ هستید" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "نیاز است که تنظیم‌های سیستم را راه‌اندازی کنید و \"Enable access for assistive devices\" را پویا کنید تا بتوانید از میان‌برهای سراسری در کلمنتاین استفاده کنید." #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "اگر زبان را تغییر دهید باید کلمنتاین را دوباره بارگذاری کنید." #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "شما نمی‌توانید ایستگاه رادیویی لست‌‌اف‌ام را پخش کنید زیرا شما عضو لست‌‌اف‌ام نیستید." #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "اعتبار لست‌‌اف‌ام شما نادرست بود" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "اعتبار مگناتیون شما نادرست بود" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "کتابخانه‌ی شما تهی است!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "جریان‌های رادیویی شما" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "برونکشی‌های شما: %1" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "سیستم شما دارای OpenGL نیست، فرتورگری‌ها در دسترس نیستند." #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "شناسه یا گذرواژه نادرست است." #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "ی-ا" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "صفر" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "افزودن %n آهنگ" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "پس از" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "پیش" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "و" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "خودکار" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "پیش از" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "بین" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "بزرگترین اول" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "ض.د.د" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "شامل‌" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "ناپویا" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "دیسک %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "شامل نیست" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "پایان می‌یابد با" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "برابر است با" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "جی‌پادر (gpodder.net)" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "پوشه‌ی جی‌پادر (gpodder.net)" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "بزرگتر است از" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "در پایان" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "ک.ب.د.ث" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "کمتر است از" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "ابتدا بلندترین" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "ترابری %n آهنگ" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "ابتدا تازه‌ترین" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "برابر نیست با" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "در انتها نیست" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "نه در" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "ابتدا قدیمی‌ترین" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "در" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "گزینه‌ها" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "ورود را فشار دهید" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "پاک‌کردن %n آهنگ" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "ابتدا کوتاه‌ترین" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "برزدن آهنگ‌ها" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "ابتدا کوچک‌ترین" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "سامانیدن آهنگ‌ها" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "شروع شود با" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "ایست" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "ترک %1" clementine-1.2.0+dfsg/src/translations/fi.po000066400000000000000000004611171223327513400210360ustar00rootroot00000000000000# 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-2013 # Jaergenoth , 2013 # Moonwrist , 2011, 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-29 11:48+0000\n" "Last-Translator: Jiri Grönroos \n" "Language-Team: Finnish (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr " päivää" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " pt" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " sekuntia" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " kappaletta" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 levyä" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 päivää" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 päivää sitten" #: podcasts/gpoddersync.cpp:79 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1-soittolistat (%2)" #: playlist/playlistmanager.cpp:413 #, qt-format msgid "%1 selected of" msgstr "valittuna %1 /" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 kappale" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 kappaletta" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 kappaletta löytyi" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 kappaletta löytyi (näytetään %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 kappaletta" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 siirretty" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimotedev-moduuli" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n epäonnistui" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n valmistui" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "&Oma" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "Extrat" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "Ohje" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "Piilota %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "Piilota..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Vasemmalle" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "Musiikki" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Ei mitään" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "Soittolista" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Lopeta" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "Kertaa" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Oikealle" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "Sekoita" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "&Sovita sarakkeet ikkunan leveyteen" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "Työkalut" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(erilainen kaikille kappaleille)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "...ja kaikki Amarokin kehitykseen osallistuneet" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "0px" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 päivä" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 kappale" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "127.0.0.1" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "40 %" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 satunnaista kappaletta" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "Päivitä Premium-tunnukseksi nyt" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "Luo uusi tili tai nollaa salasanasi" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "Grooveshark Anywhere -tili vaaditaan käyttöön." #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "Spotify Premium -tili vaaditaan." #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "Asiakas voi yhdistää vain oikealla koodilla." #: smartplaylists/wizard.cpp:78 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:153 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:297 msgid "A-Z" msgstr "A-Ö" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "KAIKKI KUNNIA HYPNOTOADILLE" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "Keskeytä" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "Tietoja - %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "Tietoja - Clementine" #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "Tietoja - Qt" #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Tilin tiedot" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "Tilitiedot (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Toiminto" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Ota käyttöön / poista käytöstä Wiiremote" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "Lisää podcast" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Lisää suoratoisto" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "Lisää uusi rivi, jos ilmoitustyyppi sen sallii" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "Lisää toiminto" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Lisää toinen suoratoisto..." #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Lisää kansio..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "Lisää tiedosto" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "Lisää tiedosto muuntajaan" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "Lisää tiedosto(ja) muuntajaan" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Lisää tiedosto..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Lisää tiedostoja muunnettavaksi" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Lisää kansio" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Lisää kansio..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Lisää uusi kansio..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "Lisää podcast" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "Lisää podcast..." #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Lisää hakutermi" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "Lisää tunniste levyn nimi" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "Lisää tunniste levyn esittäjä" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "Lisää tunniste kappaleen esittäjä" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "Lisää tunniste kappaleen säveltäjä" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "Lisää tunniste levyn numero" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "Lisää kappaleen tiedostonimi" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "Lisää tunniste kappaleen kategoria" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "Lisää tunniste kappaleen kesto" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "Lisää kappaleen toistolaskuri" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "Lisää kappaleelle arvosana" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "Lisää kappaleen keskeyttämislaskuri" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "Lisää tunniste kappaleen nimi" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "Lisää tunniste " #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "Lisää tunniste kappaleen levytys vuosi" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Lisää suoratoisto..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "Lisää Grooveshark-suosikkeihin" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "Lisää Grooveshark-soittolistaan" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "Lisää toiseen soittolistaan" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Lisää soittolistaan" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "Lisää jonoon" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Lisää wiimotedev-toiminto" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Lisää..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Lisätty tässä kuussa" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Lisätty tällä viikolla" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Lisätty tänä vuonna" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Lisätty tänään" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Lisätty kolmen kuukauden sisään" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "Lisätään kappale musiikkikirjastoon" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "Lisätään kappale suosikkeihin" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Kirjaston tarkempi järjestely..." #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "Kopioinnin jälkeen..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Levy" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Albumi (ihanteellinen voimakkuus kaikille kappaleille)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Levyn esittäjä" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "Kansikuva" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Levytiedot jamendo.comissa..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Levyt kansikuvineen" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Levyt vailla kansikuvia" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Kaikki tiedostot (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "Kaikki kunnia Hypnotoadille!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Kaikki levyt" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Kaikki esittäjät" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "Kaikki tiedostot (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Kaikki soittolistat (%1)" #: ui/about.cpp:74 msgid "All the translators" msgstr "Kaikki kääntäjät" #: library/library.cpp:84 msgid "All tracks" msgstr "Kaikki kappaleet" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "Salli asiakkaan ladata musiikkia tältä tietokoneelta." #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "Salli lataukset" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "Yhteen alkuperäisten kanssa" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Piilota aina pääikkuna" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Näytä pääikkuna aina" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "Aloita aina toisto" #: internet/spotifyblobdownloader.cpp:60 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:61 msgid "An error occurred loading the iTunes database" msgstr "iTunes-tietokantaa ladatessa tapahtui virhe" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Virhe kirjoittaessa metatietoja kohteeseen '%1'" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "Tapahtui määrittämätön virhe." #: ui/about.cpp:78 msgid "And:" msgstr "Ja:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "Vihainen" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Ulkoasu" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Lisää tiedostoja/verkko-osoitteita soittolistalle" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "Lisää nykyiselle soittolistalle" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "Lisää soittolistalle" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "Lisää vaimennusta äänisignaalin leikkautumisen estämiseksi" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Haluatko varmasti poistaa asetuksen \"%1\"?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "Oletko varma että haluat poistaa tämän soittolistan?" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "Haluatko varmasti nollata tämän kappaleen tilastotiedot?" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Esittäjä" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Esittäjätiedot" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "Artistiradio" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "Esittäjän tunnisteet" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "Esittäjän nimen ensimmäinen kirjain" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Äänimuoto" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Tunnistautuminen epäonnistui" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "" #: ui/about.cpp:65 msgid "Authors" msgstr "Tekijät" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Auto" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Automaattinen päivitys" #: ../bin/src/ui_librarysettingspage.h:208 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:45 msgid "Available" msgstr "Käytettävissä" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "Keskimääräinen bittinopeus" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "Kuvatiedoston koko keskimäärin" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "BBC-podcastit" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "Taustaäänet" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Taustaväri" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "Taustakuva" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Taustan läpinäkyvyys" #: core/database.cpp:734 msgid "Backing up database" msgstr "Varmuuskopioidaan tietokantaa" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "Tasapaino" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "En tykkää" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "Taajuusjakauma" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Perussininen" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "Äänityyppi, perus" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Toiminta" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "Paras" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "Biografian tarjoaa %1" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Bittivirta" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "Bittinopeus" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "Block analyzer" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "Sumennuksen määrä" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "Sisältö" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "Boom analyzer" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Selaa..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "Puskurin kesto" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "Puskuroidaan" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "Mutta nämä lähteet ovat pois käytöstä:" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Painikkeet" #: core/song.cpp:339 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "CUE-tiedostojen tuki" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "Peru" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Vaihda kansikuvaa" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Vaihda kirjasinkokoa..." #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "Vaihda toiston tilaa" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Vaihda pikanäppäin..." #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "Vaihda sekoituksen tilaa" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Vaihda kieltä" #: ../bin/src/ui_playbacksettingspage.h:330 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:228 msgid "Check for new episodes" msgstr "Tarkista uudet jaksot" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Tarkista päivitykset..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "Anna nimi älykkäälle soittolistalle" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Valitse automaattisesti" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Valitse väri..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "Valitse kirjasin..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Valitse listalta" #: smartplaylists/querywizardplugin.cpp:155 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ää." #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "Valitse podcastien latauskansio" #: ../bin/src/ui_songinfosettingspage.h:188 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:115 msgid "Classical" msgstr "Classical" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "Siivotaan" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Tyhjennä" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Tyhjennä soittolista" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Clementine-virhe" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Klementiinin oranssi" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Clementinen visualisointi" #: ../bin/src/ui_deviceproperties.h:376 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_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine voi toistaa Boxiin lähetettyä musiikkia" #: ../bin/src/ui_dropboxsettingspage.h:104 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:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine voi toistaa Google Driveen lataamaasi musiikkia" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "Clementine voi toistaa Ubuntu Oneen lähettämääsi musiikkia" #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "Clementine voi ilmoittaa, kun kappale vaihtuu." #: ../bin/src/ui_podcastsettingspage.h:250 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:128 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." #: internet/lastfmsettingspage.cpp:110 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 "Clementine ei voinut hakea tilauksesi tietoja, koska yhteydessäsi on jotain vikaa. Soitetut kappaleet pidetään välimuistissa ja ne lähetetään myöhemmin Last.fm:ään." #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Clementine-kuvakatselin" #: ../bin/src/ui_trackselectiondialog.h:206 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:210 msgid "Clementine will find music in:" msgstr "Clementine etsii musiikkia kohteista:" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Napsauta tästä lisätäksesi musiikkia" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "Napsauta vaihtaaksesi näkymää: aikaa jäljellä / kokonaisaika" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "Sulje soittolista" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "Sulje visualisointi" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "Tämän ikkunan sulkeminen peruu latauksen." #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "Tämän ikkunan sulkeminen lopettaa levykansien etsimisen." #: ui/equalizer.cpp:116 msgid "Club" msgstr "Club" #: ../bin/src/ui_appearancesettingspage.h:272 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:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Kommentti" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "Täydennä tunnisteet automaattisesti" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "Täydennä tunnisteet automaattisesti..." #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Säveltäjä" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "%1 - asetukset..." #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "Grooveshark-asetukset..." #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Last.fm-asetukset..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "Magnatune-asetukset..." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Pikanäppäinten asetukset..." #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "Muokkaa Spotifya..." #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "Subsonicin asetukset..." #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "Muokkaa hakua..." #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "Kirjaston asetukset..." #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "Muokkaa podcasteja..." #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "Asetukset..." #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "Yhdistä laite" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "Yhdistetään Spotifyyn" #: internet/subsonicsettingspage.cpp:107 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/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Yhteys aikakatkaistiin, tarkista palvelimen osoite. Esimerkki: http://localhost:4040/" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "Konsoli" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "Pysyvä bittinopeus" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "Muunna kaikki musiikki" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "Muuta musiikki, jota laite ei voi muuten toistaa" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "Kopioi leikepöydälle" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Kopioi laitteelle..." #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Kopioi kirjastoon" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "Tekijänoikeus" #: internet/subsonicsettingspage.cpp:81 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:64 #, 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" #: transcoder/transcoder.cpp:432 #, 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:426 #, 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/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "Last.fm-radioaseman lataus epäonnistui" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "Ei voitu avata kohdetiedostoa %1" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Kansikuvaselain" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "Kansikuva sulautetusta kuvasta" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Kansikuva ladattu automaattisesti kohteesta %1" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "Levynkansi poistettu" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "Kansikuvaa ei ole asetettu" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "Kansikuva asetettu kohteesta %1" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "Kansikuvat kohteesta %1" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "Luo uusi Grooveshark-soittolista" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "Ristiinhäivytä kappaleet, kun kappale vaihtuu automaattisesti" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "Ristiinhäivytä kappaleet, kun käyttäjä vaihtaa kappaletta" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "Oma" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "Omavalintainen kuva:" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "Omavalintaisen viestin asetukset" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "Oma radio" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Mukautettu..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "DBus-polku" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Dance" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Luotu" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Muokattu" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "Päivää" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "&Oletus" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "Vähennä ääntä - 4 %" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "Vähennä äänenvoimakkuutta prosentilla" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Vähennä äänenvoimakkuutta" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "Oletus taustakuva" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "Oletusasetukset" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "Viive visualisointien välillä" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "Poista" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "Poista Grooveshark-soittolista" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "Poista ladattu data" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Poista tiedostot" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Poista laitteelta..." #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Poista levyltä..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "Poista soitetut jaksot" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "Poista asetus" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "Poista älykäs soittolista" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "Poista alkuperäiset tiedostot" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Poistetaan tiedostoja" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "Poista valitut kappaleet jonosta" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "Poista kappale jonosta" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Kohde" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Tiedot..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Laite" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Laitteen ominaisuudet" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Laitteen nimi" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Laitteen ominaisuudet..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Laitteet" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Tarkoititko" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "Digitally Imported -salasana" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "Digitally Imported -käyttäjätunnus" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "Suora internetyhteys" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Kansio" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "Kytke kesto pois päältä" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "Poista moodbar käytöstä" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Poissa käytöstä" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Levy" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "Keskeytyvä siirto" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 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:715 msgid "Do a full library rescan" msgstr "Tee kirjaston täydellinen läpikäynti" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "Älä muunna mitään musiikkia" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "Älä korvaa" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Älä kertaa" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "Älä näytä kohdassa \"Useita esittäjiä\"" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "Älä sekoita" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "Älä lopeta!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "Lahjoita" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Kaksoisnapsauta avataksesi" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "Kappaleen kaksoisnapsautus..." #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "Poista %n jaksoa" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "Latauskansio" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "Lataa jaksot kohteeseen" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "Latausjäsenyys" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "Lataa uudet jaksot automaattisesti" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "Lataus asetettu jonoon" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "Lataa Android-sovellus" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Lataa tämä levy" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Lataa tämä levy..." #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "Lataa tämä jakso" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "Lataa..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "Ladataan (%1%)..." #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "Ladataan Icecast-hakemistoa" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "Ladataan Jamendo-luetteloa" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "Ladataan Magnatune-luetteloa" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "Ladataan Spotify-liitännäistä" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "Noudetaan metadataa" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "Vaihda sijaintia vetämällä" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "Dropbox" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "Dynaaminen tila päällä" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "Dynaaminen satunnainen sekoitus" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "Muokkaa älykästä soittolistaa..." #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Muokkaa tunnistetta (%1)..." #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "Muokkaa tunnistetta..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "Muokkaa tunnisteita" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Muokkaa kappaleen tietoja" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "Muokkaa kappaleen tietoja..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Muokkaa kappaleen tietoja..." #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Muokkaa..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "Käytä Wii-ohjainta" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "Käytä taajuuskorjainta" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "Käytä pikanäppäimiä vain Clementinen ollessa avoinna" #: ../bin/src/ui_globalsearchsettingspage.h:147 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:62 msgid "Enable/disable Last.fm scrobbling" msgstr "Päälle / pois Last.fm scrobbling" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "Enkoodauksen kompleksisuus" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "Koodausmoottorin laatu" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "Koodaustila" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "Anna verkko-osoite" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "Kirjoita URL-osoite kansikuvien lataamiseen Internetistä:" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "Anna uusi nimi tälle soittolistalle" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Anna esittäjä tai tunniste aloittaaksesi Last.fm:n kuuntelun." #: ../bin/src/ui_globalsearchview.h:209 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:77 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:77 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:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "Etsi tästä" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "Anna suoratoiston osoite:" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "Anna kansion nimi" #: ../bin/src/ui_networkremotesettingspage.h:198 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:87 msgid "Entire collection" msgstr "Koko kokoelma" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Virhe" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Virhe yhdistäessä MTP-laitteeseen" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "Virhe kappaleita kopioidessa" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "Virhe kappaleita poistaessa" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "Virhe ladatessa Spotify-liitännäistä" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "Virhe ladattaessa %1" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Virhe ladattaessa di.fm soittolistaa" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "Virhe käsitellessä %1:%2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "Virhe ladattaessa CD" #: library/library.cpp:63 msgid "Ever played" msgstr "Aina soitetut" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "10 minuutin välein" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "12 tunnin välein" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "2 tunnin välein" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "20 minuutin välein" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "30 minuutin välein" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "6 tunnin välein" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "Joka tunti" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Älä käytä ristihäivytystä samalla levyllä tai samassa CUE-tiedostossa oleville kappaleille" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "Olemassa olevat kansikuvat" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "Laajenna" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "Vanhenee %1" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "Vie kansikuvat" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "Vie kansikuvat" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "Vie ladatut kansikuvat" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "Vie upotetut kansikuvat" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "Vienti valmistui" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "Vietiin %1/%2 kansikuvaa (%3 ohitettu)" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "Häivytä keskeyttäessä ja palauttaessa kappaleen toisto" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "Häivytä, kun kappale pysäytetään" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "Häivytys" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "Häivytyksen kesto" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "Kansion nouto epäonnistui" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "Podcastien nouto epäonnistui" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "Podcastin lataus epäonnistui" #: podcasts/podcasturlloader.cpp:167 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:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "Nopea" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "Suosikit" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "Suosikkikappaleet" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "Nouda puuttuvat kansikuvat" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "Nouda automaattisesti" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "Nouto suoritettu" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "Noudetaan Subsonic-kirjastoa" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Virhe kansikuvan noudossa" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "Tiedostopääte" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "Tiedostomuodot" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Tiedoston nimi (ja polku)" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "Tiedostonimi" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Tiedostokoko" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Tiedostotyyppi" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Tiedostonimi" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Tiedostot" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "Muunnettavat tiedostot" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "Etsi kirjastosta kappaleet, jotka sopivat hakuehtoihisi." #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "Luodaan sormenjälkeä kappaleesta..." #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "Valmis" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "Ensimmäinen taso" #: core/song.cpp:328 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Kirjasinkoko" #: ../bin/src/ui_spotifysettingspage.h:213 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:204 msgid "Force mono encoding" msgstr "Pakota monokoodaus" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "Unohda laite" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Lomake" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "Muoto" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Kuvanopeus" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "Kehyksiä per puskuri" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Tuttavat" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "Jäätynyt" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Täysi basso" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "Täysi basso ja diskantti" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "Täysi diskantti" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "GStreamer-äänijärjestelmä" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "Yleiset" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Yleiset asetukset" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Tyylilaji" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "Hanki tämän Grooveshark-soittolistan verkko-osoite" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "Hanki tämän Grooveshark-kappaleen verkko-osoite" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "Noudetaan Groovesharkin suosituimpia kappaleita" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "Haetaan kanavia" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "Haetaan suoratoisto kanavia" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "Anna nimi:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "Mene" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "Siirry seuraavaan soittolistaan" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "Siirry edelliseen soittolistaan" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, 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:206 msgid "Grey out non existent songs in my playlists" msgstr "Muuta poistetut kappaleet harmaan värisiksi soittolistalla" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "Grooveshark-kirjautumisvirhe" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "Grooveshark-soittolistan verkko-osoite" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "Grooveshark-radio" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "Grooveshark-kappaleen osoite" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "Järjestä kirjasto..." #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "Järjestä" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "Järjestä levyn mukaan" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "Järjestä esittäjän mukaan" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "Järjestä esittäjän/levyn mukaan" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "Järjestä esittäjän/vuoden - levyn mukaan" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "Järjestä tyylin/levyn mukaan" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "Järjestä tyylin/esittäjän/levyn mukaan" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "Ryhmittely" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "HTML-sivu ei sisältänyt minkäänlaista RSS-syötettä" #: internet/subsonicsettingspage.cpp:135 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:163 msgid "HTTP proxy" msgstr "HTTP-välityspalvelin" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "Iloinen" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "Laitetiedot" #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "Laitetiedot on saatavilla vain laitteen ollessa yhdistettynä." #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "Korkea" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "Nopea (%1 fps)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "Korkea (1024x1024)" #: internet/subsonicsettingspage.cpp:112 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:310 msgid "Hours" msgstr "Tuntia" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "Minulla ei ole Magnatune-tunnusta" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Kuvake" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "Kuvakkeet ylhäällä" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "Tunnistetaan kappaletta" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 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:77 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:204 msgid "Ignore \"The\" in artist names" msgstr "Älä huomioi sanaa \"The\" esiintyjien nimissä" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Kuvat (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "%1 päivässä" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "%1 viikossa" #: ../bin/src/ui_wizardfinishpage.h:86 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/spotifyservice.cpp:360 msgid "Inbox" msgstr "Saapuneet" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "Näytä kansikuva ilmoituksen yhteydessä" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "Sisällytä kaikki kappaleet" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Yhteensopimaton Subsonicin REST-protokollaversio. Asiakasohjelmisto on päivitettävä." #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Yhteensopimaton Subsonicin REST-protokollaversio. Palvelin on päivitettävä." #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Puutteelliset asetukset, varmista että kaikki kentät on täytetty." #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "Lisää ääntä - 4 %" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "Lisää äänenvoimakkuutta prosentilla" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Lisää äänenvoimakkuutta" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "Indeksoidaan %1" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "Tiedot" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "Lisää..." #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Asennettu" #: core/database.cpp:673 msgid "Integrity check" msgstr "Eheystarkistus" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "Palvelutarjoajat" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "Virheellinen API-avain" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Virheellinen muoto" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "Virheellinen menetelmä" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "Virheelliset parametrit" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "Virheellinen resurssien määrittely" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "Virheellinen palvelu" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "Virheellinen istuntoavain" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "Virheellinen käyttäjätunnus ja / tai salasana" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "Jamendon eniten kuunnellut kappaleet" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "Jamendon suosituimmat kappaleet" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "Jamendon kuukauden suosituimmat kappaleet" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "Jamendon viikon suosituimmat kappaleet" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "Jamendo-tietokanta" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "Näytä parhaillaan soiva kappale" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Paina painikkeita %1 sekunti..." #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Paina painikkeita %1 sekuntia..." #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "Pidä käynnissä taustalla, kun ikkuna suljetaan" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "Säilytä alkuperäiset tiedostot" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "Kissanpentuja" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Kieli" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "Kannettava/kuulokkeet" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Suuri halli" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "Suuri kansikuva" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "Suuri sivupalkki" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "Viimeksi soitettu" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "Last.fm Custom Radio: %1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Last.fm-kirjasto - %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "Last.fm Mix Radio - %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Last.fm-naapuriradio - %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Last.fm-radioasema - %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Last.fm, samanlaisia esittäjiä kuin %1" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Last.fm Tag Radio: %1" #: internet/lastfmservice.cpp:437 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:154 msgid "Last.fm password" msgstr "Last.fm-salasana" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "Last.fm-soittokerrat" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Last.fm-tunnisteet" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Last.fm-tunnus" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Last.fm-wiki" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "Vähiten pidetyt kappaleet" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "Jätä tyhjäksi oletusta varten. Esimerkkejä: \"/dev/dsp\", \"front\" jne." #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "Vasen" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Kesto" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Kirjasto" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "Kirjaston tarkennettu ryhmittely" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "Ilmoitus kirjaston läpikäynnistä" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "Kirjastohaku" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Rajat" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "Kuuntele Grooveshark-kappaleita aieman kuuntelutottumuksesi perusteella" #: ui/equalizer.cpp:123 msgid "Live" msgstr "Live" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Lataa" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "Lataa kansikuva osoitteesta" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "Lataa kansikuva osoitteesta..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "Lataa kansikuva levyltä" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "Lataa kansikuva levyltä..." #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "Lataa soittolista" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "Lataa soittolista..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Ladataan Last.fm-radioa" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Ladataan MTP-laitetta" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "Ladataan iPod-tietokantaa" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "Ladataan älykästä soittolistaa" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "Ladataan kappaleita" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "Ladataan suoratoistoa" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "Ladataan kappaleita" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "Lataa kappaleen tietoja" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "Ladataan..." #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "Lataa tiedostoja tai verkko-osoitteita, korvaa samalla nykyinen soittolista" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Kirjaudu sisään" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "Kirjautuminen epäonnistui" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "Tykkää" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Hidas (%1 fps)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "Matala (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "Sanoitukset" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "Sanoitukset tarjoaa %1" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP3 256K" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Magnatune-lataus" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Magnatune-lataus valmistui" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "Oletusprofiili (MAIN)" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "Toteuta!" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "Aseta soittolista käytettäväksi yhteydettömässä tilassa" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "Virheellinen vastaus" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "Määritä välityspalvelin itse" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "Käsin" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "Valmistaja" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "Merkitse kuunnelluksi" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "Merkitse uudeksi" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "Täyttää jokaisen hakuehdon (AND)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "Täyttää yhden tai useampia hakuehtoja (OR)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "Suurin bittinopeus" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "Keskitaso (%1 fps)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "Keskinkertainen (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "Jäsenyyden tyyppi" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "Pienin bittinopeus" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "Puuttuvat projectM-asetukset" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "Malli" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "Tarkkaile kirjastoa muutosten varalta" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "Mono-toisto" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "Kuukautta" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "Mood" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "Mielialapalkin tyyli" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "Mielialapalkit" #: library/library.cpp:74 msgid "Most played" msgstr "Eniten soitetut" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "Liitoskohta" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "Liitoskohdat" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "Siirrä alas" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "Siirrä kirjastoon..." #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "Siirrä ylös" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "Musiikki" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Musiikkikirjasto" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "Vaimenna" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "Last.fm-kirjastoni" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "Oma Last.fm-naapurusto" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "Oma Mix Radio" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "Musiikkikirjasto" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "Oma naapurustoni" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "Oma radioasemani" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "Omat suositukseni" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Nimi" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "Nimeämisvalinnat" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "Kapeakaistainen (NB)" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "Naapurit" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "Verkko" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "Verkon välityspalvelin" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "Verkkokaukosäädin" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "Ei koskaan" #: library/library.cpp:67 msgid "Never played" msgstr "Ei koskaan soitettu" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "Älä koskaan aloita toistoa" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "Uusi kansio" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "Uusi soittolista" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "Uusi älykäs soittolista..." #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "Uudet kappaleet" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "Uudet kappaleet lisätään automaattisesti." #: library/library.cpp:80 msgid "Newest tracks" msgstr "Uusimmat kappaleet" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "Seuraava" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Seuraava kappale" #: core/utilities.cpp:147 msgid "Next week" msgstr "Ensi viikolla" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "Ei visualisointia" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "Ei taustakuvaa" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "Ei kansikuvia vietäväksi." #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:366 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:145 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "Ei mitään" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 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:155 msgid "Normal" msgstr "Normaali" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "Ei saatavilla, kun käytössä on dynaaminen soittolista" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "Ei yhdistetty" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "Ei riittävästi sisältöä" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "Ei riittävästi faneja" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "Ei riittävästi jäseniä" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "Ei tarpeeksi naapureita" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Ei asennettu" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "Ei kirjautunut" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "Ei liitetty - kaksoisnapsauta liittääksesi" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "Ilmoituksen tyyppi" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Ilmoitukset" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Nyt soi" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "Kuvaruutunäytön esikatselu" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "Läpinäkyvyys" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "Avaa %1 selaimessa" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "Avaa &ääni-CD..." #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "Avaa OPML-tiedosto" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "Avaa OPML-tiedosto..." #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "Avaa laite" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "Avaa tiedosto ..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "Avaa Google Drivessa" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "Avaa uudessa soittolistassa" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Avaa..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "Toiminto epäonnistui" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "Optimoi bittinopeuteen" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "Optimoi laatuun" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "Valinnat..." #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "Hallitse tiedostoja" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "Hallitse tiedostoja..." #: core/organise.cpp:65 msgid "Organising files" msgstr "Hallinnoidaan tiedostoja" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "Alkuperäiset tunnisteet" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Muut valinnat" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "Äänentoistolaite" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "Muunnoksen asetukset" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "Äänentoistoliitännäinen" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "Korvaa kaikki" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "Korvaa olemassa olevat tiedostot" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "Korvaa vain pienemmät" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "Omistaja" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "Käydään läpi Jamendo-luetteloa" #: ui/equalizer.cpp:124 msgid "Party" msgstr "Party" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "Salasana" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Keskeytä" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "Keskeytä toisto" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Keskeytetty" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "Pelkistetty sivupalkki" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Toista" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "Toista esittäjä tai tunniste" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "Toista esittäjäradio..." #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "Soittokertoja" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "" #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "Aloittaa tai pysäyttää soittamisen" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "Aloita toisto, jos mikään ei soi parhaillaan" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "Toista tunnisteradio..." #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "Soita soittolistan . kappale" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "Toista/Keskeytä" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Toisto" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Soittimen asetukset" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "Soittolista" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "Soittolista soitettiin loppuun" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "Soittolistan valinnat" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "Soittolistan tyyppi" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "Soittolistat" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "Sulje selain ja palaa Clementineen." #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "Liitännäisen tila:" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "Podcastit" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Pop" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "Suosituimmat kappaleet" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "Kuukauden suosituimmat kappaleet" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "Suosituimmat kappaleet tänään" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "Ponnahdusikkunan kesto" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "Portti" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "Esivahvistus" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "Asetukset" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "Asetukset..." #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "Ensisijainen tiedostonimi levykuvitukselle (pilkuin eroteltu)" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "Ensisijainen äänimuoto" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "Ensisijainen bittinopeus" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "Ensisijainen muoto" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "Äänityyppi, premium" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "Asetus:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "Paina näppäinyhdistelmää käyttääksesi" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "Paina näppäintä" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Paina näppäinyhdistelmää käyttääksesi %1 ..." #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "Kuvaruutunäytön valinnat" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "Esikatselu" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "Edellinen" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "Edellinen kappale" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Tulosta versiotiedot" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "Profiili" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "Edistyminen" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 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:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "Laatu" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "Kysytään tietoja laitteelta..." #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "Jonohallinta" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "Aseta valitut kappaleet jonoon" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "Aseta kappale jonoon" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "Radio (sama äänenvoimakkuus kaikille kappaleille)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "Radiot" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "Sadetta" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "Satunnainen visualisointi" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "Arvostele nykyinen kappale 0:n arvoiseksi" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "Arvostele nykyinen kappale 1:n arvoiseksi" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "Arvostele nykyinen kappale 2:n arvoiseksi" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "Arvostele nykyinen kappale 3:n arvoiseksi" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "Arvostele nykyinen kappale 4:n arvoiseksi" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "Arvostele nykyinen kappale 5:n arvoiseksi" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "Arvostelu" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "Haluatko todella perua?" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "Uudelleenohjausraja on ylitetty, tarkista palvelimen asetukset." #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "Päivitä" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "Päivitä luettelo" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "Päivitä kanavat" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "Päivitä kaverilista" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "Päivitä asemalista" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "Päivitä suoratoistokanavat" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Reggae" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "Muista Wii Remoten heilautus" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "Muista viime kerrasta" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Poista" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "Poista toiminto" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "Poista kaksoiskappaleet soittolistasta" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "Poista kansio" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "Poista musiikkikirjastosta" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "Poista suosikeista" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "Poista soittolistalta" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "Poista soittolista" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "Poista soittolistat" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "Poistetaan kappaleita musiikkikirjastosta" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "Poistetaan kappaleita suosikeista" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "Nimeä soittolista \"%1\" uudelleen" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "Nimeä uudelleen Grooveshark-soittolista" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "Nimeä soittolista uudelleen" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "Nimeä soittolista uudelleen..." #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "Numeroi kappaleet tässä järjestyksessä ..." #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Kertaa" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "Kertaa levy" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "Kertaa soittolista" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "Kertaa kappale" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Korvaa nykyinen soittolista" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "Korvaa soittolista" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "Korvaa välilyönnit alaviivoilla" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "Replay Gain" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "Replay Gain -tila" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "Täytä uudelleen" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "Vaadi varmistuskoodi" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "Oletukset" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" msgstr "Nollaa soittokerrat" #: 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:206 msgid "Restrict to ASCII characters" msgstr "Rajoita ASCII-merkkeihin" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "Jatka toistoa sovelluksen käynnistyttyä" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "Noudetaan Grooveshark My Music -kappaleita" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "Noudetaan Grooveshark-suosikkikappaleita" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "Noudetaan Grooveshark-soittolistoja" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "Palaa Clementineen" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "Oikea" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "Aja" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "SOCKS-välityspalvelin" #: internet/subsonicsettingspage.cpp:122 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:202 msgid "Safely remove device" msgstr "Poista laite turvallisesti" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "Poista laite turvallisesti kopioinnin jälkeen" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "Näytteenottotaajuus" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "Näytteenottotaajuus" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "Tallenna .mood-tiedostot musiikkikirjastoon" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "Tallenna levyn kansikuva" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "Tallenna levyn kansikuva kiintolevylle..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "Tallenna kuva" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "Tallenna soittolista" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "Tallenna soittolista..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "Tallenna asetus" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "Tallenna arvosana tiedostoon, jos mahdollista" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "Tallenna tilastot tiedostoon, jos mahdollista" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "Tallenna tämä suoratoisto Internet-osioon" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "Tallennetaan kappaleiden tilastoja kappaletiedostoihin" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "Tallennetaan kappaleita" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "Pisteet" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "Lähetä kappaletiedot kuuntelemistani kappaleista" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "Etsi" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "Etsi Icecast-asemia" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "Etsi Jamendosta" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Etsi Magnatunesta" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "Etsi Subsonicista" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "Etsi kansikuvia..." #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "Etsi mitä tahansa" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "Etsi gpodder.netistä" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "Etsi iTunesista" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "Hakutapa" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "Haun asetukset" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "Hakutulokset" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "Hakusanat" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "Etsitään Groovesharkista" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "Toinen taso" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "Siirry taaksepäin" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "Siirry eteenpäin" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "Siirry nykyisessä kappaleessa suhteellinen määrä" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "Siirry nykyisessä kappaleessa tiettyyn kohtaan" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "Valitse kaikki" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "Poista valinnat" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "Valitse taustaväri:" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "Valitse taustakuva" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "Valitse paras mahdollinen vaihtoehto" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "Valitse edustaväri:" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "Valitse visualisoinnit" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "Valitse visualisoinnit..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "Sarjanumero" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "Palvelimen osoite" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "Palvelimen tiedot" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "Ei yhteyttä palveluun" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Aseta %1 %2:een" #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "Säädä äänenvoimakkuus prosenttia" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "Aseta arvo kaikille valituille kappaleille..." #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "Asetukset" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Pikanäppäin" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "Pikanäppäin toiminnolle %1" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Pikanäppäin toiminnolle %1 on jo olemassa" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Näytä" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "Näytä kappaletiedot näytöllä" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "Korosta soiva kappale hohtavalla animaatiolla" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "Näytä moodbar kappaleen edistysmispalkissa" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "Näytä järjestelmälle ominainen ilmoitus" #: ../bin/src/ui_notificationssettingspage.h:442 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:441 msgid "Show a notification when I change the volume" msgstr "Näytä ilmoitus, kun vaihdan äänenvoimakkuutta" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "Näytä ponnahdus tehtäväpalkista" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "Näytä kuvaruutunäyttö" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "Näytä tilapalkin yläpuolella" #: ui/mainwindow.cpp:460 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:209 msgid "Show cover art in library" msgstr "Näytä kansikuva kirjastossa" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "Näytä erottimet" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "Näytä oikeassa koossa..." #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "Näytä tiedostoselaimessa..." #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "Näytä kohdassa \"Useita esittäjiä\"" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "Näytä mielialapalkki" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "Näytä vain kaksoiskappaleet" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "Näytä vain vailla tunnistetta olevat" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "Näytä hakuehdotukset" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "Näytä \"tykkää\"- ja \"en tykkää\"-painikkeet" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "Näytä lähetyspainike (scrobble) pääikkunnassa" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "Näytä ilmoitusalueen kuvake" #: ../bin/src/ui_globalsearchsettingspage.h:152 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:57 msgid "Show/Hide" msgstr "Näytä/piilota" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Sekoita" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "Sekoita levyt" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "Sekoita kaikki" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "Sekoita soittolista" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "Sekoita tämän levyn kappaleet" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "Kirjaudu" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "Kirjaudu ulos" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "Kirjautuu sisään..." #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "Samankaltaisia esittäjiä" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "Koko" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "Koko:" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "Siirry soittolistan edelliseen kappaleeseen" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "Ohituskerrat" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "Siirry soittolistan seuraavaan kappaleeseen" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "Pieni kansikuva" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "Pieni sivupalkki" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "Älykäs soittolista" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "Älykkäät soittolistat" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "Kappaletiedot" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "Kappaletiedot" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "Sonogrammi" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "Pahoittelut" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "Järjestä tyylin mukaan (aakkosjärjestyksessä)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "Järjestä tyylin mukaan (Järjestä suosion mukaan)" #: ../bin/src/ui_icecastfilterwidget.h:77 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" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "Lähde" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "Lähteet" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "Spotify-kirjautumisvirhe" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "Spotify-liitännäinen" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "Spotify-liitännäistä ei ole asennettu" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "Normaali" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "Tähdellä merkitty" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "Aloita muunnos" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 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:405 #, qt-format msgid "Starting %1" msgstr "Aloittaa %1" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "Aloittaa ..." #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "Asemat" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Pysäytä" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "Lopeta jälkeen" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "Pysäytä toistettavan kappaleen jälkeen" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Pysäytä toisto" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "Lopeta soitto nykyisen kappaleen jälkeen" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "Pysäytetty" #: core/song.cpp:341 msgid "Stream" msgstr "Suoratoisto" #: internet/subsonicsettingspage.cpp:30 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:160 msgid "Streaming membership" msgstr "Suoratoistojäsenyys" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "Tilatut soittolistat" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "Tilaajat" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "Onnistui!" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "Onnistuneesti kirjoitettu %1" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "Ehdotetut tunnisteet" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "Yhteenveto" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "Erittäin nopea (%1 fps)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "Erittäin suuri (2048x2048)" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "Tuetut muodot" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "Synkronoi tilastot tiedostoihin nyt" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "Synkronoi Spotify saapuneet" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "Synkronoi Spotify soittolistan" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "Synkronoi Spotify arvostellut kappaleet" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "Järjestelmävärit" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "Välilehdet ylhäällä" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Tunniste" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "Tunnistenoutaja" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "Tunnisteradio" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "Tavoite bitrate" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "Tekstivalinnat" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Kiitokset" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "\"%1\"-komentoa ei voitu suorittaa." #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "Parhaillaan soivan kappaleen levyn kansikuva" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "Kansio %1 ei ole kelvollinen" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "Soittolista \"%1\" oli tyhjä tai sitä ei pystytty ladata." #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "Hakemasi sivu ei ole kuva!" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "Albumilla on muita kappaleita" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "Virhe yhteydessä gpodder.netiin" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Metatietojen hakemisessa Magnatune palvelusta ilmeni virhe" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Virhe jäsennettäessä vastausta iTunes Storesta" #: ui/organiseerrordialog.cpp:56 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:389 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:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 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:187 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:174 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:151 msgid "Third level" msgstr "Kolmas taso" #: internet/jamendoservice.cpp:171 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/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "Tämä levy ei ole saatavilla haluamassasi muodossa" #: ../bin/src/ui_deviceproperties.h:381 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:375 msgid "This device supports the following file formats:" msgstr "Laite tukee seuraavia tiedostomuotoja:" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Laite ei tule toimimaan kunnolla" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Tämän valinnan voi vaihtaa asetuksien kohdasta \"Toiminta\"." #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "Suoratoisto on tarjolla vain maksaville asiakkaille" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "Tämän tyyppinen laite ei ole tuettu: %1" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "Aikakatkaisu" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Nimi" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "Ennen kuin alat käyttää Grooveshark-radiota, sinun tulisi kuunnella vähintään muutama kappale" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "Tänään" #: core/globalshortcuts.cpp:59 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:1369 msgid "Toggle queue status" msgstr "Vaihda jonon tila" #: ../bin/src/ui_mainwindow.h:718 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:143 msgid "Tomorrow" msgstr "Huomenna" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "Liian monta uudelleenohjausta" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "Suosituimmat kappaleet" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "Levyjä yhteensä:" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "Yhteensä tavuja siirretty" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "Yhteensä verkko pyyntöjä tehty" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Kappale" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "Muunna eri muotoon" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "Muunnosloki" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "Muunnos" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Muunnetaan %1 tiedostoa käyttäen %2 säiettä" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "Muunnosvalinnat" #: core/song.cpp:338 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "Turbine" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "Sammuta" #: devices/giolister.cpp:161 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "Osoite/osoitteet" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "Ubuntu One -salasana" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "Ubuntu One -käyttäjätunnus" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Kohteen %1 lataus epäonnistui (%2)" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Tuntematon" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "Tuntematon sisältötyyppi" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Tuntematon virhe" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "Poista kansikuva" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "Poista tilaus" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "Tulevat konsertit" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "Päivitä Grooveshark-soittolista" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "Päivitä kaikki podcastit" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "Päivitä muuttuneet kirjastokansiot" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "Päivitä kirjasto Clementine käynnistyessä" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "Päivitä tämä podcast" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "Päivitetään" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Päivitetään %1" #: devices/deviceview.cpp:103 #, 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:150 msgid "Usage" msgstr "Käyttötaso" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "Käytä 'Album Artist' -tietuetta, jos mahdollista" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "Käytä Gnomen pikanäppäimiä" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "Käytä Replay Gainin metadataa, jos saatavilla" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "Käytä SSLv3:a" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "Käytä Wii-ohjainta" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "Käytä omia värimäärityksiä" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "Käytä omaa viestiä ilmoituksissa" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "Käytä verkkokaukosäädintä" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "Käytä tunnistatumista" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "Käytä dynaamista tilaa" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "Käytä ilmoituksia Wii-ohjaimen tilan raportoimiseen" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "Käytä järjestelmän oletusta" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "Käytä järjestelmän oletusvärejä" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "Käytä järjestelmän välityspalvelinasetuksia" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "Käytä äänen normalisointia" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "Käytetty" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "Käyttäjällä %1 ei ole Grooveshark Anywhere -tiliä" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "Käyttöliittymä" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Käyttäjätunnus" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "Valikon avulla kappaleen lisäys..." #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "Muuttuva bittinopeus" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "Useita esittäjiä" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "Versio %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "Näkymä" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "Visualisointitila" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "Visualisoinnit" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "Visualisointiasetukset" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "Äänenvoimakkuus %1 %" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "Varoita suljettaessa soittolistan sisältävää välilehteä" #: core/song.cpp:337 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "Verkkosivu" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "Viikkoa" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "Clementinen käynnistyessä" #: ../bin/src/ui_librarysettingspage.h:204 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 "Levykuvitusta etsiessä Clemetine etsii kuvatiedostoja, jotka sisältävät yhden näistä sanoista.\nJos vastaavia tiedostoja ei löydy, Clemetine käyttää suurinta kansiossa olevaa kuvaa." #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "Kun lista on tyhjä..." #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "Voisit kokeilla..." #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "Laajakaistainen (WB)" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii-ohjain %1: aktivoitu" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii-ohjain %1: yhdistetty" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii-ohjain %1: kriittinen lataustaso (%2%) " #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii-ohjain %1: kytketty pois" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii-ohjain %1: yhteys katkaistu" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii-ohjain %1: matala lataustaso (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "Windows Media -ääni" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "Ilman kansikuvaa:" #: library/libraryview.cpp:530 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:2088 msgid "Would you like to run a full rescan right now?" msgstr "Haluatko suorittaa kirjaston läpikäynnin nyt?" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "Kirjoita kaikki kappaletilastot kappaletiedostoihin" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "Väärä käyttäjätunnus tai salasana." #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "Vuosi" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "Vuosi - Levy" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "Vuotta" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "Eilen" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "Olet aikeissa ladata seuraavat levyt" #: playlist/playlistlistcontainer.cpp:311 #, 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:177 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:172 msgid "You are not signed in." msgstr "Et ole kirjautunut sisään" #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "Olet kirjautunut tunnuksella %1." #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "Olet kirjautunut sisään." #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "Voit vaihtaa tapaa, miten kappaleet järjestetään kirjastossa." #: internet/digitallyimportedsettingspage.cpp:46 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/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "Voit kuunnella taustaääniä samalla kun kuuntelet haluamaasi kappaletta." #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "Voit lähettää kappaletietosi ilmaiseksi, mutta vain maksavat käyttäjät voivat kuunnella Last.fm-suoratoistoa." #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "Sinulla ei ole Grooveshark Anywhere -tiliä." #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Sinulla ei ole Spotify Premium tiliä." #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "Käytössäsi ei ole aktiivista tilausta" #: internet/spotifyservice.cpp:170 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/spotifysettingspage.cpp:158 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:87 msgid "You love this track" msgstr "Tykkäät tästä kappaleesta" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "Avaa Järjestelmäasetukset -> Käyttöapu ja ota käyttön \"Salli pääsy apulaitteisiin\" käyttääksesi Clementinen yleisiä pikanäppäimiä." #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "Clementine tulee käynnistää uudelleen, jos vaihdat kieltä." #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "Et voi kuunnella Last.fm -radiota, jos et ole Last.fm -tilaaja." #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "IP-osoitteesi:" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Last.fm-tunnustietosi eivät olleet oikein" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "Tunnus tai salasana Magnatuneen oli väärin" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "Kirjasto on tyhjä!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "Omat radioasemat" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "Lähetyksesi: %1" #: visualisations/visualisationcontainer.cpp:152 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/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "Käyttäjätunnus tai salasana oli virheellinen." #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Ö-A" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Zero" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "lisää %n kappaletta" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "jälkeen" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "sitten" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "ja" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "automaattinen" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "ennen" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "välillä" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "suurin ensin" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "sisältää" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "pois käytöstä" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "levy %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "ei sisällä" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "päättyy" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "yhtä kuin" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "gpodder.net" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "gpodder.net-kansio" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "enemmän kuin" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "viimeisenä" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "kb/s" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "vähemmän kuin" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "pisin ensin" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "siirrä %n kappaletta" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "uusin ensin" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "ei yhtä kuin" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "ei viimeisenä" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "pois päältä" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "vanhin ensin" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "päällä" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "valinnat" #: ../bin/src/ui_networkremotesettingspage.h:203 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:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "poista %n kappaletta" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "lyhin ensin" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "sekoita kappaleet" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "pienin ensin" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "järjestä kappaleet" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "alkaa" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "pysäytä" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "kappale %1" clementine-1.2.0+dfsg/src/translations/fr.po000066400000000000000000005010101223327513400210320ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # arnaudbienner , 2013 # arnaudbienner , 2013 # arnaudbienner , 2011-2012 # Belvar , 2011 # Brice , 2011 # Brice , 2011 # djabal , 2013 # djabal , 2013 # evangeneer , 2012 # Faketag Fakenick <>, 2012 # Fl0w3D , 2013 # Fl0w3D , 2013 # Gabriel Cossette , 2012 # hiveNzin0 , 2011 # Belvar , 2011 # hiveNzin0 , 2011 # IrieZion , 2012 # jb78180 , 2012 # jb78180 , 2012 # Marco Tulio Costa , 2012 # evangeneer , 2012 # matlantin , 2012 # matlantin , 2012 # mberta , 2012 # mberta , 2012 # Marco Tulio Costa , 2012 # Faketag Fakenick <>, 2012 # Tubuntu, 2013 # IrieZion , 2012 # werdeil , 2012 # werdeil , 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-12 17:56+0000\n" "Last-Translator: arnaudbienner \n" "Language-Team: French (http://www.transifex.com/projects/p/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:39 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 une liste de lecture aux favoris en cliquant sur l'icône à côté de son nom\n\nLes listes de lectures favorites seront sauvegardées ici" #: ../bin/src/ui_podcastsettingspage.h:246 msgid " days" msgstr " jours" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " pt" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " secondes" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " morceaux" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 albums" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 jours" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "Il y a %1 jours" #: podcasts/gpoddersync.cpp:79 #, 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:413 #, qt-format msgid "%1 selected of" msgstr "%1 sélectionnés de" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 morceau" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 morceaux" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 morceaux trouvés" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 morceaux trouvés (%2 affichés)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 pistes" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 transférés" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1 : Module wiimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n échoué" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n terminé" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "&Personnaliser" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "&Extras" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "&Aide" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "Masquer %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "Masquer..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Gauche" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "&Musique" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "Aucu&n" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "&Liste de lecture" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Quitter" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "Mode répétition" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Droite" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "Mode aléatoire" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "Étirer les &colonnes pour s'adapter à la fenêtre" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "&Outils" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(différents à travers de multiples morceaux)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "et tous les contributeurs de Amarok" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "0px" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 jour" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "Une piste" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "127.0.0.1" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "MP3 128k" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "40 %" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 pistes aléatoires" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "Mettre à jour vers la version Premium" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "Créer un nouveau compte ou réinitialiser votre mot de passe" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "Un compte Grooveshark Anywhere est nécessaire." #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "Un compte Spotify Premium est nécessaire." #: ../bin/src/ui_networkremotesettingspage.h:189 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:78 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:153 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:297 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "GLOIRE AU CRAPAUD HYPNOTIQUE !" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "Abandonner" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "À propos de %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "À propos de Clementine..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "À propos de Qt..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Détails du compte" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "Informations sur le compte (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Action" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Activer/désactiver Wiiremote" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "Ajouter un Podcast" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Ajouter un flux" #: ../bin/src/ui_notificationssettingspage.h:425 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:193 msgid "Add action" msgstr "Ajouter une action" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Ajouter un autre flux..." #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Ajouter un dossier..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "Ajouter un fichier" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "Ajouter des fichiers à transcoder." #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "Ajouter des fichiers à transcoder." #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Ajouter un fichier..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Ajouter des fichiers à transcoder." #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Ajouter un dossier" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Ajouter un dossier..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Ajouter un nouveau dossier..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "Ajouter un podcast" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "Ajouter un podcast..." #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Ajouter un terme de recherche" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "Ajouter le tag album du morceau" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "Ajouter le tag artiste de l'album du morceau" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "Ajouter le tag artiste du morceau" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "Ajouter le score du morceau" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "Ajouter le tag compositeur du morceau" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "Ajouter le tag numéro de disque du morceau" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "Ajouter le nom de fichier du morceau" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "Ajouter le tag genre du morceau" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "Ajouter un tag de groupement de morceaux" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "Ajouter la durée du morceau" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "Ajouter un tag interprète" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "Ajouter le compteur d'écoutes du morceau" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "Ajouter la note du morceau" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "Ajouter le compteur de sauts du morceau" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "Ajouter le tag titre du morceau" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "Ajouter le tag piste du morceau" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "Ajouter le tag année du morceau" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Ajouter un flux..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "Ajouter aux favoris Grooveshark" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "Ajouter aux listes de lectures Grooveshark" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "Ajouter à une autre liste de lecture" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Ajouter à la liste de lecture" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "Ajouter à la liste d'attente" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Ajouter des actions wiimote" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Ajouter..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Ajouté ce mois" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Ajouté cette semaine" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Ajouté cette année" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Ajouté aujourd'hui" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Ajouté au cours des 3 derniers mois" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "Ajout du morceau dans ma musique" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "Ajout du morceau aux favoris" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Groupement avancé..." #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "Après " #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "Après avoir copié..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Album (volume idéal pour toutes les pistes)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Artiste de l'album" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "Pochette d'album" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Informations de l'album sur jamendo.com..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Albums ayant une pochette" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Albums sans pochette" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Tous les fichiers (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "Gloire au crapaud hypnotique !" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Tous les albums" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Tous les artistes" #: ui/albumcoverchoicecontroller.cpp:47 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:74 msgid "All the translators" msgstr "Tous les traducteurs" #: library/library.cpp:84 msgid "All tracks" msgstr "Toutes les pistes" #: ../bin/src/ui_networkremotesettingspage.h:194 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:196 msgid "Allow downloads" msgstr "Autoriser les téléchargements" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "Autoriser l'encodage mid/side" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "A côté des originaux" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Toujours cacher la fenêtre principale" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Toujours afficher la fenêtre principale" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "Toujours commencer à lire" #: internet/spotifyblobdownloader.cpp:60 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:61 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:663 #, 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/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "Une erreur inconnue est survenue." #: ui/about.cpp:78 msgid "And:" msgstr "Et :" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "En colère" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Apparence" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Ajouter des fichiers/URLs à la liste de lecture" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "Ajouter à la liste de lecture actuelle" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "Ajouter à la liste de lecture" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "Appliquer une compression pour prévenir les coupures" #: ui/equalizer.cpp:197 #, 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 »" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "Êtes-vous sur de vouloir supprimer cette liste de lecture ?" #: ui/edittagdialog.cpp:769 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:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Artiste" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Info artiste" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "Radio par artiste" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "Mots-clés de l'artiste" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "Initiale de l'artiste" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Format audio" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Échec de l'authentification" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "Auteur" #: ui/about.cpp:65 msgid "Authors" msgstr "Auteurs" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Auto" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Mise à jour automatique" #: ../bin/src/ui_librarysettingspage.h:208 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:45 msgid "Available" msgstr "Disponible" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "Débit moyen" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "Taille moyenne de l'image" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "Podcasts BBC" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "Bruits de fond" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Couleur de l'arrière-plan" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "Image d'arrière-plan" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Opacité de l'arrière-plan" #: core/database.cpp:734 msgid "Backing up database" msgstr "Sauvegarde de la base de données" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "Balance" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Je déteste" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "Spectrogramme à barres" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Bleu standard" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "Type audio basique" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Comportement" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "Meilleur" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "Biographie de %1" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Débit" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "Débit" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "Spectrogramme avec blocs" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "Type de bloc" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "Niveau de flou" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "Corps" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "Spectrogramme « Boom »" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Parcourir..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "Durée du tampon" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "Mise en mémoire tampon" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "Mais ces sources sont désactivées :" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Boutons" #: core/song.cpp:339 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "Support des CUE sheet." #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "Annuler" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Changer la couverture de l'album" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Changer la taille de la police..." #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "Changer le mode de répétition" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Changer le raccourci..." #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "Changer le mode aléatoire" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Changer la langue" #: ../bin/src/ui_playbacksettingspage.h:330 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:228 msgid "Check for new episodes" msgstr "Chercher de nouveaux épisodes" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Vérifier les mises à jour" #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "Choisissez un nom pour votre liste de lecture intelligente" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Choisir automatiquement" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Choisir une couleur..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "Choisir une police de caractères..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Choisir depuis la liste" #: smartplaylists/querywizardplugin.cpp:155 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." #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "Choisir le répertoire de téléchargement des podcasts" #: ../bin/src/ui_songinfosettingspage.h:188 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:115 msgid "Classical" msgstr "Classique" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "Nettoyage en cours" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Effacer" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Vider la liste de lecture" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Erreur de Clementine" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Orange Clémentine" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Visualisation Clementine" #: ../bin/src/ui_deviceproperties.h:376 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_boxsettingspage.h:104 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:104 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:104 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_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "Clementine peut jouer les morceaux que vous avez envoyé sur Ubuntu One" #: ../bin/src/ui_notificationssettingspage.h:431 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:250 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:128 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." #: internet/lastfmsettingspage.cpp:110 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 "Clementine ne peut récupérer le statut de votre abonnement car il y a des problèmes avec votre connexion. Les morceaux joués vont être mis en cache et seront envoyés plus tard à Last.fm." #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Visionneur d'images de Clementine" #: ../bin/src/ui_trackselectiondialog.h:206 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:210 msgid "Clementine will find music in:" msgstr "Clementine trouvera de la musique dans :" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Cliquez ici pour créer votre bibliothèque musicale" #: playlist/playlisttabbar.cpp:293 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:72 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_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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 Login pour ouvrir votre navigateur web. Vous devriez retourner dans Clementine après vous être connecté." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Fermer" #: playlist/playlisttabbar.cpp:54 msgid "Close playlist" msgstr "Fermer la liste de lecture" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "Fermer la visualisation" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "Fermer cette fenêtre annulera le téléchargement." #: ui/albumcovermanager.cpp:216 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:116 msgid "Club" msgstr "Club" #: ../bin/src/ui_appearancesettingspage.h:272 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:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Commentaire" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "Compléter les tags automatiquement" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "Compléter les tags automatiquement..." #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Compositeur" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "Configurer %1..." #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "Configurer Grooveshark..." #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Configurer Last.fm..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "Configurer Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Configurer les raccourcis clavier" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "Configurer Spotify…" #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "Configurer Subsonic..." #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "Configurer la recherche globale..." #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "Configurer votre bibliothèque..." #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "Configurer les podcasts..." #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "Configurer..." #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "Connecter Wii Remote en utilisant l'action activer/désactiver" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "Connexion du périphérique" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "Connexion à Spotify" #: internet/subsonicsettingspage.cpp:107 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/subsonicsettingspage.cpp:117 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/" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "Console" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "Débit constant" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "Convertir toutes les musiques" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "Convertir la musique que le périphérique ne peut pas lire" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "Copier dans le presse papier" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Copier sur le périphérique" #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Copier vers la bilbiothèque..." #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "Droit d'auteur" #: internet/subsonicsettingspage.cpp:81 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:64 #, 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." #: transcoder/transcoder.cpp:432 #, 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:426 #, 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/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "Impossible de charger la station radio last.fm" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "Impossible d'ouvrir le fichier de sortie %1" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Gestionnaire de pochettes" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "Pochette depuis une image embarquée" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Pochette automatiquement chargée depuis %1" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "Pochette désactivée manuellement" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "Pochette non définie" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "Pochette définie depuis %1" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "Pochettes depuis %1" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "Créer une nouvelle liste de lecture Grooveshark" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "Appliquer un fondu lors des changements de piste automatiques" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "Appliquer un fondu lors des changements de piste manuels" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "Personnalisé" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "Image personnalisée :" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "Paramètres de message personnalisé" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "Radio personnalisée" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Personnalisée..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "Chemin DBus" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Danse" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Date de création" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Date de modification" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "Jours" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "Dé&faut" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "Baisser le volume de 4%" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "Diminuer le volume de pour-cent" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Diminuer le volume" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "Image d'arrière-plan par défaut" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "Par défaut" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "Délai entre les visualisations" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "Supprimer" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "Supprimer la liste de lecture Grooveshark" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "Effacer les données téléchargées" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Supprimer les fichiers" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Supprimer du périphérique..." #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Supprimer du disque..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "Effacer les épisodes lus" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "Effacer le pré-réglage" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "Supprimer la liste de lecture intelligente" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "Supprimer les fichiers originaux" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Suppression des fichiers" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "Enlever les pistes sélectionnées de la file d'attente" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "Enlever cette piste de la file d'attente" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Destination" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Détails..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Périphérique" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Propriétés du périphérique" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Nom du périphérique" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Propriétés du périphérique..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Périphériques" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Essayez avec cette orthographe" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "Mot de passe Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "Nom d'utilisateur Digitally Imported" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "Connexion directe à Internet" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Dossier" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "Désactiver la durée" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "Désactiver la génération des barres d'humeur" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Désactivées" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "CD" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "Transmission discontinue" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 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:715 msgid "Do a full library rescan" msgstr "Refaire une analyse complète de la bibliothèque" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "Ne pas convertir la musique" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "Ne pas écraser" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Ne pas répéter" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "Ne pas classer dans la catégorie « Compilations d'artistes »" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "Aléatoire : désactivé" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "Ne pas arrêter !" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "Faire un don" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Double-cliquer pour ouvrir" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "Double-cliquer sur un morceau..." #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "Télécharger %n épisodes" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "Dossier de téléchargement" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "Télécharger les épisodes vers" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "Adhésion au téléchargement" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "Télécharger les nouveaux épisodes automatiquement" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "Téléchargement en file" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "Télécharger l'application Android" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Télécharger cet album" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Télécharger cet album..." #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "Télécharger cet épisode" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "Télécharger..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "Téléchargement (%1%)..." #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "Téléchargement du catalogue d'Icecast" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "Téléchargement du catalogue de Jamendo" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "Téléchargement du catalogue Magnatune" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "Téléchargement du module Spotify" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "Téléchargement des métadonnées" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "Déplacer pour repositionner" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "Dropbox" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "Le mode dynamique est activé" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "Mix aléatoire dynamique" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "Éditer la liste de lecture intelligente..." #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Modifer le tag « %1 »..." #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "Modifier le tag..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "Modifier les tags" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Modifier la description de la piste" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "Modifier la description de la piste..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Modifier la description des pistes..." #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Éditer..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "Activer le support Wii Remote" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "Activer l'égaliseur" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "Autoriser les raccourcis uniquement lorsque la fenêtre de Clementine est active" #: ../bin/src/ui_globalsearchsettingspage.h:147 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:62 msgid "Enable/disable Last.fm scrobbling" msgstr "Activer/désactiver le scrobbling Last.fm" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "Complexité de l’encodage" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "Qualité du moteur d’encodage" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "Mode d’encodage" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "Saisissez une URL" #: ../bin/src/ui_coverfromurldialog.h:103 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:205 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:137 msgid "Enter a new name for this playlist" msgstr "Saisissez un nom pour la liste de lecture" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Saisissez le nom d'un artiste ou n'importe quel tag pour écouter la radio Last.fm." #: ../bin/src/ui_globalsearchview.h:209 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:77 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:77 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:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "Saisissez les termes à rechercher ici" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "Saisissez l'adresse du flux d'une radio internet :" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "Saisissez le nom du dossier" #: ../bin/src/ui_networkremotesettingspage.h:198 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:87 msgid "Entire collection" msgstr "Collection complète" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Erreur" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Erreur durant la connexion au périphérique MTP" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "Erreur lors de la copie des morceaux" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "Erreur lors de la suppression des morceaux" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "Erreur lors du téléchargement du module Spotify" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "Erreur lors du chargement de %1" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Erreur du chargement de la liste de lecture di.fm" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "Erreur lors du traitement de %1 : %2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "Erreur durant le chargement du CD audio" #: library/library.cpp:63 msgid "Ever played" msgstr "Déjà joués" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "Toutes les 10 minutes" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "Toutes les 12 heures" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "Toutes les 2 heures" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "Toutes les 20 minutes" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "Toutes les 30 minutes" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "Toutes les 6 heures" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "Toutes les heures" #: ../bin/src/ui_playbacksettingspage.h:303 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:208 msgid "Existing covers" msgstr "Pochettes existantes" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "Agrandir" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "Expire au %1" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "Exporter les pochettes" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "Exporter les pochettes" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "Exporter les pochettes téléchargées" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "Exporter les pochettes intégrées" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "Export terminé" #: ui/albumcovermanager.cpp:786 #, 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:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 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:300 msgid "Fade out when stopping a track" msgstr "Terminer par un fondu quand une piste s'arrête" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "Fondu" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "Durée du fondu" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "La récupération du répertoire a échoué" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "La récupération des podcasts a échoué" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "Le chargement du podcast a échoué" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "La lecture du flux RSS a échoué" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "Rapide" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "Favoris" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "Pistes favorites" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "Récupérer les pochettes manquantes" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "Récupérer automatiquement" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "Téléchargement terminé" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "Récupération de la bibliothèque Subsonic" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Erreur lors de la récupération de la pochette" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "Extension de fichier" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "Formats de fichier" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Fichier" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "Fichier (sans le chemin)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Taille du fichier" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Type de fichier" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Nom du fichier" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Fichiers" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "Fichiers à convertir" #: smartplaylists/querywizardplugin.cpp:90 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." #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "Génération de l'empreinte audio" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "Terminé" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "Premier niveau" #: core/song.cpp:328 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Taille de la police" #: ../bin/src/ui_spotifysettingspage.h:213 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:204 msgid "Force mono encoding" msgstr "Forcer l’encodage en mono" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "Oublier ce périphérique" #: devices/deviceview.cpp:311 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 Clémentine à rechercher à nouveau tous les morceaux qu'il contient la prochaine fois que vous le connecterez." #: ../bin/src/ui_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Form" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "Format" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Images par seconde" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "Images par tampon" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Amis" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "Gelé" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Graves Max." #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "Graves + Aigus Max." #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "Aigus Max." #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "Moteur audio GStreamer" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "Général" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Configuration générale" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Genre" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "Obtenir une URL pour partager cette liste de lecture Grooveshark" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "Obtenir une URL pour partager ce morceau Grooveshark" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "Récupération des morceaux populaires Grooveshark" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "Récupération des canaux" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "Réception des flux" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "Donner un nom" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "Go" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "Aller à la liste de lecture suivante" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "Aller à la liste de lecture précédente" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, 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:206 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_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "Erreur lors de la connexion à Grooveshark" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "URL de la liste de lecture Grooveshark" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "Radio Grooveshark" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "URL du morceau Grooveshark" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "Grouper la Bibliothèque par..." #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "Grouper par" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "Grouper par Album" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "Grouper par Artiste" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "Grouper par Artiste/Album" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "Grouper par Artiste/Année - Album" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "Grouper par Genre/Album" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "Grouper par Genre/Artiste/Album" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "Groupement" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "La page HTML ne contenait pas de flux RSS" #: internet/subsonicsettingspage.cpp:135 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:163 msgid "HTTP proxy" msgstr "Serveur mandataire HTTP" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "Heureux" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "Informations sur le matériel" #: ../bin/src/ui_deviceproperties.h:372 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:202 msgid "High" msgstr "Élevé" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "Élevé (%1 fps)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "Élevé (1024x1024)" #: internet/subsonicsettingspage.cpp:112 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:310 msgid "Hours" msgstr "Heures" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "Crapaud hypnotique" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "Je ne possède pas de compte Magnatune" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Icône" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "Icônes au dessus" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "Identification du morceau" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 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:77 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:204 msgid "Ignore \"The\" in artist names" msgstr "Ignorer « The » dans les noms d'artiste" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "Dans %1 jours" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "Dans %1 semaines" #: ../bin/src/ui_wizardfinishpage.h:86 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/spotifyservice.cpp:360 msgid "Inbox" msgstr "Boîte de réception" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "Inclure la pochette de l'album dans la fenêtre de notification" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "Inclure tous les morceaux" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Incompatibilité du protocole Subsonic REST. Le client doit être mis à jour." #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Incompatibilité du protocole Subsonic REST. Le serveur doit être mis à jour." #: internet/subsonicsettingspage.cpp:127 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:158 msgid "Increase the volume by 4%" msgstr "Augmenter le volume de 4%" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "Augmenter le volume de pour-cent" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Augmenter le volume" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "Indexation de %1" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "Information" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "Insérer..." #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Installé" #: core/database.cpp:673 msgid "Integrity check" msgstr "Vérification de l'intégrité" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "Services de musique" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "API key invalide" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Format invalide" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "Méthode invalide" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "Paramètres invalides" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "Ressource spécifiée invalide" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "Service invalide" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "Clé de session invalide" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "Nom d'utilisateur et / ou mot de passe invalide" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "Morceaux les plus écoutés de Jamendo" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "Meilleurs morceaux Jamendo" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "Meilleurs morceaux Jamendo du mois" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "Meilleurs morceaux Jamendo de la semaine" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "Base de données Jamendo" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "Aller à la piste jouée actuellement" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Pressez le bouton pendant %1 seconde..." #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Pressez le bouton pendant %1 secondes..." #: ../bin/src/ui_behavioursettingspage.h:193 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:193 msgid "Keep the original files" msgstr "Conserver les fichiers originaux" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "Chatons" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Langue" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "Portable/Écouteurs" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Large Salle" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "Grande pochette d'album" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "Barre latérale large" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "Dernière écoute" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "Radio personnalisée Last.fm : %1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Last.fm Bibliothèque - %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "Radio Last.fm Mix - %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Last.fm Radio voisin - %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Station radio Last.fm - %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Artistes Last.fm similaires à %1" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Mot-clé pour la radio Last.fm: %1" #: internet/lastfmservice.cpp:437 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:154 msgid "Last.fm password" msgstr "Mot de passe" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "Nombre d'écoutes Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Tags Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Nom d'utilisateur" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Wiki Last.fm" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "Pistes les moins aimées" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "Laisser vide pour les paramètres par défaut. Exemples : \"/dev/dsp\", \"front\", etc." #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "Gauche" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Durée" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Bibliothèque" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "Groupement avancé de la bibliothèque" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "Avertissement de mise à jour de la bibliothèque" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "Rechercher dans la bibliothèque" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Limites" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "Écoutez des morceaux Grooveshark basé sur ce que vous avez écouté auparavant" #: ui/equalizer.cpp:123 msgid "Live" msgstr "En direct" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Charger" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "Charger une pochette à partir d'une URL" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "Charger une pochette à partir d'une URL..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "Charger la pochette depuis le disque" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "Charger la pochette depuis le disque..." #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "Charger une liste de lecture" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "Charger une liste de lecture..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Chargement de la radio Last.fm" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Chargement du périphérique MTP" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "Chargement de la base de données iPod" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "Chargement de la liste de lecture intelligente" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "Chargement des morceaux" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "Chargement du flux" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "Chargement des pistes" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "Chargement des info des pistes" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "Chargement..." #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "Charger des fichiers/URLs, et remplacer la liste de lecture actuelle" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Se connecter" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "Erreur lors de la connexion" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "Profil de prédiction à long terme (PLT)" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "J'aime" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Faible (%1 fps)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "Faible (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "Profile à faible complexité (FC)" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "Paroles" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "Paroles récupérées depuis %1" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Télécharger Magnatune" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Téléchargement Magnatune terminé" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "Profil principal (MAIN)" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "Voilà!" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "Rendre la liste de lecture accessible hors ligne" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "Réponse mal formatée" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "Configuration manuelle du serveur mandataire" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "Manuellement" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "Fabricant" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "Marquer comme lu" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "Marquer comme nouveau" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "Utiliser tous les termes de recherche (ET)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "Utiliser un ou plusieurs termes de recherche (OU)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "Débit maximum" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "Moyen (%1 fps)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "Moyen (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "Type d'adhésion" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "Débit minimum" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "Pré-réglages projectM manquants" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "Modèle" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "Surveiller les modifications de la bibliothèque" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "Lecture monophonique" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "Mois" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "Humeur" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "Style de la barre d'humeur" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "Barre d'humeur" #: library/library.cpp:74 msgid "Most played" msgstr "Les plus jouées" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "Point de montage" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "Points de montage" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "Déplacer vers le bas" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "Déplacer vers la bibliothèque..." #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "Déplacer vers le haut" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "Musique" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Bibliothèque musicale" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "Sourdine" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "Ma bibliothèque Last.fm" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "Ma radio mix Last.fm" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "Mes voisins Last.fm" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "Ma radio de recommandations Last.fm" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "Ma radio mix" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "Ma musique" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "Mon voisinage" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "Ma station de radio" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "Mes suggestions" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Nom" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "Options de nommage" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "Bande étroite (NB)" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "Voisins" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "Réseau" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "Serveur mandataire (proxy)" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "Contrôle à distance" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "Jamais" #: library/library.cpp:67 msgid "Never played" msgstr "Jamais joués" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "Ne jamais commencer à lire" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "Nouveau dossier" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "Nouvelle liste de lecture" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "Nouvelle liste de lecture intelligente..." #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "Nouveaux morceaux" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "De nouvelles pistes seront ajoutées automatiquement." #: library/library.cpp:80 msgid "Newest tracks" msgstr "Nouvelles pistes" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "Suivant" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Piste suivante" #: core/utilities.cpp:147 msgid "Next week" msgstr "La semaine prochaine" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "Désactiver le spectrogramme" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "Pas d'image d'arrière-plan" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "Aucune pochette à exporter." #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "Pas de bloc long" #: playlist/playlistcontainer.cpp:366 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:145 msgid "No short blocks" msgstr "Pas de bloc court" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "Aucun" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 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:155 msgid "Normal" msgstr "Normal" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "Type de bloc normal" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "Indisponible durant l'utilisation d'une liste de lecture dynamique" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "Déconnecté" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "Pas assez de contenu" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "Pas assez de fans" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "Pas assez de membres" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "Voisins insuffisants" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Non installé" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "Non connecté" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "Non monté – double-cliquez pour monter" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "Notifications" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Notifications" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Lecture en cours" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "Prévisualisation de l'affichage à l'écran (OSD)" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "Opacité" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "Ouvrir %1 dans le navigateur" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "Lire un CD &audio" #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "Ouvrir un fichier OPML" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "Ouvrir un fichier OPML..." #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "Ouvrir le périphérique" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "Ouvrir un fichier..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "Ouvrir dans Google Drive" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "Ouvrir dans une nouvelle liste de lecture" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Ouvrir..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "Opération échouée" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "Optimisation du débit" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "Optimisation de la qualité" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "Options…" #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "Organiser les fichiers" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "Organisation des fichiers..." #: core/organise.cpp:65 msgid "Organising files" msgstr "Organisation des fichiers" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "Tags originaux" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Autres options" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "Sortie" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "Périphérique de sortie" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "Options de sortie" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "Module de sortie" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "Tout écraser" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "Écraser les fichiers existants" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "Écraser uniquement les plus petits" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "Propriétaire" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "Analyse du catalogue Jamendo" #: ui/equalizer.cpp:124 msgid "Party" msgstr "Soirée" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "Mot de passe" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Pause" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "Mettre la lecture en pause" #: widgets/osd.cpp:156 msgid "Paused" msgstr "En pause" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "Interprète" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "Pixel" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "Barre latérale simple" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Lecture" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "Écouter une radio par artiste ou par tag" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "Écouter la radio d'un artiste..." #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "Compteur d'écoutes" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "Jouer une radio personnalisée..." #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "Lire ou mettre en pause, selon l'état courant" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "Lire s'il n'y a rien d'autre en cours de lecture" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "Écouter la radio à partir d'un tag..." #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "Jouer la ème piste de la liste de lecture" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "Lecture/Pause" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Lecture sonore" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Options du lecteur" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "Liste de lecture" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "Liste de lecture terminée" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "Options de la liste de lecture" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "Type de liste de lecture" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "Listes de lecture" #: ../data/oauthsuccess.html:36 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:214 msgid "Plugin status:" msgstr "État du module externe :" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "Podcasts" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Pop" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "Morceaux populaires" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "Morceaux populaires ce mois-ci" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "Morceaux populaires aujourd'hui" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "Durée d'affichage de la fenêtre" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "Port" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "Pré-ampli" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "Préférences" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "Préférences..." #: ../bin/src/ui_librarysettingspage.h:202 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:167 msgid "Preferred audio format" msgstr "Format audio préféré" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "Débit préféré" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "Format préféré" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "Type audio premium" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "Préréglage :" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "Appuyez sur une combinaison de touches à utiliser pour" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "Appuyez sur une touche" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Appuyez sur une combinaison de touches à utiliser pour %1..." #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "Options de l'affichage à l'écran (OSD)" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "Aperçu" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "Précédent" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 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:131 msgid "Profile" msgstr "Profil" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "Progression" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 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:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "Qualité" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "Interrogation périphérique" #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "Gestionnaire de file d'attente" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "Mettre les pistes sélectionnées en liste d'attente" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "Mettre cette piste en liste d'attente" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "Radio (volume égalisé pour toutes les pistes)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "Radios" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "Pluie" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "Visualisation aléatoire" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "Noter ce morceau 0 étoile" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "Noter ce morceau 1 étoile" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "Noter ce morceau 2 étoiles" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "Noter ce morceau 3 étoiles" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "Noter ce morceau 4 étoiles" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "Noter ce morceau 5 étoiles" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "Note" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "Êtes-vous sûr de vouloir annuler ?" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "Limite de redirection excédée, vérifiez la configuration serveur." #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "Mettre à jour" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "Mettre à jour le catalogue" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "Mettre à jour les canaux" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "Actualiser la liste d'amis" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "Mettre à jour la liste des stations" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "Actualiser les flux" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Reggae" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "Mémoriser le mouvement de la Wiimote" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "Se souvenir de la dernière fois" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Supprimer" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "Effacer l'action" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "Supprimer les doublons de la liste de lecture" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "Supprimer un dossier" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "Supprimer de ma musique" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "Supprimer des favoris" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "Supprimer de la liste de lecture" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "Supprimer la liste de lecture" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "Supprimer les listes de lecture" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "Suppression des morceaux de ma musique" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "Suppression des morceaux des favoris" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "Renommer la liste de lecture « %1 »" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "Renommer cette liste de lecture Grooveshark" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "Renommer la liste de lecture" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "Renommer la liste de lecture..." #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "Renuméroter les pistes dans cet ordre..." #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Répéter" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "Répéter l'album" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "Répéter la liste de lecture" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "Répéter la piste" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Remplacer la liste de lecture actuelle" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "Remplacer la liste de lecture" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "Remplace les espaces par des tiret-bas" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "Replay Gain" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "Mode du Replay Gain" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "Repeupler" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "Exiger un code d'authentification" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "Réinitialiser" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" msgstr "Réinitialiser le compteur de lecture" #: 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:206 msgid "Restrict to ASCII characters" msgstr "Limiter aux caractères ASCII" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "Redémarrer la lecture au démarrage" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "Récupération des morceaux Grooveshark Ma musique" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "Récupération des morceaux Grooveshark favoris" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "Récupération des listes de lecture Grooveshark" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "Retourner dans Clementine" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "Droite" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "Lancer" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "Serveur mandataire SOCKS" #: internet/subsonicsettingspage.cpp:122 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:202 msgid "Safely remove device" msgstr "Enlever le périphérique en toute sécurité" #: ../bin/src/ui_organisedialog.h:196 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:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "Échantillonnage" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "Échantillonnage" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "Enregistrez les fichiers .mood dans la bibliothèque" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "Sauvegarder les couvertures d'albums" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "Enregistrer la pochette sur le disque..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "Enregistrer l'image" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "Enregistrer la liste de lecture" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "Enregistrer la liste de lecture..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "Enregistrer pré-réglages" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "Enregistrer les notes dans les tags du fichier si possible" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "Enregistrer les statistiques dans les tag du fichier si possible" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "Sauvegarder ce flux dans l'onglet Internet" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "Enregistrement des statistiques dans les fichiers des morceaux" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "Sauvegarde des pistes" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "Profil du taux d'échantillonnage" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "Taille redimensionnée" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "Score" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "Envoyer les titres des pistes que j'écoute (scrobble)" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "Recherche" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "Rechercher des stations Icecast" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "Recherche Jamendo" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Recherche Magnatune" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "Recherche Subsonic" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "Chercher des pochettes pour cet album..." #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "Recherche globale" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "Rechercher sur gpodder.net" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "Rechercher iTunes" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "Mode de recherche" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "Options de recherche" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "Résultats de recherche" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "Termes de recherche" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "Recherche sur Grooveshark" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "Deuxième niveau" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "Reculer" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "Avancer" #: core/commandlineoptions.cpp:163 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:162 msgid "Seek the currently playing track to an absolute position" msgstr "Déplacer la lecture de la piste courante à une position absolue" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "Tout sélectionner" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "Ne rien sélectionner" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "Sélectionner la couleur d'arrière-plan :" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "Sélectionner une image d'arrière-plan" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "Sélectionner le meilleur résultat possible" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "Sélectionner la couleur d'avant-plan :" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "Sélectionner visualisation" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "Sélectionner visualisation..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "Numéro de série" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "URL du serveur" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "Détails du serveur" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "Service hors-ligne" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Définir %1 à la valeur « %2 »..." #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "Définir le volume à pourcents" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "Définir une valeur pour toutes les pistes sélectionnées..." #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "Paramètres" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Raccourci" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "Raccourci pour %1" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Le raccourci pour %1 existe déjà" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Afficher" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "Afficher l'OSD" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "Mettre en surbrillance la piste en lecture" #: ../bin/src/ui_appearancesettingspage.h:293 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:434 msgid "Show a native desktop notification" msgstr "Utiliser le système de notification du bureau" #: ../bin/src/ui_notificationssettingspage.h:442 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:441 msgid "Show a notification when I change the volume" msgstr "Afficher une notification lorsque je change le volume" #: ../bin/src/ui_notificationssettingspage.h:436 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:435 msgid "Show a pretty OSD" msgstr "Utiliser l'affichage à l'écran (OSD)" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "Afficher au dessus de la barre d'état" #: ui/mainwindow.cpp:460 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:209 msgid "Show cover art in library" msgstr "Afficher les pochettes des albums dans la bibliothèque" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "Afficher les séparateurs" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "Afficher en taille réelle..." #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "Afficher dans le navigateur de fichiers" #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "Classer dans la catégorie « Compilations d'artistes »" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "Afficher la barre d'humeur" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "Afficher uniquement les doublons" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "Afficher uniquement les morceaux sans tag" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "Afficher les suggestions de recherche" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "Afficher les boutons « j'aime » et « je déteste »" #: ../bin/src/ui_lastfmsettingspage.h:158 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:192 msgid "Show tray icon" msgstr "Afficher l'icône dans la zone de notifications" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "Afficher quelles sources sont activées et désactivées" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "Afficher/Masquer" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Aléatoire" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "Aléatoire : albums" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "Aléatoire : tout" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "Mélanger la liste de lecture" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "Aléatoire : pistes de cet album" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "S'inscrire" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "Se déconnecter" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "Connexion..." #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "Artistes similaires" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "Taille" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "Taille :" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "Lire la piste précédente" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "Compteur de morceaux sautés" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "Lire la piste suivante" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "Petite pochette d'album" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "Petite barre latérale" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "Liste de lecture intelligente" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "Listes de lecture intelligentes" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "Informations sur le morceau" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "Info morceau" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "Sonogramme" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "Désolé" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "Trier par genre (ordre alphabétique)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "Trier par genre (par popularité)" #: ../bin/src/ui_icecastfilterwidget.h:77 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" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "Source" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "Sources" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "Erreur lors de la connexion à Spotify" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "Module externe Spotify" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "Le module externe de Spotify n'est pas installé" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "Standard" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "Favoris" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "Commencer la liste de lecture jouée actuellement" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "Démarrer transcodage" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 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:405 #, qt-format msgid "Starting %1" msgstr "Lancement de %1" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "Démarrage..." #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "Stations" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Stop" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "Arrêter après" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "Arrêter la lecture après cette piste" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Arrêter la lecture" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "Arrêter la lecture après ce morceau" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "Interrompu" #: core/song.cpp:341 msgid "Stream" msgstr "Flux" #: internet/subsonicsettingspage.cpp:30 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:160 msgid "Streaming membership" msgstr "Membres de streaming" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "Listes de lecture abonnées" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "Abonnés" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "Succès !" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "%1 écrit avec succès" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "Tags suggérés" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "Résumé" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "Très élevé (%1 fps)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "Très élevé (2048x2048)" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "Formats supportés" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "Synchroniser les statistiques vers les fichiers maintenant" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "Synchronisation de la boîte de réception Spotify" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "Synchronisation de la liste de lecture Spotify" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "Synchronisation des morceaux Spotify préférés" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "Couleurs du système" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "Onglets au dessus" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Tag" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "Compléteur de balises" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "Radio par tag" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "Débit cible" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "Options du texte" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Merci à" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "La commande « %1 » ne peut pas être démarrée." #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "La pochette d'album de la piste courante" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "Le répertoire %1 est invalide" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "La liste de lecture « %1 » est vide ou ne peut être chargée" #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "Le site demandé n'est pas une image !" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "Il y a d'autres morceaux dans cet album" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "Problème lors de la communication avec gpodder.net" #: internet/magnatunedownloaddialog.cpp:158 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" #: podcasts/itunessearchpage.cpp:76 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:56 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "Il y a un problème pour copier certains morceaux. Les fichiers suivant n'ont pas été copiés:" #: ui/organiseerrordialog.cpp:61 msgid "" "There were problems deleting some songs. The following files could not be " "deleted:" msgstr "Il y a un problème pour supprimer certains morceaux. Les fichiers suivant n'ont pas été supprimés:" #: devices/deviceview.cpp:389 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:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 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:187 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:174 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:151 msgid "Third level" msgstr "Troisième niveau" #: internet/jamendoservice.cpp:171 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/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "Cet album n'est pas disponible dans le format demandé" #: ../bin/src/ui_deviceproperties.h:381 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 supporte." #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "Ce périphérique supporte les formats suivant :" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Ce périphérique ne fonctionne pas correctement" #: devices/devicemanager.cpp:567 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:324 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:186 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/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "Ce flux n'est accessible qu'aux abonnés ayant payé" #: devices/devicemanager.cpp:587 #, 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_songinfosettingspage.h:185 msgid "Timeout" msgstr "Délai d'expiration" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Titre" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "Pour démarrer la radio Grooveshark, vous devez d'abord écouter quelques morceaux Grooveshark" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "Aujourd'hui" #: core/globalshortcuts.cpp:59 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:1369 msgid "Toggle queue status" msgstr "Basculer l'état de la file d'attente" #: ../bin/src/ui_mainwindow.h:718 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:143 msgid "Tomorrow" msgstr "Demain" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "Trop de redirections" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "Top titres" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "Total albums :" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "Nombre total d'octets transférés" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "Nombre total de requêtes réseau effectuées" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Piste" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "Transcoder de la musique" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "Journal du transcodeur" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "Transcodage" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Transcodage de %1 fichiers en utilisant %2 threads" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "Option de transcodage" #: core/song.cpp:338 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "Spectrogramme « Turbine »" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "Éteindre" #: devices/giolister.cpp:161 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "URL(s)" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "Mot de passe Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "Nom d'utilisateur Ubuntu One" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "Très large bande (UWB)" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Impossible de télécharger %1 (%2)" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Inconnu" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "Type de contenu inconnu" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Erreur de type inconnu" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "Enlever cette pochette" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "Se désinscrire" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "Concerts à venir" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "Mise à jour de la liste de lecture Grooveshark" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "Mettre à jour tous les podcasts" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "Mettre à jour les dossiers de la bibliothèque" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "Mettre à jour la bibliothèque quand Clementine démarre" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "Mettre à jour ce podcast" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "Mise à jour" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Mise à jour %1" #: devices/deviceview.cpp:103 #, 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:150 msgid "Usage" msgstr "Usage" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "Utiliser le tag Album Artist lorsqu'il est disponible" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "Utiliser les raccourcis de touches de Gnome" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "Utiliser la métadonnée Replay Gain si disponible" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "Utiliser SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "Utiliser Wii Remote" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "Utiliser un assortiment de couleurs personnalisé" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "Utiliser un message personnalisé pour les notifications" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "Utiliser le contrôle à distance" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "Utiliser l'authentification" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "Utiliser le moteur de gestion du débit" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "Utiliser le mode dynamique" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "Utiliser des notifications pour signaler l'état de la Wiimote" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "Utiliser le mode de changement temporaire du bruit" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "Utiliser la langue par défaut du système" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "Utiliser l'assortiment de couleurs du système" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "Utiliser les paramètres du système pour le serveur mandataire" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "Utiliser la normalisation de volume" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "Utilisé" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "L'utilisateur %1 n'a pas de compte Grooveshark Anywhere" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "Interface utilisateur" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Nom d'utilisateur" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "Utiliser le menu pour ajouter un morceau va..." #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "MP3 VBR" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "Débit variable" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "Compilations d'artistes" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "Version %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "Vue" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "Mode de visualisation" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "Visualisations" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "Paramètres de Visualisations" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "Détecteur d’activité vocale" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "Volume %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 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:337 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "Site Web" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "Semaines" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "Quand Clementine démarre" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "Quand la liste est vide..." #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "Pourquoi ne pas essayer..." #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "Large bande (WB)" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wiimote %1 : activée" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wiimote %1 : connectée" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wiimote %1 : pile critique (%2 %) " #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wiimote %1 : désactivée" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wiimote %1 : déconnectée" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wiimote %1 : pile faible (%2 %)" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "audio Windows Media" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "Sans pochette :" #: library/libraryview.cpp:530 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:2088 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:151 msgid "Write all songs statistics into songs' files" msgstr "Enregistrer toutes les statistiques dans les fichiers des morceaux" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "Nom d'utilisateur et/ou mot de passe invalide." #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "Année" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "Année - Album" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "Années" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "Hier" #: ../bin/src/ui_magnatunedownloaddialog.h:132 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:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "Vous allez supprimer %1 listes de lectures de vos favoris. Êtes-vous sûr ?" #: playlist/playlisttabbar.cpp:177 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 être annulée).\nÊtes-vous sur de vouloir continuer ?" #: ../bin/src/ui_loginstatewidget.h:172 msgid "You are not signed in." msgstr "Vous n'êtes pas connecté." #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "Vous êtes connecté en tant que %1." #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "Vous êtes connecté." #: ../bin/src/ui_groupbydialog.h:123 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/digitallyimportedsettingspage.cpp:46 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/magnatunesettingspage.cpp:53 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:57 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." #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "Vous pouvez scrobbler des pistes gratuitement, mais seuls les abonnements payants peuvent écouter la radio Last.fm de Clementine." #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "Vous n'avez pas de compte Grooveshark Anywhere." #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Vous n'avez pas de compte Spotify Premium." #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "Vous n'avez pas d'abonnement actif" #: internet/spotifyservice.cpp:170 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/spotifysettingspage.cpp:158 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:87 msgid "You love this track" msgstr "Vous aimez cette piste" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "Vous devez lancer les Préférences Système et activer l'option «  Activer l'accès pour les dispositifs d'assistance » pour utiliser les raccourcis globaux de Clementine." #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "Vous devez redémarrer Clementine si vous changez de langue." #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "Vous ne pourrez pas écouter les stations radios de Last.fm puisque vous n’êtes pas abonné à Last.fm." #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "Votre adresse IP :" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Vos identifiants Last.fm sont incorrects" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "Vos identifiants Magnatune sont incorrects" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "Votre bibliothèque est vide !" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "Vos flux radio" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "Vos scrobbles : %1" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Votre système n'est pas compatinle avec OpenGL, les visualitions ne sont pas disponibles." #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "Votre nom d'utilisateur ou mot de passe est incorrect." #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Zéro" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "ajouter %n morceaux" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "après" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "il y a" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "et" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "automatique" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "avant" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "compris entre" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "le plus gros en premier" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "contient" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "désactivé" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "CD %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "ne contient pas" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "se termine par" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "est égal à" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "gpodder.net" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "Répertoire gpodder.net" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "supérieur à" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "parmi les derniers" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "inférieur à" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "le plus long en premier" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "déplacer %n morceaux" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "le plus récent en premier" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "différent de" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "avant les derniers" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "Pas sur" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "le plus ancien en premier" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "sur" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "options" #: ../bin/src/ui_networkremotesettingspage.h:203 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:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "enlever %n morceaux" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "le plus court en premier" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "mélanger les morceaux" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "le plus petit en premier" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "trier les morceaux" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "commence par" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "stop" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "piste %1" clementine-1.2.0+dfsg/src/translations/ga.po000066400000000000000000004070351223327513400210260ustar00rootroot00000000000000# 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" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:08+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Irish (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr "lá" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " pt" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr "soicindí" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "amhráin" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 albaim" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 lá" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 lá ó shin" #: podcasts/gpoddersync.cpp:79 #, qt-format msgid "%1 on %2" msgstr "%1 ar %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "" #: playlist/playlistmanager.cpp:413 #, qt-format msgid "%1 selected of" msgstr "%1 roghnaithe de" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 amhrán" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 amhráin" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 amhráin aimsithe" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 amhráin aimsithe (ag taispeáint %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 rianta" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 aistrithe" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "%comhadainm%" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n teipthe" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n críochnaithe" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "&Saincheaptha" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "&Breiseáin" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "&Cabhair" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "&Folaigh %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "&Folaigh..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Clé" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "&Ceol" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Dada" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Scoir" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Deas" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "&Sín colúin chun an fhuinneog a líonadh" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "&Uirlisí" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(éagsúil trasna iliomad amhráin)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 lá" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 rian" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 rianta fánacha" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "Tá cuntas Grooveshark Anywhere de dhíth." #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:78 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:153 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "Maidir le %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "Maidir le Clementine..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "Maidir le Qt..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Sonraí an chuntais" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "Sonraí an chuntais (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Gníomh" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Gníomhachtaigh/díghníomhachtaigh Wiiremote" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "Cuir podchraoladh leis" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Cuir sruth leis" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "Cuir gníomh leis" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Cuir sruth eile leis..." #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Cuir comhadlann leis..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "Cuir comhad leis" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Cuir comhad leis..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Cuir fillteán leis" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Cuir fillteán leis..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Cuir fillteán nua leis..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "Cuir podchraoladh leis" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "Cuir podchraoladh leis..." #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Cuir ní cuardaigh leis" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Cuir sruth leis..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "Cuir leis an scuaine" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Cuir leis..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Curtha leis an mhí seo" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Curtha leis an tseachtain seo" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Curtha leis i mbliana" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Curtha leis inniu" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Curtha leis laistigh de trí mhí" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "I ndiaidh" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "I ndiaidh macasamhlú..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Albam" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Ealaíontóir an albaim" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "Clúdach an Albaim" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Faisnéis an albaim ar jamendo.com..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Albaim le clúdaigh" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Albaim gan clúdaigh" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Gach Comhad (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Gach albam" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Gach ealaíontóir" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "Gach comhad (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "" #: ui/about.cpp:74 msgid "All the translators" msgstr "Na haistritheoirí uile" #: library/library.cpp:84 msgid "All tracks" msgstr "Gach rian" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Folaigh an phríomhfhuinneog i gcónaí" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Taispeáin an phríomhfhuinneog i gcónaí" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "Tosaigh ag seinm i gcónaí" #: internet/spotifyblobdownloader.cpp:60 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:61 msgid "An error occurred loading the iTunes database" msgstr "" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:78 msgid "And:" msgstr "Agus:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Cuma" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Ealaíontóir" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Theip ar an bhfíordheimhniú" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "Údar" #: ui/about.cpp:65 msgid "Authors" msgstr "Údair" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Uathoibríoch" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Nuashonrúchán uaithoibríoch" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "Ar fáil" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "Podchraoltaí an BBC" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "Sruthanna sa chúlra" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Dath an chúlra" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "Íomhá an chúlra" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Teimhneacht an chúlra" #: core/database.cpp:734 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Toirmisc" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Iompar" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "Is Fearr" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "Beathaisnéis ó %1" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "Corp" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Siortaigh..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Cnaipí" #: core/song.cpp:339 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "Cealaigh" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Athraigh ealaíon an chlúdaigh" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Athraigh méid na clófhoirne" #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Athraigh an t-aicearra" #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Athraigh an teanga" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "Lorg cláir nua" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Lorg nuashonruithe..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Roghnaigh go huathoibríoch" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Roghnaigh dath..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "Roghnaigh clófhoireann..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "" #: ui/equalizer.cpp:115 msgid "Classical" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "Ag glanadh" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Glan" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Botún Clementine" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Clementine Orange" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Amharcléiriú Clementine" #: ../bin/src/ui_deviceproperties.h:376 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:431 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:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: internet/lastfmsettingspage.cpp:110 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 "" #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Amharcóir íomhánna Clementine" #: ../bin/src/ui_trackselectiondialog.h:206 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:210 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Brúigh anseo chun ceol a chuir leis" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "Cealófar an t-íosluchtú má dhúntar an fhuinneog seo" #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:116 msgid "Club" msgstr "Club" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Colors" msgstr "Dathanna" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Trácht" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "Críochnaigh clibeanna go huathoibríoch" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "Críochnaigh clibeanna go huathoibríoch" #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Cumadóir" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "" #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "Cumraigh Grooveshark..." #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Cumraigh Last.fm..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "Cumraigh Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Cumraigh Aicearraí" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "Cumraigh Spotify..." #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "Cumraigh leabharlann..." #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "Cumraigh podchraoltaí..." #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "Cumraigh..." #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "Nasc gléas" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "Ag nascadh le Spotify" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "Tiontaigh gach ceol" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "Tiontaigh ceol ar bith nach féidir leis an ngléas a sheinm" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "Macasamhlaigh go dtí an ngearrthaisce" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Macasamhlaigh go gléas..." #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Macasamhlaigh go leabharlann..." #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "Cóipcheart" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:64 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: transcoder/transcoder.cpp:432 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "Clúdaithe ó %1" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Síos" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Iomlaoid+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "Saincheaptha" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "Íomhá shaincheaptha:" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Saincheaptha..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Damhsa" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Dáta ar a chruthaíodh é" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Dáta ar a athraíodh é" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "Lá" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "Réamhshocrú" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Laghdaigh an airde" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "Íomhá réamhshocraithe an chúlra" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "Réamhshocruithe" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "Scrios sonraí íosluchtaithe" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Scrios comhaid" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Scrios ón ngléas..." #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Scrios ón ndiosca..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "Scrios eagráin a seinneadh" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "Scrios na comhaid bhunaidh" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Ag scriosadh comhaid" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "Bain an rian as an scuaine" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Sprioc" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Sonraí..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Gléas" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Airíonna an ghléis" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Ainm an ghléis" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Airíonna an ghléis..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Gléasanna" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "An é seo a bhí ar intinn agat" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Comhadlann" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Díchumasaithe" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Diosca" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "Roghanna taispeána" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "Ná tiontaigh ceol ar bith" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Ná déan arís" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "Ná stad!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Brúigh faoi dhó chun é a oscailt" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "" #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "Íosluchtaigh %n eagráin" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "Íosluchtaigh an chomhadlann" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "Íosluchtaigh eagráin chuig" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "Íosluchtaigh eagráin nua go huathoibríoch" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "Tá an t-íosluchtú i scuaine" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Íosluchtaigh an t-albam seo" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Íosluchtaigh an t-albam seo..." #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "Íosluchtaigh an t-eagrán seo" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "Íosluchtaigh..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "Ag íosluchtú (%1%)..." #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "Ag íosluchtú an breiseán do Spotify" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "Ag íosluchtú meiteashonraí" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "Cuir clib in eagar..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "" #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "" #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Eagar..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "Cumasaigh cothromóir" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "Cuir isteach URL" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "An cnuasach ar fad" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Botún" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:63 msgid "Ever played" msgstr "A seinneadh riamh" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "Gach 10 nóiméid" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "Gach 12 uair" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "Gach 2 uaire" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "Gach 20 nóiméid" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "Gach 30 nóiméid" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "Gach 6 uair" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "Gach uair" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "Fairsingigh" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "Éagann sé ar an %1" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "Theip air an podchraoladh a luchtú" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "Gasta" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "Na cinn is fearr leat" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "Na rianta is fearr leat" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "Iarmhír comhadainm" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Comhadainm" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Méid comhaid" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Cineál comhad" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Comhadainm" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Comhaid" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:90 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ú." #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "Críochnaigh" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "An chéad airde" #: core/song.cpp:328 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Méid na clófhoirne" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "Déan dearmad faoin ngléas" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Foirm" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "Formáid" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Cairde" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Dord iomlán" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "Coiteann" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Socruithe coiteann" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "Ag fáil bealaí" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "Ag fáil sruthanna" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "Tabhair ainm dó:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "Téigh" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "Aicmigh an leabharlann de réir..." #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "Aicmigh de réir" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "Aicmigh de réir albam" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "Aicmigh de réir ealaíontóir" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "Aicmigh de réir ealaíontóir/albam" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "Aicmigh de réir ealaíontóir/bliain - albam" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "Seachfhreastalaí HTTP" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "Faisnéis an innealra" #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "Ard" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "Ard (%1 fps)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "Ard (1024x1024)" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "Uair" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "Níl cuntas Magnatune agam" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Deilbhín" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "Deilbhíní ar barr" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "Ag aithint an t-amhrán" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Íomhánna (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "Bosca Isteach" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "Iniaigh gach amhrán" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Méadaigh an airde" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "Eolas" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "Ionsáigh..." #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Suiteáilte" #: core/database.cpp:673 msgid "Integrity check" msgstr "Dearbháil sláine" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Idirlíon" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "Soláthraithe idirlín" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "Bunachar sonraí Jamendo" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "Léim chuig an rian atá á seinm faoi láthair" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "Coinnigh na comhaid bhunaidh" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Teanga" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "Ríomhaire glúine/Cluasáin" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Halla mór" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "Clúdach albaim mór" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "An ceann deiridh a seinneadh" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Leabharlann Last.fm - %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "" #: internet/lastfmservice.cpp:437 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:154 msgid "Last.fm password" msgstr "Focal faire Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Clibeanna Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Aga" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Leabharlann" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "Cuardach leabharlainne" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Teorainneacha" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "Éist le hamhráin Grooveshark bunaithe ar amhráin ar éist tú le cheana" #: ui/equalizer.cpp:123 msgid "Live" msgstr "Beo" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Luchtaigh" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "Luchtaigh clúdach ó URL" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "Luchtaigh clúdach ó URL..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "" #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Ag luchtú craolachán Last.fm" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Ag luchtú gléas MTP" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "Ag luchtú bunachar sonraí iPod" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "Ag luchtú amhráin" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "Ag luchtú sruth" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "Ag luchtú rianta" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "Ag luchtú..." #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Síniú isteach" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "Grá" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "Íseal (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "Liricí ó %1" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Íosluchtú Magnatune" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Chríochnaigh an t-íosluchtú Magnatune" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "Bíodh sé mar sin!" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "De láimh" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "Déantúsóir" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "Rianaigh mar éiste" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "Rianaigh mar nua" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "Meánach (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "Samhail" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "Míonna" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "" #: library/library.cpp:74 msgid "Most played" msgstr "Na cinn is mó a seinneadh" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "Bog síos" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "Bog go dtí an leabharlann..." #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "Bog suas" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "Ceol" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Leabharlann cheoil" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "Balbhaigh" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "Mo Leabharlann Last.fm" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "Mo Chomharsanacht" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "Mo Mholtaí" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Ainm" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "Roghanna aimniúcháin" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "Comharsain" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "Líonra" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "Choíche" #: library/library.cpp:67 msgid "Never played" msgstr "Nár seinneadh riamh" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "Ná tosaigh ag seinm riamh" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "Amhráin nua" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "Cuirfear rianta nua leis go huathoibríoch" #: library/library.cpp:80 msgid "Newest tracks" msgstr "Na rianta is nuaí" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "Ar aghaidh" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Rian ar aghaidh" #: core/utilities.cpp:147 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "Gan anailíseoir" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "Gan íomhá sa chúlra" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:366 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "Dada" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "Gan cheangail" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "Níl dóthain comhaltaí ann" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Níl sé suiteáilte" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "Níl tú sínithe isteach" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "Cineál fógra" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Fógraí" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Ag seinm anois" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "Oscail %1 i líonléitheoir" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "" #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "Oscail gléas" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "Oscail comhad..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Oscail..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "Theip ar an oibríocht" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "Barrfheabhsaigh i gcomhair caighdeán" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "Roghanna" #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "Eagraigh comhaid" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "Eagraigh comhaid..." #: core/organise.cpp:65 msgid "Organising files" msgstr "Ag eagrú comhaid" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "Clibeanna bunaidh" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Roghanna eile" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "Roghanna aschuir" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "Forscríobh ar chomhaid atá ann cheana" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "Sealbhóir" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:124 msgid "Party" msgstr "Cóisir" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "Focal faire" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Cuir ar sos" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "Cuir athsheinm ar sos" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Curtha ar sos" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Seinn" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "Seinn Ealaíontóir nó Clib" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "" #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "" #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "Seinn mura bhfuil aon rud eile ag seinm cheana féin" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "Seinn/Cuir ar sos" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Athsheinm" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Roghanna an tseinnteora" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "Podchraoltaí" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "Amhráin mhóréilimh" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "Amhráin ar a bhfuil móréilimh orthu inniu" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "Port" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "Sainroghanna" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "Sainroghanna..." #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "Réamhshocraithe:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "Brúigh cnaipe" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "Réamhamharc" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "Roimhe" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 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:131 msgid "Profile" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "Dul chun cinn" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 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:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "Caighdeán" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "Bainisteoir na Scuaine" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "Cuir na rianta roghnaithe i scuaine" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "Cuir an rian i scuaine" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "Craolacháin" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "Báisteach" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "Amharcléiriú fánach" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "Cealaigh i ndáiríre?" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "Athnuaigh" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "Athnuaigh na bealaí" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "Athnuaigh na sruthanna" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Reggae" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Bain" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "Bain gníomh" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "Bain fillteán" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Athsheinn" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "Athsheinn an t-albam" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "Athsheinn an rian" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "Athshocraigh" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" 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:206 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Rac" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "Bain an gléas go sábháilte" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "Cuir an íomhá i dtaisce" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "" #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "Cuardaigh" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "Cuardaigh Jamendo" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Cuardaigh Magnatune" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "Cuardaigh i gcomhair aon rud" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "Cuardaigh gpodder.net" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "Cuardaigh iTunes" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "Roghanna cuardaithe" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "Ag cuardach ar Ghrooveshark" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "An dara airde" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "Aimsigh siar" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "Aimsigh ar aghaidh" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "Roghnaigh uile" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "Ná roghnaigh ceann ar bith" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "Roghnaigh dath an chúlra:" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "Roghnaigh íomhá don cúlra" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "Roghnaigh dath an tulra:" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "Roghnaigh amharcléirithe" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "Roghnaigh amharcléirithe..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "Sraithuimhir" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Socraigh %1 go \"%2\"..." #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "Socraigh an airde chuig faoin gcéad" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "Socraigh luach do gach rian roghnaithe..." #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Aicearra" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "Aicearra do %1" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Tá an t-aicearra do %1 ann cheana" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Taispeáin" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 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:436 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:460 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:209 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "Taispeáin roinnteoirí" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "Taispeáin lánmhéid..." #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "Taispeáin i siortaitheoir na gcomhad..." #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "Taispeáin na cinn nach bhfuil clib orthu amháin" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "Taispeáin na cnaipí \"grá\" agus \"toirmisc\"" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "Táispeáin deilbhín an tráidire" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "Taispeáin/Folaigh" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Seinn go fánach" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "Seinn na halbaim go fánach" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "Seinn uile go fánach" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "Seinn go fánach na rianta san albam seo" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "Sínigh isteach" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "Scoir" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "Ag síniú isteach..." #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "Ealaíontóirí cosúla" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "Clúdach albaim beag" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Bog" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "Rac bog" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "Faisnéis an amhráin" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "Faisnéis an amhráin" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "Is dona linn" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 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 "" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "Foinse" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "Foinsí" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "Breiseán Spotify" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "Níl an breiseán Spotify suiteáilte" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "Caighdeánach" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "Réalt curtha leis" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "Ag tosú %1" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "Ag tosú..." #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "Ionaid fhoirleata" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Stad" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "Stad i ndiaidh" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "Stad i ndiaidh an rian seo" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Stad an athsheinm" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "Stad ag seinm i ndiaidh an rian reatha" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "Stadtha" #: core/song.cpp:341 msgid "Stream" msgstr "Sruth" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "Clibeanna molta" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "Achoimre" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "Sár-ard (2048x2048)" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "Clibeanna ar barr" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Clib" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "Roghanna téacs" #: ui/about.cpp:70 msgid "Thanks to" msgstr "A bhuí le" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "Clúdadh an albaim den amhrán atá á seinm faoi láthair" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "Ní comhadlann bailí í %1" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "" #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "Ní íomhá é an láithreán a iarr tú air!" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "Tá amhráin san albam seo" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:56 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:389 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:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:174 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:151 msgid "Third level" msgstr "An triú airde" #: internet/jamendoservice.cpp:171 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Níl an gléas ag feidhmiú i gceart" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "Sos" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Teideal" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "Chun craolachán Grooveshark a thosú, ba chóir duit éisteacht le roinnt amhráin eile ó Ghrooveshark" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "Inniu" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Scoránaigh lánscáileán" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "Líon iomlán na bearta aistrithe" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Rian" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "" #: core/song.cpp:338 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "Múch" #: devices/giolister.cpp:161 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "URL(anna)" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Níorbh fhéidir %1 a íosluchtú (%2)" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Anaithnid" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Botún anaithnid" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "Díshocraigh an clúdach" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "Nuashonraigh gach podchraoladh" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "Nuashonraigh an podchraoladh seo" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "Ag nuashonrú" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Ag nuashonrú %1" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "Ag nuashonrú %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Ag nuashonrú an leabharlann" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "Úsáid" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "Bain feidhm as Wii Remote" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "Bain feidhm as tacair dhathanna shaincheaptha" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "Bain feidhm as réamhshocrú an chórais" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "Caite" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "Comhéadan" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Ainm úsáideora" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "Ealaíontóirí éagsúla" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "Leagan %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "Amharc" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "Amharcléirithe" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "Socruithe amharcléirithe" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "Airde %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "Láithreán gréasáin" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "Seachtainí" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "Nuair a thosaíonn Clementine" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii Remote %1: gníomhachtaithe" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii Remote %1: nasctha" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii Remote %1: dínasctha" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Remote %1: cadhnra íseal (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "Fuaim Windows Media" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "Bliain" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "Bliain - Albam" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "Bliain" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "Inné" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "Tá tú ar tí na halbaim seo a leanas a íosluchtú" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "Níl tú sínithe isteach." #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "Tá tú sínithe isteach mar %1." #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "Tá tú sínithe isteach." #: ../bin/src/ui_groupbydialog.h:123 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/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "" #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "Níl cuntas Grooveshark Anywhere agat." #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Níl cuntas Spotify Premium agat." #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "Is aoibhinn leat an rian seo" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "Caithfear Clementine a atosú chun an teanga a athrú." #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "Níl faic i do leabharlann!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "Do bhí d'ainm úsáideora nó focal faire mícheart." #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "A náid" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "cuir %n amhráin leis" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "i ndiaidh" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "ó shin" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "agus" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "uathoibríoch" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "roimh" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "idir" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "an ceann is mó ar dtús" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "ina bhfuil" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "díchumasaithe" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "diosca %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "nach bhfuil ann" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "a chríochnaíonn le" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "cothrom le" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "gpodder.net" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "comhadlann gpodder.net" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "níos mó ná" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "níos lú ná" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "na cinn is faide ar dtús" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "na cinn is nuaí ar dtús" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "ní ar an" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "na cinn is sine ar dtús" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "ar" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "roghanna" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "brúigh enter" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "bain %n amhráin" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "na cinn is giorra ar dtús" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "na cinn is lú ar dtús" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "a thosaíonn le" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "stad" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "rian %1" clementine-1.2.0+dfsg/src/translations/gl.po000066400000000000000000004615141223327513400210430ustar00rootroot00000000000000# 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 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:07+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Galician (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr " días" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr "kbps" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr "pt" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " segundos" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " cancións" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 álbums" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 días" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "hai %1 días" #: podcasts/gpoddersync.cpp:79 #, 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:413 #, qt-format msgid "%1 selected of" msgstr "%1 escollidas de" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 canción" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 cancións" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 canción encontrada" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 canción atopada (amosando %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 canción" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 descargado." #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Módulo Wiimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n fallou" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n completado(s)" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "&Personalizado" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "&Complementos" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "&Axuda" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "Esconder %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "Esconder..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Esquerda" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "&Música" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Ningunha" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "&Lista de reprodución" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Saír" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "&Modo de repetición" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Direita" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "&Modo aleatorio" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "&Axustar as columnas á xanela" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "&Ferramentas" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "...e a todos os que contribuíron con Amarok" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "0px" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 día" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 pista" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "40%" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 pistas aleatorias" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "Pasarse a preferente" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "Requírese unha conta Grooveshark Anywhere" #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "Precisas ter unha conta Premium en Spotify" #: ../bin/src/ui_networkremotesettingspage.h:189 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:78 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:153 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:297 msgid "A-Z" msgstr "A-z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "Toda a gloria ao Hipnosapo" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "Acerca do %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "Acerca de Clementine..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "Acerca Qt..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Detalles da conta" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "Detalles da conta (preferente)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Acción" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Activar/desactivar Wiiremote" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "Engadir un podcast" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Engadir un fluxo" #: ../bin/src/ui_notificationssettingspage.h:425 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:193 msgid "Add action" msgstr "Engadir acción" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Engadir outro fluxo…" #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Engadir un cartafol…" #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "Engadir un ficheiro" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Engadir ficheiro..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Engadir ficheiros para converter" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Engadir cartafol" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Engadir cartafol..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Engadir novo cartafol" #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "Engadir un podcast" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "Engadir un podcast…" #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Engade un termo de busca" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "Engadir a etiqueta de álbum" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "Engadir a etiqueta de autor do álbum" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "Engadir a etiqueta de intérprete" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "Engadir a etiqueta de compositor" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "Engadir a etiqueta de disco" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "Engadir a ruta do ficheiro" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "Engadir a etiqueta do xénero" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "Engadir a etiqueta da duración" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "Engadir a etiqueta das escoitas" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "Engadir a etiqueta dos saltos" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "Engadir a etiqueta do título" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "Engadir a etiqueta da pista" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "Engadir a etiqueta do ano" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Engadir fluxo..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "Engadir aos favoritos en Grooveshark" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "Engadir ás listas en Grooveshark" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "Engadir a outra lista de reprodución" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Engadir á lista" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "Engadir á cola" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Engadir acción wiimotedev" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Engadir..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Engadido o último mes" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Engadido esta semana" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Engadido o derradeiro ano" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Engadido hoxe" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Engadido os derradeiros tres meses" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "Engadir á música persoal" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "Engadir aos favoritos" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Agrupamento avanzado…" #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "Despois de " #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "Despóis de copiar..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Álbum" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Álbum (sonoridade ideal para todas as pistas)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Autor do álbum" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "Portada" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Información do Álbum en Jamendo.com" #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Álbums con portada" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Álbums sen portada" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Todos os ficheiros" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "Toda a gloria ao Hipnosapo" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Todos os álbums" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Todos os intérpretes" #: ui/albumcoverchoicecontroller.cpp:47 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:74 msgid "All the translators" msgstr "Todos os tradutores" #: library/library.cpp:84 msgid "All tracks" msgstr "Todas as cancións" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "Permitir a codificación de centro e lado." #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "Xunto aos orixináis" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Sempre ocultar a xanela principal" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Sempre amosar a xanela principal" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "Sempre comezar reproducindo" #: internet/spotifyblobdownloader.cpp:60 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:61 msgid "An error occurred loading the iTunes database" msgstr "Produciuse un erro ao cargar a base de datos de iTunes." #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Un erro aconteceu escrebendo metadados a '%1'" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "Produciuse un erro non especificado." #: ui/about.cpp:78 msgid "And:" msgstr "E:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "Anoxado" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Aparencia" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Engadir ficheiros/URL á lista de reprodución" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "Engadir á lista actual" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "Engadir á lista" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "Aplicar compresión para evitar clipping" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Está certo que quer apagar o \"%1\" predefinido?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "Está seguro de que quere eliminar a lista?" #: ui/edittagdialog.cpp:769 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:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Intérprete" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Información do intérprete" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "Radio do intérprete" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "Etiquetas do intérprete" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "Iniciais do intérprete" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Formato do son" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Autenticazón fallida" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "Autor" #: ui/about.cpp:65 msgid "Authors" msgstr "Autores/as" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Automático" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Actualización automática" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "Expandir automaticamente as categorías únicas na árbore da colección." #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "Dispoñíbel" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "Taxa de bits media" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "Tamaño medio das imaxes" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "Podcasts da BBC" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "Fluxos ambientais" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Cor de fondo" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "Imaxe de fondo" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Opacidad de fondo" #: core/database.cpp:734 msgid "Backing up database" msgstr "Gardando unha copia de seguranza da base de datos…" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Prohibir a entrada" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "Analisador da barra" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Azul básico" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "Tipo de son básico" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Comportamento" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "Mellor" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "Biografía de %1" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Taxa de bits" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "Taxa de bits" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "Analisador de blocos" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "Tipo de bloque" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "Corpo" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "Analisador de Boom" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Examinar..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "Almacenando no búfer…" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "Pero as seguintes orixes están desactivadas:" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Botóns" #: core/song.cpp:339 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "Compatibilidade con follas CUE" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "Cancelar" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Cambiar a portada" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Cambiar o tamaño da letra…" #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "Cambiar o modo de repetición" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Cambiar combinación de teclas" #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "Cambiar o modo aleatorio" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Cambiar o idioma" #: ../bin/src/ui_playbacksettingspage.h:330 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:228 msgid "Check for new episodes" msgstr "Buscar novos episodios" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Verificar se há actualizazóns..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "Escolla un nome para a súa lista intelixente" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Elixir automaticamente" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Elixir unha cor…" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "Escolla o tipo de letra…" #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Elixir da lista" #: smartplaylists/querywizardplugin.cpp:155 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." #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "Escolla o cartafol no que descargar os podcasts" #: ../bin/src/ui_songinfosettingspage.h:188 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:115 msgid "Classical" msgstr "Clásica" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "Facendo limpeza…" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Limpar" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Baleirar a lista de reprodución" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Erro de Clementine" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Naranxa Clementine" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Visualización de Clementine" #: ../bin/src/ui_deviceproperties.h:376 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_boxsettingspage.h:104 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:104 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:104 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_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "Clementine pode reproducir a súa música subida a Ubuntu One." #: ../bin/src/ui_notificationssettingspage.h:431 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:250 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:128 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." #: internet/lastfmsettingspage.cpp:110 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 "Clementine non puido descargar o seu estado de subscrición debido a problemas de rede. Almacenarase unha lista coas pistas reproducidas que se enviará máis tarde a Last.fm." #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Visor de imaxes de Clementine" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "Clementine non puido atopar resultados para este ficheiro." #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "Clementine atopará música en:" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Prema aquí para engadir música" #: playlist/playlisttabbar.cpp:293 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:72 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_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "Pechar a lista" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "Cerrar visualización" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "Se pecha esta xanela deterase a descarga." #: ui/albumcovermanager.cpp:216 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:116 msgid "Club" msgstr "Clube" #: ../bin/src/ui_appearancesettingspage.h:272 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:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Comentario" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "Completar as etiquetas automaticamente." #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "Completar as etiquetas automaticamente…" #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Compositor" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "Configurar %1…" #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "Configura Grooveshark..." #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Configurar Last.fm..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "Configura Maganatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Configura atallos " #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "Configura Spotify" #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "Configurar Subsonic…" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "Configurar a busca global…" #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "Configurar a biblioteca..." #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "Configurar os podcasts…" #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "Configurar..." #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "Conecte controis de Wii mediante as accións de activar e desactivar." #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "Conectar dispositivo" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "Conectado con Spotify" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "Consola" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "Taxa de bits constante" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "Converter toda a música" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "Converter calquera música que este dispositivo non poda reproducir" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "Copiar no portapapeis" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Copiar para o dispositivo" #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Copiar para a biblioteca" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "Dereitos de explotación" #: internet/subsonicsettingspage.cpp:81 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:64 #, 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." #: transcoder/transcoder.cpp:432 #, 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:426 #, 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/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "Non se pode cargar a estación de radio de last.fm" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "Non se puido abrir o arquivo externo %1" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Xestor de portadas" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "Covert art da imaxen incorporada" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "As portadas cargáronse automaticamente de %1." #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "Covert art desmontado manualmente" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "Covert art non montado" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "Covert art montado de %1" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "Portadas de %1" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "Crear unha nova lista de Grooveshark" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "Desvanecer ao cambiar de canción automaticamente." #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "Desvanecer ao cambiar de canción manualmente." #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "Personalizado" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "Imaxe personalizada:" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "Configuración de mensaxes personalizada" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "Radio personalizada" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Personalizado…" #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "Ruta a DBus" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Dance" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Data de criazón" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Data de alterazón" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "Dias" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "&Predeterminado" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "Diminuír o volume nun 4%" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Diminuír o volume" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "Imaxe de fondo predeterminada" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "Restablecer" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "Atraso entre as visualizacións" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "Eliminar" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "Eliminar a lista de Grooveshark" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "Eliminar os datos descargados" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Eliminar arquivos " #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Eliminar do dispositivo" #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Eliminar do disco" #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "Eliminar os episodios vistos" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "Eliminar predefinido" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "Elimminar lista de reprodución intelixente" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "Eliminar os ficheiros orixinais" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Eliminando os ficheiros…" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "Quitar as pistas seleccionadas da cola" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "Quitar da cola" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Destino" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Detalles…" #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Dispositivo" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Propiedades do dispositivo" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Nome do dispositivo" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Propiedades do dispositivo…" #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Dispositivos" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Quixo dicir" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "Importación dixital" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "Contrasinal da importación dixital" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "Nome de usuario da importación dixital" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "Conexión directa a internet" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Cartafol" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "Desactivar a duración" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "Desactivar a xeración da barra do ánimo." #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Desactivado" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Disco" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "Transmisión entrecortada" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 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:715 msgid "Do a full library rescan" msgstr "Analizar completamente a biblioteca" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "Non converter nada" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Non repetir" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "Non amosar en varios intérpretes" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "Non desordenar" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "Non deter!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Prema dúas veces para abrir" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "Ao premer dúas veces unha canción…" #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "Descargar %n episodios…" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "Cartafol de descargas" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "Descargar os episodios en" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "Grupo da descarga" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "Descargar novos episodios automaticamente" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "Cola de descarga" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Descargar o álbum" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Descargar o álbum…" #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "Descargar o episodio" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "Descargar…" #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "Descargando (%1%)…" #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "Descargando o cartafol de Icecast…" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "Descargando o catálogo de Jamendo…" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "Descargando o catálogo de Magnatune…" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "Descargando o complemento de Spotify…" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "Descargando metadatos…" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "Arrastre para cambiar de posición" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "Dropbox" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "O modo dinámico está activado" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "Mestura aleatoria dinámica" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "Editar a lista intelixente…" #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Editar a etiqueta «%1»…" #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "Editar etiqueta..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "Editar etiquetas" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Editar información da pista" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "Editar información da pista..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Editar informacións das pistas..." #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Editar..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "Activar a compatibilidade con controis de Wii." #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "Activar o ecualizador." #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "Activar os atallos unicamente cando Clementine teña o foco." #: ../bin/src/ui_globalsearchsettingspage.h:147 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:62 msgid "Enable/disable Last.fm scrobbling" msgstr "Activar a sincronización con Last.fm." #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "Complexidade da codificación" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "Calidade do motor de codificación" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "Modo de codificación" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "Escriba un enderezo URL" #: ../bin/src/ui_coverfromurldialog.h:103 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:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "Escriba un novo nome para a lista" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Escriba o nome dun intérprete ou etiqueta para comezar a escoitar á súa radio de Last.fm." #: ../bin/src/ui_globalsearchview.h:209 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:77 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:77 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:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "Introduza aquí os criterios de busca." #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "Escriba o enderezo URL dunha radio de internet:" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "Escriba o nome do cartafol" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "Colección completa" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Erro" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Erro conectando dispositivo MTP" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "Erro ao copiar as cancións" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "Erro ao eliminar as cancións" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "Erro ao baixar o engadido de Spotify" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "Non foi posíbel cargar %1" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Erro ao cargar a lista de reprodución di.fm" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "Erro ao procesarr %1: %2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "Non foi posíbel cargar o CD de son." #: library/library.cpp:63 msgid "Ever played" msgstr "Reproducidas algunha vez" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "Cada 10 minutos" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "Cada 12 horas" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "Cada 2 horas" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "Cada 20 minutos" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "Cada 30 minutos" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "Cada 6 horas" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "Cada hora" #: ../bin/src/ui_playbacksettingspage.h:303 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:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "Expandir" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "Caduca o %1" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "Desvanecer ao deter unha pista." #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "Desvanecendo" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "Duración do desvanecimento" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "Non foi posíbel descargar o directorio." #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "Non foi posíbel descargar os podcasts." #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "Non foi posíbel cargar o podcast." #: podcasts/podcasturlloader.cpp:167 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:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "Rápido" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "Favoritos" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "Pistas favoritas" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "Obter as portadas que falten" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "Descargar automaticamente" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "Completouse a descarga" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "Descargando a biblioteca de Subsonic" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Produciuse un erro ao descargar a portada" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "Extensión do ficheiro" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "Formatos de ficheiro" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Nome do ficheiro" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "Nome do ficheiro (sen camiño)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Tamaño do ficheiro" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Tipo de ficheiro" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Ruta" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Ficheiros" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "Ficheiros a converter" #: smartplaylists/querywizardplugin.cpp:90 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." #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "Obtendo un identificador para a canción…" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "Rematar" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "Primeiro nivel" #: core/song.cpp:328 msgid "Flac" msgstr "FLAC" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Tamaño da letra" #: ../bin/src/ui_spotifysettingspage.h:213 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:204 msgid "Force mono encoding" msgstr "Forzar a codificación dunha canle." #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "Esquecer o dispositivo" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Formulario" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "Formato" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Taxa de fotogramas" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "Fotogramas por búfer" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Amigos" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "Conxelado" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Full Bass" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "Full Bass + Treble" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "Full Treble" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "Motor de son GStreamer" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "Xeral" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Configuración xeral" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Xénero" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "Obter un enderezo URL para compartir esta lista de Grooveshark" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "Obter un enderezo URL para compartir esta canción de Grooveshark" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "Descargando as cancións populares de Grooveshark…" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "Descargando as canles…" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "Descargando os fluxos…" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "Noméeo:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "Ir" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "Ir á seguinte lapela de lista" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "Ir á lapela anterior de lista" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, 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:206 msgid "Grey out non existent songs in my playlists" msgstr "Marcar en gris as cancións da lista que non existan." #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "Produciuse un erro ao intentar acceder a Grooveshark." #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "URL da lista de Grooveshark" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "Radio de Grooveshark" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "URL da canción de Grooveshark" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "Agrupar a biblioteca por…" #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "Agrupar por" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "Agrupar por álbum" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "Agrupar por intérprete" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "Agrupar por intérprete/álbum" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "Agrupar por intérprete/ano" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "Agrupar por Xénero/Álbum" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "Agrupar por xénero/intérprete/álbum" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "A páxina web non contiña ningunha fonte RSS." #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "HTTP proxy" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "Contento" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "Información do hardware" #: ../bin/src/ui_deviceproperties.h:372 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:202 msgid "High" msgstr "Alto" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "Alto(%1 fps)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "Alto (1024x1024)" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "Horas" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "Hipnosapo" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "Non teño unha conta Magnatune" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Ícone" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "Ícones na cima" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "Identificando a canción…" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 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:77 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:204 msgid "Ignore \"The\" in artist names" msgstr "Ignorar o artigo inglés, «The», no nome dos intérpretes." #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Imaxes(*.png *.jpg *.jpeg *.bmp *xpm *.pbm *.pgm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "En %1 días" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "En %1 semanas" #: ../bin/src/ui_wizardfinishpage.h:86 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/spotifyservice.cpp:360 msgid "Inbox" msgstr "Inbox" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "Incluír a portada do álbum na notificación." #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "Incluír todas as cancións" #: internet/subsonicsettingspage.cpp:90 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/subsonicsettingspage.cpp:94 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/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "Incrementar o volume ao 4%" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Incrementar o volume" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "Indexando %1…" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "Información" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "Inserir" #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Instalado" #: core/database.cpp:673 msgid "Integrity check" msgstr "Comprobación da integridade" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "Fornecedores de internet" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "Chave non válida da API" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Formato inválido" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "Método inválido" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "Parámetros inválidos" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "Recurso inválido especificado" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "Servizo Inválido" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "Chave de sesón non válida" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "Nome de usuario ou contrasinal inválidos" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "Pistas máis escoitadas de Jamendo" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "Os máis en Jamendo" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "Jamendo Top neste mes" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "Jamendo Top nesta semana" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "Base de dados de Jamendo" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "Ir á pista que se está a reproducir" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Gardar botóns para %1 second..." #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Gardar botóns para %1 seconds..." #: ../bin/src/ui_behavioursettingspage.h:193 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:193 msgid "Keep the original files" msgstr "Gardar os arquivos orixinais" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "Michiños" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Idioma" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "Portátil/Auscultadores" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Large Hall" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "Portada grande do álbum" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "Barra lateral larga" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "Últimos en soar" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "Radio personalizada de Last.fm: %1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Biblioteca da Last.fm - %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "Radio de mestura de Last.fm — %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Radio dos veciños de Last.fm — %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Radio da Last.fm - %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Intérpretes de Last.fm parecidos a %1" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Radio de etiqueta de Last.fm: %1" #: internet/lastfmservice.cpp:437 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:154 msgid "Last.fm password" msgstr "Contrasinal de Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "Número de escoitas de Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Etiquetas de Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Nome de usuario de Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Wiki de Last.fm" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "Pistas en peor estima" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "Deixe baleiro para empregar o predeterminado. Exemplos: «/dev/dsp», «front», etc." #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Duración" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Biblioteca" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "Agrupamento avanzado da biblioteca" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "Nota de análise da biblioteca" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "Busca na biblioteca" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Límites" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "Escoitar cancións de Grooveshark en base ao que escoitou previamente." #: ui/equalizer.cpp:123 msgid "Live" msgstr "Ao Vivo" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Cargar" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "Cargar a portada dun URL" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "Cargar a portada dun URL…" #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "Cargar a portada do computador" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "Cargar a portada do computador…" #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "Cargar unha lista" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "Cargar unha lista…" #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Cargando a radio de Last.fm…" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Cargando o dispositivo MTP…" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "Cargando a base de datos do iPod…" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "Cargando a lista intelixente…" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "Cargando as cancións…" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "Cargando o fluxo…" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "Cargando as pistas…" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "Cargando a información das pistas…" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "Cargando…" #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "Carga ficheiros ou enderezos URL, substituíndo a lista actual." #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Acceder" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "Non se puido acceder." #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "Perfil de predición a longo prazo (LTP)" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "Gústame" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Baixa (%1 fps)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "Baixa (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "Perfil de pouca complexidade (LC)" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "Letras" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "Letra de %1" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Descarga de Magnatune" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Rematou a descarga de Magnatune." #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "Perfil principal (MAIN)" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "Que así sexa!" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "Descargar a lista para usala sen internet" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "Resposta mal formada" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "Configuración manual do proxy." #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "Manualmente" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "Fabricante" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "Marcar como escoitada" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "Marcar como nova" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "Coincidencia con todos os termos (AND)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "Coincidencia con algúns termos (OR)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "Taxa de bits máxima" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "Medio (%1 fps)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "Medio (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "Tipo de asociación" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "Taxa de bits mínima" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "Predefinicións de Missing projectM" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "Modelo" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "Vixiar is cambios na colección." #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "Reprodución nunha única canle." #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "Meses" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "Ánimo" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "Estilo da barra do ánimo" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "Barras do ánimo" #: library/library.cpp:74 msgid "Most played" msgstr "Máis tocados" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "Ponto de montaxe" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "Pontos de montaxe" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "Mover para abaixo" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "Mover para a biblioteca..." #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "Mover para acima" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "Música" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Colección de música" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "Silencio" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "A miña colección de Last.fm" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "A miña mistura de Last.fm" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "Veciñanza en Last.fm" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "A miña Radio recomendada de Last.fm" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "A miña Radio Mistura " #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "Música persoal" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "Veciñanza" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "A Miña Emisora" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "As miñas recomendazóns" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Nome" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "Opcións de nomenclatura" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "Banda estreita (BE)" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "Veciños" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "Rede" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "Proxy de rede" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "Mando por rede" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "Nunca" #: library/library.cpp:67 msgid "Never played" msgstr "Nunca Reproducido" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "Nunca comezar reproducindo" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "Novo cartafol" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "Nova lista de reprodución" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "Nova lista de reprodución intelixente" #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "Novas cancións" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "Engadir as novas pistas automaticamente." #: library/library.cpp:80 msgid "Newest tracks" msgstr "Últimas pistas" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "Próximo" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Seguinte pista" #: core/utilities.cpp:147 msgid "Next week" msgstr "A vindeira semana" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "Sen analisador" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "Non hai imaxe de fondo." #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "Non hai bloques grandes." #: playlist/playlistcontainer.cpp:366 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:145 msgid "No short blocks" msgstr "Non hai bloques pequenos." #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "Nengún" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 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:155 msgid "Normal" msgstr "Normal" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "Tipo de bloque normal" #: playlist/playlistsequence.cpp:170 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:107 msgid "Not connected" msgstr "Non conectado" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "Conteúdo insuficiente" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "Fans insuficientes" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "Membros insuficientes" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "Non ten veciños dabondo." #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Non instalado" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "Desconectado do servizo." #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "Desmontado. Faga dobre clic para montalo." #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "Tipo de notificación" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Notificacións" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Agora sonando" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "Pré-visualizar no OSD" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 msgid "Only allow connections from the local network" msgstr "" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Amosar só o primeiro" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "Opacity" msgstr "" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "Abrir %1 no navegador" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "Abrir un CD de &son…" #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "Abrir un ficheiro OPML" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "Abrir un ficheiro OPML…" #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "Abrir o dispositivo" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "Abrir un ficheiro…" #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "Abrir en Google Drive" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "Abrir nunha nova lista" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Abrir…" #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "A operazón fallou" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "Optimizar en prol da taxa de bits" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "Optimizar en prol da calidade" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "Configuración…" #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "Organizar os ficheiros" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "Organizar os ficheiros…" #: core/organise.cpp:65 msgid "Organising files" msgstr "Organizando os ficheiros…" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "Etiquetas orixinais" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Outras opcións" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "Opcións de saída" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "Substituír os ficheiros existentes" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "Dono" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "Analizando o catálogo de Jamendo" #: ui/equalizer.cpp:124 msgid "Party" msgstr "Festa" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "Contrasinal" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Pausa" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "Pausa" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Pausado" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "Barra lateral simple" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Reproducir" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "Reproducir o intérprete ou a etiqueta" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "Reproducir a radio dun intérprete…" #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "Escoitas" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "Reproducir unha radio personalizada…" #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "Reproducir se está detido, pausar se está a reproducir" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "Reproducir se non hai nada reproducíndose aínda." #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "Reproducir a radio dunha etiqueta…" #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "Reproducir a ª pista da lista" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "Reproducir/Pausa" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Reprodución" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Opczóns do player" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "Lista de reprodución" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "Lista de músicas terminada" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "Opcións da lista de reprodución" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "Tipo de lista" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "Listas de reprodución" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "Peche o navegador web e volva a Clementine." #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "Estado do complemento:" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "Podcasts" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Pop" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "Cancións populares" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "Cancións populares do mes" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "Cancións populares do día" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "Duración do diálogo" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "Porto" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "Preeamplificazón" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "Configuración" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "Configuración…" #: ../bin/src/ui_librarysettingspage.h:202 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:167 msgid "Preferred audio format" msgstr "Formato de son preferido" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "Taxa de bits preferida" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "Formato preferido" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "Tipo de son preferente" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "Preestablecido:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "Prema unha combinación de botóns a empregar para" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "Prema unha tecla" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, 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_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "Opcións da pantalla xeitosa" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "Vista previa" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "Anterior" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 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:131 msgid "Profile" msgstr "Perfil" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "Progreso" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 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:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "Calidade" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "Investigando no dispositivo" #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "Xestor da fila" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "Engadir á lista" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "Engadir á lista" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "Radio (mesmo volume para todas as pistas)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "Radios" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "Chuvia" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "Visualización aleatoria" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "Califica a canción actual 0 estrelas" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "Califica a canción actual 1 estrela" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "Califica a canción actual 2 estrelas" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "Califica a canción actual 3 estrelas" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "Califica a canción actual 4 estrelas" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "Califica a canción actual 5 estrelas" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "Avaliación" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "Cancelar mesmo?" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "Actualizar" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "Actualizar o catálogo" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "Actualizar as canles" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "Actualizar a lista de amigos" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "Actualizar a lista de emisoras" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "Actualizar os fluxos" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Reggae" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "Lembrar o movemento do control de Wii" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "Lembrar por derradeira vez" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Remover" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "Eliminar acción" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "Eliminar as entradas duplicadas da lista" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "Eliminar cartafol" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "Quitar da música persoal" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "Retirar dos favoritos" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "Eliminar da lista de reprodución" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "Retirando cancións da música persoal…" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "Retirando cancións de entre as favoritas…" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "Renomear a lista «%1»" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "Renomear a lista de Grooveshark" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "Renomear lista de reprodución" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "Renomear lista de reprodución" #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "Volver numerar as pistas na seguinte orde…" #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Repetir" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "Repetir álbum" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "Repetir lista de reprodución" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "Repetir a pista" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Substituír a actual lista de reprodución" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "Substituír lista de reprodución" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "Substituír espacios con barras-baixas" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "Repetir mellora" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "preencher novamente" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "reestablelecer" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" msgstr "Restabelecer conta de reproducións" #: 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:206 msgid "Restrict to ASCII characters" msgstr "Limitado a caracteres ASCII" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "Descargando cancións da música persoal de Grooveshark…" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "Descargando as cancións favoritas de Grooveshark…" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "Descargando as listas de Grooveshark…" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "Volver a Clementine" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "Executar" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "Proxy SOCKS" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "Retirar o dispositivo de maneira segura." #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "Retirar o dispositivo de maneira segura tras a copia." #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "Frecuencia de mostraxe" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "Frecuencia de mostraxe" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "Gardar os ficheiros .mood na súa biblioteca de música." #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "Gardar a portada do álbum" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "Almacenar a portada…" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "Gardar imaxe" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "Gardar lista de reprodución" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "Gardar lista de reprodución..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "Salvar os axustes" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "Gardar esta emisión na lapela Internet" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "Gardando cortes" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "Perfil de taxa de mostra escalábel (SSR)" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "Puntuación" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "Enviar as miñas escoitas" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "Buscar" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "Buscar nas emisoras Icecast" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "Buscar en Jamendo" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Buscar en Magnatune" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "Buscar en Subsonic" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "Buscar portadas de álbums…" #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "Buscar calquera cousa" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "Buscar en gpodder.net" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "Buscar en iTunes" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "Modo búsqueda" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "Opcións de búsqueda" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "Resultados da busca" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "Termos de búsqueda" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "Buscando en Grooveshark…" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "Segundo nível" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "Atrasar" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "Avanzar" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "Avanzar ou atrasar unha cantidade de tempo a pista actual." #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "Situar o punto de reprodución da pista actual nunha posición determinada." #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "Seleccionalo todo" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "Non seleccionar nengún" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "Escoller a cor de fondo:" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "Escoller a imaxe de fondo" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "Escoller a posíbel mellor correspondencia" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "Escoller a cor principal:" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "Seleccionar as visualizacións" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "Seleccionar as visualuzacións..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "Número de serie" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "URL do servidor" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "Detalles do servidor" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "Servizo Inválido" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Colocar %1 para \"%2\"..." #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "Axusta o volume a por cento" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "Axusta o volume para todos os cortes seleccionados" #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Atallo" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "Atallo para %1" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Atallo para %1 xa existe" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Mostrar" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "Mostrar OSD" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "Mostrar unha animación escintilante no actual corte" #: ../bin/src/ui_appearancesettingspage.h:293 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:434 msgid "Show a native desktop notification" msgstr "Amosar unha notificación nativa do ambiente de escritorio." #: ../bin/src/ui_notificationssettingspage.h:442 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:441 msgid "Show a notification when I change the volume" msgstr "Mostrar unha notificación ao mudar o volume" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "Mostrar unha xanela emerxente da bandexa do sistema " #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "Amosar unha pantalla xeitosa" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "Mostrar" #: ui/mainwindow.cpp:460 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:209 msgid "Show cover art in library" msgstr "Amosar as portadas da biblioteca" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "Amosar as divisións" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "Mostrar tamaño completo " #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "Mostrar no buscador de arquivos" #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "Amosar en varios intérpretes" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "Amosar a barra do ánimo." #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "Mostrar somente os duplicados" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "Só amosar o que non estea etiquetado." #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "Fornecer suxestións para a busca." #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "Amosar as botóns «Gústame» e «Saltar»." #: ../bin/src/ui_lastfmsettingspage.h:158 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:192 msgid "Show tray icon" msgstr "Amosar unha icona na área de notificación." #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "Indicar que orixes están activas e cales están inactivas." #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "Amosar/agochar" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Desordenar" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "Desordenar os álbums" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "Desordenalo todo" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "Desordenar a lista" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "Desordenar as pistas do álbum actual" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "Acceder" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "Saír" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "Accedendo…" #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "Intérpretes semellantes" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "Saltar para trás na lista de músicas" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "Saltar a conta" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "Saltar cara adiante na lista de reprodución" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "Portada pequena do álbum" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "Barra lateral pequena" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "Lista de reprodución intelixente" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "Listas de reprodución intelixentes" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "Información da canción" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "Información" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "Espectrograma" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "Lamentámolo" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "Ordenar polo nome do xénero" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "Ordenar pola popularidade do xénero" #: ../bin/src/ui_icecastfilterwidget.h:77 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" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "Orixe" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "Orixes" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "Produciuse un erro ao intentar acceder a Spotify." #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "Complemento de Spotify" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "O complemento de Spotify non está instalado." #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "Estándar" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "Vixiado" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "Reproducir a playlist actualmente reproducindo" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "Iniciar a conversión" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 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:405 #, qt-format msgid "Starting %1" msgstr "Iniciando %1…" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "Iniciando…" #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "Emisoras" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Deter" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "Deter tras" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "Deter a reprodución despois da pista actual" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Deter" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "Deter despois da pista actual" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "Detido" #: core/song.cpp:341 msgid "Stream" msgstr "Fluxo" #: internet/subsonicsettingspage.cpp:30 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:160 msgid "Streaming membership" msgstr "Relación co fluxo:" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "Listas que segue" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "Subscritores" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "Accedeuse correctamente." #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "%1 almacenouse correctamente." #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "Etiquetas suxeridas" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "Resumo" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "Moi alta (%1 fps)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "Moi alta (2048x2048)" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "Formatos dispoñíbeis" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "Sincronizando coa caixa de entrada de Spotify" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "Sincronizando coa lista de reprodución de Spotify" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "Sincronizando cos cortes mais exitosos en Spotify" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "Cores do sistema" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "Abas na cima" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Etiqueta" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "Buscador de etiquetas" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "Radio de etiqueta" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "Taxa de bits de destino" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Tecno" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "Opcións do texto" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Agradecimentos a" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "O \"%1\" comando non pode ser iniciado" #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "Portada do álbum da canción actual" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "O directorio %1 non é valido" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "A lista de reprodución «%1» está baleira ou non pode cargarse." #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "O sitio que procuras non é unha imaxe!" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "Hai outras cancións neste álbum" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "Houbo un problema de comunicación con gpodder.net." #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Houbo un problema coa descarga de datos de Magnatune." #: podcasts/itunessearchpage.cpp:76 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:56 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:389 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:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 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:174 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:151 msgid "Third level" msgstr "Terceiro nivel" #: internet/jamendoservice.cpp:171 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/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "Esta portada non está dispoñíbel no formato solicitado." #: ../bin/src/ui_deviceproperties.h:381 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:375 msgid "This device supports the following file formats:" msgstr "O ficheiro é compatíbel cos seguintes formatos de ficheiro:" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "O dispositivo non vai funcionar correctamente." #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "O fluxo só está dispoñíbel para subscritores de pago." #: devices/devicemanager.cpp:587 #, 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_songinfosettingspage.h:185 msgid "Timeout" msgstr "Superouse o tempo máximo de espera" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Título" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "Para iniciar a radio de Grooveshark, antes debería escoitar máis cancións de Grooveshark." #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "Hoxe" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "Alternar o OSD xeitoso" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Pantalla completa" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "Alternar o estado da cola" #: ../bin/src/ui_mainwindow.h:718 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:143 msgid "Tomorrow" msgstr "Mañá" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "Demasiadas redireccións" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "Mellores pistas" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "Bytes enviados" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "Solicitudes de rede" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Pista" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "Conversión de música" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "Rexistro de conversión" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "Convertendo…" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Convertendo %1 ficheiro empregando %2 fíos." #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "Opcións de conversión" #: core/song.cpp:338 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "Turbine" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "Apagar" #: devices/giolister.cpp:161 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "URL(s)" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "Banda ultralarga (UWB)" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Non é posíbel descargar %1 (%2)." #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Descoñecido" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "Tipo de contido descoñecido" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Erro descoñecido" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "Anular a escolla da portada" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "Anular a subscrición" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "Vindeiros concertos" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "Actualizar a lista de Grooveshark" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "Actualizar todos os podcasts" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "Actualizar os cartafoles da biblioteca con cambios" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "Actualizar a biblioteca ao iniciar Clementine." #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "Actualizar o podcast" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "Actualizando…" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Actualizando %1…" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "Actualizando (%1%)…" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "A actualizar a biblioteca" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "Utilizazón" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "Empregar a etiqueta do autor do álbum cando estea dispoñíbel." #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "Empregar os atallos de Gnome." #: ../bin/src/ui_playbacksettingspage.h:310 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:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "Empregar un mando de Wii." #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "Empregar unha combinación de cores personalizada." #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "Empregar unha mensaxe personalizada para as notificación." #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "Empregar autenticación." #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "Empregar o motor de xestión da taxa de bits." #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "Empregar o modo dinámico." #: ../bin/src/ui_wiimotesettingspage.h:188 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:139 msgid "Use temporal noise shaping" msgstr "Empregar unha redución temporal do ruído." #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "Empregar a configuración do sistema." #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "Empregar a combinación de cores do sistema." #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "Empregar a configuración do proxy do sistema." #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "Empregar a normalización do volume." #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "Empregado" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "O usuario «%1» non ten conta de Grooveshark Anywhere («Grooveshark en calquera parte»)." #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "Interface de usuario" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Usuario" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "Ao empregar o menú para engadir unha canción…" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "MP3 VBR" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "Taxa de bits variábel" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "Varios intérpretes" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "Versón %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "Vista" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "Modo de visualización" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "Visualizacións" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "Configuración das visualizacións" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "Detección da voz" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "Volume %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "Sitio web" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "Semanas" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "Ao iniciar Clementine" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "Cando a lista estea baleira…" #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "Por que non intenta con…" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "Banda larga (WB)" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "Mando %1 da Wii: activado." #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "Mando %1 da Wii: conectado." #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Mando %1 da Wii: batería nas últimas (%2%) " #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Mando %1 da Wii: desactivado." #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Mando %1 da Wii: desconectado." #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Mando %1 da Wii: batería baixa (%2%)." #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "Son de Windows Media" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:530 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:2088 msgid "Would you like to run a full rescan right now?" msgstr "Quere realizar unha análise completa agora?" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "O nome de usuario ou contrasinal non son correctos." #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "Ano" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "Ano - Álbum" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "Anos" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "Onte" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "Está a piques de descargar os seguintes álbums:" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "Desconectado do servizo." #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "Accedeu ao servizo como %1." #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "Conectado ao servizo." #: ../bin/src/ui_groupbydialog.h:123 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/digitallyimportedsettingspage.cpp:46 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/magnatunesettingspage.cpp:53 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:57 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." #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "Pode enviar escoitas de balde, pero só os subscritores de pago poden reproducir radios de Last.fm desde Clementine." #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "Carece vostede dunha conta de Grooveshark Anywhere («Grooveshark en calquera parte»)." #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Carece vostede dunha conta preferente de Spotify." #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "Carece vostede dunha subscrición activa." #: internet/spotifyservice.cpp:170 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/spotifysettingspage.cpp:158 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:87 msgid "You love this track" msgstr "Gústalle esta pista." #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "Ten que abrir a configuración do sistema e marcar a opción de «Activar o acceso para os dispositivos de asistencia» para empregar os atallos globais en Clementine." #: ../bin/src/ui_behavioursettingspage.h:200 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." #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "Non poderá reproducir estacións de radio de Last.fm xa que non está subscrito ao servizo." #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "A súas credenciais da Last.fm son incorrectas." #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "A súas credenciais da Magnatune son incorrectas." #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "A biblioteca está baleira!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "Fluxos de radio persoais" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "Escoitas: %1" #: visualisations/visualisationcontainer.cpp:152 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/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "O usuario ou contrasinal non eran correctos." #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Cero" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "engadir %n cancións" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "despois de" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "hai" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "e" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "automático" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "antes de" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "entre" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "primeiro o meirande" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "contén" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "desactivado" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "disco %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "non contén" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "remata en" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "é igual a" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "gpodder.net" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "Directorio de gpodder.net" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "maior que" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "na última" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "menor que" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "primeiro o máis longo" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "mover %n cancións" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "primeiro o máis novo" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "distinto de" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "non na última" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "non en" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "primeiro o máis vello" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "en" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "opcións" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "prema Intro" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "retirar %n cancións" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "primeiro o máis curto" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "desordenar as cancións" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "primeiro o máis pequeno" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "ordenar as cancións" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "comeza por" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "deter" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "pista %1" clementine-1.2.0+dfsg/src/translations/he.po000066400000000000000000005024261223327513400210330ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # eliash , 2013 # FIRST AUTHOR , 2010 # matanya , 2012 # ud1955 , 2013 # Yaron Shahrabani , 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-15 21:27+0000\n" "Last-Translator: eliash \n" "Language-Team: Hebrew (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr "ימים" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr "קילו בתים לשניה" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " מילישניות" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " נק׳" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " שניות" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " שירים" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 אלבומים" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 ימים" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "לפני %1 ימים" #: podcasts/gpoddersync.cpp:79 #, 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:413 #, qt-format msgid "%1 selected of" msgstr "נבחרו %1 מתוך" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "שיר אחד (%1)" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 שירים" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "נמצאו %1 שירים" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "נמצאו %1 שירים (מוצגים %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 רצועות" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 הועברו" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: המודול Wiimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n נכשלו" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n הושלמו" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "ה&תאמה אישית" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "תוספות" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "ע&זרה" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "הסתרת %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "ה&סתרה..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&שמאל" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "מוזיקה" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&ללא" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "רשימת השמעה" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "י&ציאה" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "מצב חזרה" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&ימין" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "מצב ערבוב" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "&מתיחת עמודות בהתאמה לחלון" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "&כלים" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(באופן שונה על פני מספר שירים)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "וכל התורמים ל־Amarok" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "" #: core/utilities.cpp:108 msgid "1 day" msgstr "יום אחד" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "רצועה אחת" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "127.0.0.1" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "40%" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 רצועות אקראיות" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "שדרוג לגרסת הפרמיום כעת" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "נדרש חשבון Grooveshark Anywhere." #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "נדרש חשבון פרימיום של Spotify." #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "לקוח יכול להתחבר רק אם הוזן הקוד הנכון." #: smartplaylists/wizard.cpp:78 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:153 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "שיר יכלל ברשימת ההשמעה אם הוא עומד בתנאים אלו." #: smartplaylists/searchterm.cpp:297 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "הללו את ה־Hypnotoad!" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "בטל" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "בערך %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "על אודות Clementine..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "על אודות Qt..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "פרטי החשבון" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "פרטי חשבון (פרימיום)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "פעולה" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "הפעלה/כיבוי של Wiiremote" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "הוספת פודקאסט" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "הוספת תזרים" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "הוספת שורה חדשה אם נתמכת בסוג ההתרעה" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "הוספת פעולה" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "הוספת תזרים אחר..." #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "הוספת תיקייה..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "הוספת קובץ" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "הוספת קובץ..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "הוספת קובצי מוזיקה להמרה" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "הוספת תיקייה" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "הוספת תיקייה..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "הוספת תיקייה חדשה..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "הוספת פודקאסט" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "הוספת פודקאסט..." #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "הוספת מונח לחיפוש" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "הוספת תג אלבום לשיר" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "הוספת תג אמן האלבום לשיר" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "הוספת תג אמן לשיר" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "הוספת ניקוד אוטומאטי לשיר" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "הוספת תג מלחין לשיר" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "הוספת תג דיסק לשיר" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "הוספת שם קובץ לשיר" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "הוספת תג סגנון לשיר" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "הוספת תג משך לשיר" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "הוספת תיוג מבצע" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "הוספת מספר השמעות לשיר" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "הוספת רייטינג לשיר" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "הוספת מספר דילוגים לשיר" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "הוספת תג כותרת לשיר" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "הוספת תג פסקול לשיר" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "הוספת תג שנה לשיר" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "הוספת תזרים" #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "הוספה לרשימת המועדפים של Grooveshark" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "הוספה לרשימת ההשמה של Grooveshark" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "הוספה לרשימת השמעה אחרת" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "הוספה לרשימת ההשמעה" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "הוספה לתור" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "הוספת פעולת wiimotedev" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "הוספה..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "נוסף בחודש זה" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "נוסף בשבוע זה" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "נוסף בשנה זו" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "התווסף היום" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "התווסף בשלושה החודשים האחרונים" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "הוספת שירים למוסיקה שלי" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "הוספת שיר למועדפים" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "קיבוץ מתקדם..." #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "לאחר " #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "אחרי העתקה..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "אלבום" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "אלבום (עצמת שמע אידאלית לכל הרצועות)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "אמן אלבום" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "עטיפת אלבום" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "מידע על האלבום ב־jamendo.com..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "אלבומים עם עטיפה" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "אלבומים ללא עטיפה" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "כל הקבצים (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "הללו את ה־Hypnotoad!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "כל האלבומים" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "כל האמנים" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "כל הקבצים (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "כל רשימות ההשמעה (%1)" #: ui/about.cpp:74 msgid "All the translators" msgstr "כל המתרגמים" #: library/library.cpp:84 msgid "All tracks" msgstr "כל הרצועות" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "מתן האפשרות לקידוד mid/side" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "צמוד למקוריים" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "תמיד יש להסתיר את החלון המרכזי" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "תמיד יש להציג את החלון המרכזי" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "תמיד להתחיל לנגן" #: internet/spotifyblobdownloader.cpp:60 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:61 msgid "An error occurred loading the iTunes database" msgstr "אירעה שגיאה בטעינת מסד הנתונים של iTunes" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "אירעה שגיאה בכתיבת המידע הנוסף לתוך '%1'" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "אירעה שגיאה לא מוגדרת" #: ui/about.cpp:78 msgid "And:" msgstr "וגם:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "כָּעוּס" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "מראה" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "הוסף קבצים/כתובות לסוף רשימת ההשמעה" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "הוספה לרשימת ההשמעה הנוכחית" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "הוספת לרשימת ההשמעה" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "הפעלת כיווץ כדי למנוע חיתוך" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "האם למחוק את האפשרות הקבועה „%1“?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "האם למחוק רשימת השמעה זו?" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "האם לאפס את סטטיסטיקות השיר?" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "אמן" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "מידע על האמן" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "רדיו אמן" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "תגיות אמן" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "ראשי תיבות של האמן" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "להמיר לתבנית" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "האימות נכשל" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "יוצר" #: ui/about.cpp:65 msgid "Authors" msgstr "יוצרים" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "אוטומטי" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "עידכונים אוטומטיים" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "פתיחה אוטומטית של קטגוריות בודדות בעץ הספרייה" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "פנוי" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "קצב סיביות ממוצע" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "גודל תמונה ממוצע" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "BBC פודקאסט" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "מספר פעימות לדקה" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "תזרימי הרקע" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "צבע הרקע" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "תמונת רקע" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "שקיפות הרקע" #: core/database.cpp:734 msgid "Backing up database" msgstr "מסד הנתונים מגובה" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "איזון" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "חסימה" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "אנלייזר עמודות" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "כחול בסיסי" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "סוג שמע בסיסי" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "התנהגות" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "מיטבי" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "ביוגרפיה מתוך %1" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "קצב הסיביות" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "קצב סיביות" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "אנלייזר מקטעים" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "סוג בלוק" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "כמות טשטוש" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "גוף" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "אנלייזר בום" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "קופסא" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "עיון..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "משך הבאפר (buffer)" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "באגירה" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "מקורות אלו מושבתים:" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "לחצנים" #: core/song.cpp:339 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "תמיכה ב־CUE sheet" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "ביטול" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "שינוי עטיפת האלבום" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "שינוי גודל גופן..." #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "שינוי מצב חזרה" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "שינוי קיצור הדרך..." #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "שינוי מצב ערבוב" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "שינוי השפה" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "שינוי העדפת השמעת מונו יהיה יעיל לניגון השירים הבאים" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "בדיקת פרקים חדשים" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "בדיקת עדכונים..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "נא לבחור בשם עבור רשימת ההשמעה החכמה" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "בחירה אוטומטית" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "בחירת צבע..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "בחירת גופן..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "בחירה מהרשימה" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "נא לבחור כיצד רשימת ההשמעה תסודר וכמה שירים יהיו בה" #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "בחירת תיקיית יעד להורדת פודקאסט" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "ניתן לבחור באתרים שבהם Clementine יחפש אחר מילים לשירים." #: ui/equalizer.cpp:115 msgid "Classical" msgstr "קלסית" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "מנקה" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "ניקוי" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "ניקוי רשימת ההשמעה" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "שגיאה ב־Clementine" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "כתום קלמנטינה" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "אפקטים חזותיים של Clementine" #: ../bin/src/ui_deviceproperties.h:376 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "באפשרות Clementine להמיר אוטומטית כל מוזיקה המעותקת להתקן לתבנית שההתקן מסוגל לנגן." #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine מאפשר לנגן מוזיקה שהעלאת ל-Box" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine יאפשר נגינת מוסיקה שהעלית ל " #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine מאפשר נגינת מוסיקה שהעלית ל Google Drive" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "Clementine יאפשר נגינת מוסיקה שהעלית ל " #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "באפשרות Clementine להציג הודעה כשהרצועה משתנה." #: ../bin/src/ui_podcastsettingspage.h:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "יש ל־Clementine אפשרות לסנכרן את ההרשמות שלך עם מחשבים אחרים ויישומי פודקאסט אחרים. יצירת חשבון." #: visualisations/projectmvisualisation.cpp:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "אין באפשרות Clementine לטעון אפקטים חזותיים של projectM. נא לוודא שהתקנת את Clementine כמו שצריך." #: internet/lastfmsettingspage.cpp:110 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 "Clementine נכשל בהשגת ההרשמות שלך עקב בעיה עם חיבור הרשת. השירים שיושמעו יישמרו במטמון ולאחר מכן יישלחו אל Last.fm." #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "מציג התמונות של Clementine" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "Clementine נכשל במציאת תוצאות לקובץ זה" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "Clementine ימצא מוסיקה ב:" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "יש ללחוץ כאן כדי להוסיף מוזיקה" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "יש ללחוץ כאן על מנת לעבור בין הצגת הזמן הנותר לזמן הכולל" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "סגירת רשימת השמעה" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "סגירת האפקטים החזותיים" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "סגירת חלון זה תבטל את ההורדה." #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "סגירת חלון זה תבטל את החיפוש אחר עטיפות אלבום." #: ui/equalizer.cpp:116 msgid "Club" msgstr "קלאב" #: ../bin/src/ui_appearancesettingspage.h:272 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:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "הערה" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "השלמת תג אוטומטית" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "השלמת תגים אוטומטית..." #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "מלחין" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "הגדרת " #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "הגדרת Grooveshark..." #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "הגדרת Last.fm..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "הגדרת Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "הגדרת קיצורי מקשים" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "הגדרת Spotify..." #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "הגדרת תת קולי" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "מגדיר חיפוש " #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "הגדרת הספרייה..." #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "הגדרת פודקאסטים..." #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "הגדרה..." #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "חיבור Wii Remotes בעזרת פעולת הפעלה/כיבוי" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "חיבור התקן" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "בהתחברות אל Spotify" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "קונסול" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "קצב סיביות קבוע" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "המרת כל המוזיקה" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "המרת כל המוזיקה שהתקן זה לא מסוגל לנגן" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "העתקה אל הלוח" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "העתקה להתקן.." #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "העתקה לספרייה..." #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "זכויות יוצרים" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "לא ניתן להתחבר ל Subsonic, נא לבדוק כתובת שרת. לדוגמא: " #: transcoder/transcoder.cpp:64 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "לא ניתן ליצור את רכיב ה־GStreamer „%1“ - יש לוודא שכל תוספי ה־GStreamer מותקנים כראוי" #: transcoder/transcoder.cpp:432 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "לא ניתן למצוא מרבב עבור %1, נא לוודא שתוספי ה־GStreamer הנכונים מותקנים כראוי" #: transcoder/transcoder.cpp:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "לא ניתן למצוא מקודד עבור %1, נא לוודא שתוספי ה־GStreamer הנכונים מותקנים כראוי" #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "לא ניתן לטעון את תחנת הרדיו מ־last.fm" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "לא ניתן לפתוח את קובץ הפלט %1" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "מנהל העטיפות" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "עטיפת אלבום מתוך תמונה שבקובץ" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "עטיפת האלבום נטענה אוטומטית מתוך %1" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "עטיפת אלבום הוסרה ידנית" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "לא נבחרה עטיפת אלבום" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "עטיפת אלבום נבחרה מתוך %1" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "עטיפות מ־%1" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "יצירת רשימת השמעה חדשה מ־Grooveshark" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "מעבר באמצעות עמעום בין רצועות, בהחלפה אוטומטית של רצועות" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "מעבר באמצעות עמעום בין רצועות, בהחלפה ידנית של רצועות" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "התאמה אישית" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "תמונה מותאמת אישית:" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "הגדרות מותאמות אישית להודעות" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "רדיו מותאם אישית" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "התאמה אישית..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "נתיב DBus" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "דאנס" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "תאריך יצירה" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "תאריך שינוי" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "ימים" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "בררת מח&דל" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "הנמכת עוצמת השמע ב־4%" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "הנמך את עוצמת השמע ב־ אחוזים" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "הנמכת עצמת השמע" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "תמונת בררת המחדל לרקע" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "בררות מחדל" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "הפסקה בין אפקטים חזותיים" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "מחיקה" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "מחיקת רשימת השמעה של Grooveshark" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "מחיקת מידע שהתקבל" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "מחיקת קבצים" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "מחיקה מתוך התקן..." #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "מחיקה מתוך דיסק..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "מחיקת פרקים שנוגנו" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "מחיקת אפשרות מוגדרת מראש" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "מחיקת רשימת השמעה חכמה" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "מחיקת הקבצים המקוריים" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "הקבצים נמחקים" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "הסרת הרצועות הנבחרות מהתור" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "הסרת הרצועה מהתור" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "יעד" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "פרטים..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "התקן" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "מאפייני ההתקן" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "שם ההתקן" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "מאפייני ההתקן..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "התקנים" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "האם כוונתך" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "ססמת Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "שם המשתמש ב־Digitally Imported " #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "חיבור ישיר לאינטרנט" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "תיקייה" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "משך הנטרול" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "מניעת יצירת סרגל האווירה" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "מנוטרל" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "דיסק" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "תמסורת רציפה" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "הגדרות תצוגה" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "הצגת חיווי מסך" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "ביצוע סריקה חוזרת לכל הספרייה" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "אין להמיר שום מוזיקה" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "אל תדרוס" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "ללא חזרה" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "לא להציג באמנים שונים" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "ללא קפיצות" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "לא להפסיק!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "לתרום" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "לחיצה כפולה לפתיחה" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "לחיצה כפולה על שיר לביצוע..." #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "ירדו %n פרקים" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "הורדת תיקייה" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "הורדת פרקים אל" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "חברות המאפשרת הורדה" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "הורדת פרקים חדשים אוטומטית" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "ההורדה נכנסה לתור" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "הורדת אפליקציית אנדרויד" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "הורדת האלבום הזה" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "הורדת האלבום הזה..." #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "הורדת הפרק הזה" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "בהורדה..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "בהורדה (%1%)..." #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "תיקיית Icecast בהורדה" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "הקטלוג של Jamendo מתקבל" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "הקטלוג של Magnatune מתקבל" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "התוסף של Spotify מתקבל" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "נתוני העל מתקבלים" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "נא לגרור למיקום הרצוי" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "דרופבוקס" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "מצב דינמי פעיל" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "מיקס דינמי אקראי" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "עריכת רשימת השמעה חכמה..." #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "עריכת התגית „%1“.." #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "עריכת תגית..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "עריכת תגיות" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "עריכת פרטי הרצועה" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "עריכת פרטי הרצועה..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "עריכת פרטי רצועות..." #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "עריכה..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "הפעלת תמיכה ב־Wii Remote" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "הפעלת אקולייזר" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "הפעלת קיצורי מקלדת רק כאשר המיקוד הוא על Clementine" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "אפשור המקורות להלן כדי לכלול אותם בתוצאות חיפוש. תוצאות יוצגו בסדר זה." #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "הפעלה/נטרול Last.fm scrobbling" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "מורכבות הקידוד" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "איכות מנוע הקידוד" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "מצב הקידוד" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "נא להזין כתובת" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "הכנסת כתובת להורדת עטיפה מהאינטרנט:" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "הכנס שם קובץ לייצוא עטיפות (ללא סיומת):" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "שם חדש לרשימת השמעה זו" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "יש להזין אמן או תגית כדי להתחיל להאזין לרדיו של Last.fm." #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "הזנה למעלה ביטויי חיפוש כדי למצוא מוסיקה במחשבך ובאינטרנט" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "יש להזין ביטוי לחיפוש על מנת למצוא פודקאסטים ב־iTunes Store" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "יש להזין ביטוי לחיפוש על מנת למצוא פודקאסטים ב־gpodder.net" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "ניתן להזין כאן מונחים לחיפוש" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "כתובת תחנת הרדיו האינטרנטית:" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "הזנת שם התיקייה" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "הכנס כתובת IP באפליקציה על מנת להתחבר ל-Clementine" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "כל האוסף" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "שגיאה" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "שגיאה בחיבור להתקן מולטימדיה" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "שגיאה בהעתקת שירים" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "שגיאה במחיקת שירים" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "שגיאה בהורדת תוסף Spotify" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "שגיאה בטעינת %1" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "שגיאה בטעינת רשימת ההשמעה של di.fm" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "שגיאה בעיבוד %1: %2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "שגיאה בטעינת דיסק מוזיקה" #: library/library.cpp:63 msgid "Ever played" msgstr "לא נוגן אף פעם" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "בכל 10 דקות" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "בכל 12 שעות" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "בכל שעתיים" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "בכל 20 דקות" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "בכל חצי שעה" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "בכל 6 שעות" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "בכל שעה" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "מלבד בין שירים באותו אלבום או אותו CUE sheet" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "הרחבה" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "התפוגה היא ב־%1" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "עמעום המוזיקה בעצירת רצועה" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "עמעום מוזיקה" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "משך זמן עמעום המוזיקה" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "אחזור התיקייה נכשל" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "אחזור הפודקאסטים נכשל" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "בטעינת הפודקאסט נכשלה" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "ניתוח קובץ ה־XML להזנת ה־RSS נכשל" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "מהר" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "מועדפים" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "רצועות מועדפות" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "הורדת העטיפות החסרות" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "אחזור אוטומטי" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "אחזור המידע הושלם" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "טעינת ספרית Subsonic" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "שגיאה באחזור המידע על העטיפה" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "סיומת הקובץ" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "סוג הקובץ" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "שם הקובץ" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "שם הקובץ (ללא נתיב)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "גודל הקובץ" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "סוג הקובץ" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "שם הקובץ" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "קבצים" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "קובצי מוזיקה להמרה" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "חיפוש שירים בספרייה על פי קריטריונים מוגדרים." #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "ניתוח טביעת האצבע של השיר" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "סיום" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "רמה ראשונה" #: core/song.cpp:328 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "גודל הגופן" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "עקב בעיות רישוי, התמיכה ב־Spotify נמצאת בתוסף נפרד" #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "אילוץ קידוד mono" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "התעלמות מההתקן" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "טופס" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "תבנית" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "קצב מסגרות" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "מסגרות לאגירה" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "חברים" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "קפוא" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "בס מלא" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "בס מלא + טרבל" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "טרבל מלא" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "מנוע השמע של GStreamer" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "כללי" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "הגדרות כלליות" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "סגנון" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "הצגת הכתובת על מנת לשתף את רשימת ההשמעה הזו מ־Grooveshark" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "הצגת הכתובת על מנת לשתף את השיר הזה מ־Grooveshark" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "רשימת השירים הפופולריים ב־Grooveshark מתקבלת" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "ערוצים מתקבלים" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "הזרמות מתקבלות" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "שם עבור הפריט:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "מעבר" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "מעבר ללשונית רשימת ההשמעה הבאה" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "מעבר ללשונית רשימת ההשמעה הקודמת" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "גוגל דרייב" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "נמצאו %1 עטיפות מתוך %2 (%3 נכשלו)" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "ברשימת ההשמעה, סימון שירים שאינם קיימים באפור" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "שגיאה בהתחברות ל־Grooveshark" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "הכתובת לרשימת ההשמעה ב־Grooveshark" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "רדיו Grooveshark" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "הכתובת השיר ב־Grooveshark" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "קיבוץ ספרייה על פי..." #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "קיבוץ על פי" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "קיבוץ על פי אלבום" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "קיבוץ על פי אמן" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "קיבוץ על פי אמן/אלבום" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "קיבוץ על פי אמן/שנת אלבום" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "קיבוץ על פי סגנון/אלבום" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "קיבוץ על פי סגנון/אמן/אלבום" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "קיבוץ" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "דף ה־HTML לא כלל שום הזנת RSS" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "מתווך HTTP" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "שמח" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "מידע על החומרה" #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "מידע על החומרה זמין רק כאשר ההתקן מחובר." #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "גבוה" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "גבוה (%1 fps)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "גבוה (1024x1024)" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "שעות" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "אין לי חשבון Magnatune" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "צלמית" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "צלמיות למעלה" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "מזהה שיר" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "אם בחירתך תהיה להמשיך, ההתקן יעבוד לאט וייתכן ששירים שיועתקו אליו לא יעבדו." #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "אם כתובת ההפודקאסט ידועה לך, נא להכניס אותה וללחוץ על מעבר." #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "התעלמות מה־\"The\" בשם האמן" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "קובצי תמונה (‎*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "בעוד %1 ימים" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "בעוד %1 שבועות" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "במצב דינמי שירים חדשים יבחרו ויתווספו לרשימת ההשמעה בכל פעם ששיר יסתיים" #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "תיבת נכנסת" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "אומנות אלבום בתוך ההתרעה" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "הכללת כל השירים" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "גרסת סותרת של פרוטוקול Subsonic REST . לקוח חייב שדרוג." #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "גרסת סותרת של פרוטוקול Subsonic REST . שרת חייב שדרוג." #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "הגברת עצמת השמע ב־4%" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "הגבר את עוצמת השמע ב־ אחוזים" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "הגברת עוצמת השמע" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "יצירת מפתחות " #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "מידע" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "הוספה..." #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "הותקן" #: core/database.cpp:673 msgid "Integrity check" msgstr "בדיקת שלמות" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "אינטרנט" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "ספקי אינטרנט" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "מפתח API לא תקין" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "תבנית לא תקינה" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "שיטה לא תקינה" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "פרמטרים לא תקינים" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "צויין משאב לא תקין" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "שירות לא תקין" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "מפתח הפעלה לא תקין" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "משתמש ו/או ססמה שגויים" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "הרצועות הכי מושמעות ב־Jamendo" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "הרצועות המדורגות ביותר ב־Jamendo" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "הרצועות החמות ביותר החודש ב-־amendo" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "הרצועות החמות ביותר השבוע ב־Jamendo" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "מסד הנתונים של Jamendo" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "קפיצה לרצועה המתנגנת כעת" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "השארת הלחצנים ל־%1 שניות..." #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "השארת הלחצנים ל-%1 שניות..." #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "להמשיך ולהריץ ברקע כאשר החלון סגור" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "שמירה על הקבצים המקוריים" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "גורי חתולים" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "שפה" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "מחשב נייד/אוזניות" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "חלל גדול" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "עטיפת אלבום גדולה" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "סרגל צד גדול" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "השמעה אחרונה" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "Last.fm רדיו מותאם אישית: %1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "ספריית Last.fm - %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "Last.fm רדיו מיקס - %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "רדיו השכן מ־Last.fm - %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "תחנת רדיו מ־Last.fm - %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "אמנים דומים ב־Last.fm ל־%1" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "רדיו תגית מ־Last.fm: %1" #: internet/lastfmservice.cpp:437 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm עסוק כרגע, מומלץ לנסות שוב מאוחר יותר" #: ../bin/src/ui_lastfmsettingspage.h:154 msgid "Last.fm password" msgstr "ססמת Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "מונה השמעות של Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "תגיות מ־Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "שם המשתמש ב־Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "הוויקי של Last.fm" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "הרצועות הכי פחות אהובות" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "יש להשאיר ריק בשביל בררת מחדל. דוגמאות: \"/dev/dsp\", \"front\", וכו׳." #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "שמאל" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "אורך" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "ספרייה" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "קיבוץ מתקדם של הספרייה" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "הודעה על סריקה מחודשת של הספרייה" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "חיפוש בספרייה" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "הגבלות" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "האזנה לשירים מ־Grooveshark בהתבסס על שירים שהושמעו בעבר" #: ui/equalizer.cpp:123 msgid "Live" msgstr "חי" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "טעינה" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "טעינת עטיפה מכתובת" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "טעינת עטיפה מכתובת..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "טעינת עטיפה מדיסק" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "טעינת עטיפה מהדיסק..." #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "טעינת רשימת השמעה" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "טעינת רשימת השמעה..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "רדיו מ־Last.fm בטעינה" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "התקן המולטימדיה נטען" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "מסד נתונים של ה־iPod נטען" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "רשימת השמעה חכמה נטענת" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "השירים נטענים" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "מדיה זורמת בטעינה" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "הרצועות נטענות" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "נטען מידע אודות השירים" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "בטעינה..." #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "טעינת קבצים/כתובות, תוך החלפת רשימת ההשמעה הנוכחית" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "כניסה" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "ההתחברות נכשלה" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "פרופיל תחזית ארוכת טווח(LTP)" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "אהוב" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "נמוך (%1 fps)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "‏נמוך (‎256x256‎)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "פרופיל מורכבות נמוכה (LC)" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "מילות השיר" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "מילות השיר מתוך %1" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "הורדה מ־Magnatune" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "ההורדה מ־Magnatune הסתיימה" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "הפרופיל הראשי (ראשי)" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "ביצוע!" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "הפיכת רשימת ההשמעה לזמינה גם ללא חיבור רשת" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "תגובה שגויה" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "הגדרה ידנית של שרת מתווך" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "ידני" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "יצרן" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "סימון כהושמע" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "סימון כחדש" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "הכללת כל נתוני החיפוש (AND)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "הכללת נתון אחד או יותר מנתוני החיפוש (OR)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "קצב סיביות מירבי" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "בינוני (%1 fps)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "בינוני (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "סוג חברות" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "קצב סיביות מזערי" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "חסרות אפשרויות קבועות של projectM" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "דגם" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "מעקב אחר שינויים בספרייה" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "השמעת מונו" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "חודשים" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "מצב רוח" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "סגנון סרגל האווירה" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "סרגלי אווירה" #: library/library.cpp:74 msgid "Most played" msgstr "הכי מושמעים" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "נקודת עגינה" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "נקודות עגינה" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "הזזה מטה" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "העברה לספרייה..." #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "הזזה מעלה" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "מוזיקה" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "ספריית המוזיקה" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "השתקה" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "ספריית ה־Last.fm שלי" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "Last.fm רדיו מיקס" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "השכנים שלי ב־Last.fm" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "המלצות הרדיו שלי בL־ast.fm" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "רדיו המיקס שלי" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "המוסיקה שלי" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "השכונה שלי" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "תחנת הרדיו שלי" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "ההמלצות שלי" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "שם" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "אפשרויות הקצאת שם" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "פס צר (NB)" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "שכנים" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "רשת" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "מתווך רשת" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "רשת מרוחקת" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "לעולם לא" #: library/library.cpp:67 msgid "Never played" msgstr "לא נוגן אף פעם" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "אין להתחיל להשמיע אף פעם" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "תיקייה חדשה" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "רשימת השמעה חדשה" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "רשימת השמעה חכמה חדשה..." #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "שירים חדשים" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "רצועות חדשות יצורפו באופן אוטומטי." #: library/library.cpp:80 msgid "Newest tracks" msgstr "הרצועות הכי חדשות" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "הבא" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "הרצועה הבאה" #: core/utilities.cpp:147 msgid "Next week" msgstr "השבוע הבא" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "ללא אנלייזר" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "ללא תמונת רקע" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "ללא מקטעים ארוכים" #: playlist/playlistcontainer.cpp:366 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "לא נמצא פריט תואם. יש לנקות את תיבת החיפוש על מנת לראות את כל רשימת ההשמעה שוב." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "ללא מקטעים קצרים" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "אין" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "אף אחד מהשירים הנבחרים לא היה ראוי להעתקה להתקן" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "נורמאלי" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "סוג מקטע רגיל" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "לא זמין בזמן שימוש ברשימת השמעה דינמית" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "לא מחובר" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "אין מספיק תוכן" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "אין מספיק מעריצים" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "אין מספיק חברים" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "אין מספיק שכנים" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "לא מותקן" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "לא מחובר" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "לא מעוגן - יש ללחוץ לחיצה כפולה כדי לעגן" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "סוג התרעות" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "התרעות" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "מתנגן עכשיו" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "תצוגה מקדימה של חיווי המסך" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "שקיפות" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "פתיחת %1 בדפדפן" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "פתיחת &דיסק שמע..." #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "פתיחת קובץ " #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "פתיחת קובץ " #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "פתיחת התקן" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "פתיחת קובץ..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "פתיחה ב " #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "פתיחה ברשימת השמעה חדשה" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "פתיחה..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "הפעולה נכשלה" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "מיטוב לקצב סיביות" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "מיטוב לאיכות" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "אפשרויות" #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "ארגון קבצים" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "ארגון קבצים..." #: core/organise.cpp:65 msgid "Organising files" msgstr "הקבצים מאורגנים" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "תגים מקוריים" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "אפשרויות נוספות" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "התקן פלט" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "אפשרויות פלט" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "תוסף פלט" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "דריסת קבצים קיימים" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "בעלים" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "הקטלוג של Jamendo מפוענח" #: ui/equalizer.cpp:124 msgid "Party" msgstr "מסיבה" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "ססמה" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "השהייה" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "השהיית הנגינה" #: widgets/osd.cpp:156 msgid "Paused" msgstr "מושהה" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "מבצע" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "סרגל צד פשוט" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "נגינה" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "נגינה אמן או תגית" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "ניגון רדיו אמן..." #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "מונה השמעות" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "ניגון רדיו מותאם אישית..." #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "ניגון אם מושהה, השהייה אם מנגן" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "השמעה אם אין שום שמושמע כרגע" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "ניגון רדיו תגית..." #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "נגן הרצועה ה־ מרשימת ההשמעה" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "ניגון/השהייה" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "השמעה" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "אפשרויות נגן" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "רשימת השמעה" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "רשימת ההשמעה הסתיימה" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "אפשרויות רשימת ההשמעה" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "סוג רשימת ההשמעה" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "רשימות השמעה" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "נא לסגור את הדפדפן ולחזור ל Clementine" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "מצב התוסף:" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "פודקאסטים" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "פופ" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "שירים פופולריים" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "שירים פופולריים החודש" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "שירים פופולריים היום" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "משך זמן חלונית קופצת" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "פתחה" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "הגברה טרומית" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "מאפיינים" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "מאפיינים..." #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "שמות קבצים מועדפים לתמונות אלבום (מופרדים בפסיק)" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "תבנית שמע מועדפת" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "קצב סיביות מועדף" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "תבנית מועדפת" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "סוג אודיו מיטבי" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "אפשרות מוגדרת מראש:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "יש ללחוץ על צירוף לחצנים שיוקצה עבור" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "יש ללחוץ על מקש כלשהו" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "יש ללחוץ על צירוף מקשים שיוקצה עבור %1..." #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "אפשרויות חיווי המסך" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "תצוגה מקדימה" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "הקודם" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "רצועה קודמת" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Print out version information" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "פרופיל" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "התקדמות" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 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:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "איכות" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "התקן מתושאל..." #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "מנהל התור" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "הוספת הרצועות הנבחרות" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "הוספת הרצועה לתור" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "רדיו (עצמה זהה לכל הרצועות)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "רדיו" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "גשם" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "אפקטים חזותיים אקראיים" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "דירוג השיר הנוכחי ללא כוכבים" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "דירוג השיר הנוכחי עם כוכב אחד" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "דירוג השיר הנוכחי עם 2 כוכבים" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "דירוג השיר הנוכחי עם 3 כוכבים" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "דירוג השיר הנוכחי עם 4 כוכבים" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "דירוג השיר הנוכחי עם 5 כוכבים" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "דירוג" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "האם לבטל?" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "רענון" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "רענון הקטלוג" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "רענון הערוצים" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "רענון רשימת החברים" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "רענון רשימת התחנות" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "רענון ההזרמות" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "רגאיי" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "שמירת הנפת ה־Wii remote" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "שמירה מהפעם הקודמת" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "הסרה" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "הסרת הפעולה" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "הסרת כפילויות מרשימת ההשמעה" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "הסרת תיקייה" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "הסרה מהמוסיקה שלי" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "הסרה מרשימת המועדפים" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "הסרה מרשימת ההשמעה" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "הסר רשימת השמעה" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "הסרת שירים מהמוסיקה שלי" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "הסרת שירים מרשימת המועדפים" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "שינוי שם רשימת ההשמעה %1 " #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "שינוי שם רשימת ההשמעה מ־Grooveshark" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "שינוי שם רשימת ההשמעה" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "שינוי שם רשימת ההשמעה..." #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "מספור הרצועות מחדש על פי הסדר הנוכחי..." #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "חזרה" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "חזרה על האלבום" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "חזרה על רשימת ההשמעה" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "חזרה על הרצועה" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "החלפת רשימת ההשמעה הנוכחית" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "החלפת רשימת ההשמעה" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "החלפת רווחים עם קו תחתון" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "הגברת ניגון חוזר" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "איכלוס מחדש" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "איפוס" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" 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:206 msgid "Restrict to ASCII characters" msgstr "הגבלה לתווי ASCII" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "מאחזר מ-Grooveshark את השירים שלי" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "מתקבלת רשימת השירים המועדפים מ־Grooveshark" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "מתקבלות רשימות ההשמעה מ־Grooveshark" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "חזרה ל Clementine" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "ימינה" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "רוק" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "הרצה" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "מתווך SOCKS" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "הסרת התקן באופן בטוח" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "הסרת ההתקן באופן בטוח לאחר סיום ההעתקה" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "קצב הדגימה" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "קצב דגימה" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "שמירת קבצי .מַצַב רוּחַ בספרית המוסיקה שלך" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "שמירת עטיפת האלבום" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "שמירת עטיפת האלבום לכונן..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "שמירת התמונה" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "שמירת רשימת ההשמעה" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "שמירת רשימת ההשמעה..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "שמירה כאפשרות מוגדרת מראש" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "שמור רייטינגד לתוך תגיות קובץ כשמתאפשר" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "שמור תגיות סטטיסטיקות בתוך קובץ כשמתאפשר" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "שמירת המדיה הזורמת הזו בלשונית האינטרנט" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "שומר סטטיסטיקת שירים לתוך קובץ שירים" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "שמירת רצועות" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "פרופיל קצב דגימה משתנה (SSR)" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "ניקוד" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "עדכון הפרופיל עם הרצועות הנשמעות" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "חיפוש" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "חיפוש תחנות Icecast" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "חיפוש ב־Jamendo" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "חיפוש ב־Magnatune" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "חיפוש Subsonic" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "חיפוש אחר עטיפות אלבום..." #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "חיפוש הכול" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "חיפוש ב־gpodder.net" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "חיפוש ב־iTunes" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "מצב חיפוש" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "אפשרויות חיפוש" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "תוצאות החיפוש" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "מונחי חיפוש" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "מתבצע חיפוש ב־Grooveshark" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "שלב שני" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "דילוג אחורה" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "דילוג קדימה" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "דילוג בתוך הרצועה המתנגנת כעת למיקום יחסי" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "דילוג בתוך הרצועה המתנגנת כעת למיקום מוחלט" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "בחירת הכול" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "ביטול הבחירה" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "בחירת צבע הרקע:" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "בחירת תמונת הרקע" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "בחירת ההתאמה המיטבית" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "בחירת צבע החזית:" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "בחירת אפקטים חזותיים" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "בחירת אפקטים חזותיים..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "מספר סידורי" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "כתובת שרת" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "פרטי שרת" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "שירות לא מקוון" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "הגדרת %1 בתור „%2“..." #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "הגדרת עצמת השמע ל־ אחוזים" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "הגדרת הערך לכל הרצועות הנבחרות..." #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "קיצור דרך" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "קיצור דרך עבור %1" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "קיצור דרך עבור %1 קיים כבר" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "הצגה" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "הצגת חיווי המסך" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "הנפשה זוהרת על הרצועה הנוכחית" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "הצגת סרגל אווירה בסרגל התקדמות הנתיב" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "הצגת התרעות של שולחן העבודה" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "הצגת התרעה על שינוי מצב חזרה/ערבוב" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "הצגת התרעה על שינוי עצמת השמע" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "הצגת חלונית קופצת ממגשית המערכת" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "הצגת חיווי מסך נאה" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "הצגה מעל לשורת המצב" #: ui/mainwindow.cpp:460 msgid "Show all songs" msgstr "הצגת כל השירים" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "הצגת כל השירים" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show cover art in library" msgstr "הצגת עטיפת אלבום בספרייה" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "הצגת חוצצים" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "הצגה על מסך מלא..." #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "הצגה בסייר הקבצים..." #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "הצגה תחת אמנים שונים" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "הצגת סרגל האווירה" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "הצגת כפילויות בלבד" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "הצגת לא מתוייגים בלבד" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "הצגת הצעות חיפוש" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "הצגת הלחצנים „אהוב“ ו„חסימה“" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "הצגת הכפתור scrobble בחלון הראשי" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "הצגת סמל באזור הדיווחים" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "הצגת מקורות מאופשרים ובלתי מאופשרים" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "הצגה/הסתרה" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "ערבוב" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "ערבוב אלבומים" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "ערבוב עם הכול" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "ערבוב רשימת ההשמעה" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "ערבוב שירים באלבום זה" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "כניסה" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "ניתוק" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "כניסה..." #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "אמנים דומים" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "סקא" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "דילוג אחורה ברשימת ההשמעה" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "מונה דילוגים" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "דילוג קדימה ברשימת ההשמעה" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "עטיפת אלבום קטנה" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "סרגל צד קטן" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "רשימת השמעה חכמה" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "רשימות השמעה חכמות" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "רך" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "רוק קל" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "מידע על השיר" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "מידע על השיר" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "סונוגרמה" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "עמך הסליחה" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "מיון על פי סגנון (א״ב)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "מיון על פי סגנון (פופולריות)" #: ../bin/src/ui_icecastfilterwidget.h:77 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 "מיון" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "מקור" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "מקורות" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "שגיאה בהתחברות ל־Spotify" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "תוסף Spotify" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "תוסף Spotify אינו מותקן" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "סטנדרטי" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "מסומן בכוכב" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "התחלת רשימת ההשמעה המתנגנת כעת" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "התחלת ההתמרה" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "נא להקליד משהו בתיבת החיפוש למעלה כדי למלא את רשימת תוצאות חיפוש זה" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "התחלת המרת %1" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "מופעל..." #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "תחנות" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "הפסקה" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "הפסקה אחרי" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "הפסקה אחרי רצועה זו" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "הפסקת הנגינה" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "הפסקת הנגינה אחרי הרצועה הנוכחית" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "בעצירה" #: core/song.cpp:341 msgid "Stream" msgstr "מדיה זורמת" #: internet/subsonicsettingspage.cpp:30 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:160 msgid "Streaming membership" msgstr "חברות המאפשרת הזרמת מדיה" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "מינוי על רשימות ההשמעה" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "מנויים" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "הצלחה!" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "נכתב בהצלחה %1" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "תגים מוצעים" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "סיכום" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "סופר גבוה (%1 fps)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "סופר גבוה (2048x2048)" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "תבניות נתמכות" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "מסנכרן סטטיסטיות לתוך קובץ" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "התיבה הנכנסת ב־Spotify מסונכרנת" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "רשימת ההשמעה מ־Spotify מסונכרנת" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "השירים המסומנים בכוכב ב‏־Spotify מסונכרנים" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "צבעי המערכת" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "לשוניות למעלה" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "תגית" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "משיג תגים" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "רדיו תגית" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "קצב הסיביות של היעד" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "טכנו" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "אפשרויות טקסט" #: ui/about.cpp:70 msgid "Thanks to" msgstr "תודתנו נתונה לבאים" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "לא ניתן להפעיל את הפקודה „%1“." #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "עטיפת האלבום של השיר המתנגן כעת" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "התיקייה %1 לא חוקית" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "רשימת ההשמעה %1 ריקה או שלא ניתן היה לטעון אותה." #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "האתר אותו ביקשת אינו תמונה!" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "אין שירים נוספים באלבום זה" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "אירעה תקלה בתקשורת עם gpodder.net" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "אירעה תקלה בקבלת המידע הנוסף מתוך Magnatune" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "אירעה תקלה בניתוח התגובה מ־iTunes " #: ui/organiseerrordialog.cpp:56 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:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "קבצים אלו ימחקו מההתקן, האם להמשיך?" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "These folders will be scanned for music to make up your library" msgstr "תיקיות אלו ייסרקו לאיתור מוזיקה שתרכיב את ספריית המוזיקה" #: ../bin/src/ui_transcodersettingspage.h:174 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:151 msgid "Third level" msgstr "רמה שלישית" #: internet/jamendoservice.cpp:171 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/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "אלבום זה לא זמין בפורמט המבוקש" #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "ההתקן הזה חייב להיות מחובר ופתוח על מנת ש-Clementine יוכל לבדוק באילו פורמטים הוא תומך." #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "ההתקן הזה תומך בפורמטים הבאים:" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "ההתקן הזה לא יעבוד כראוי" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "המדיה הזורמת הזו היא עבור חברות בתשלום בלבד" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "סוג התקן זה לא נתמך: %1" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "תום הזמן" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "כותרת" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "על מנת להאזין לרדיו Grooveshark, עליך להאזין קודם למספר שירים אחרים מ־Grooveshark" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "היום" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "החלפה ל/ממצב חיווי נאה" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "הפעלה או כיבוי של מסך מלא" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "החלף מצב התור" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "החלפה לscrobbling" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "הפעלה או כיבוי נראות ההצגה היפה על המסך" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "מחר" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "הפניות רבות מדי" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "מסלול עליון" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "סך הכל בתים שהועברו" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "סך הכל בקשות שנשלחו" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "רצועה" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "ממיר קבצי המוזיקה" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "יומן ממיר קבצי המוזיקה" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "ממיר" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "התחלת המרת %1 קבצים בעזרת %2 תהליכים" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "אפשרויות המרה" #: core/song.cpp:338 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "Turbine" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "כבה" #: devices/giolister.cpp:161 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "URL(s)" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "אובונטו One" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "Ultra wide band (UWB)" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "לא ניתן להוריד %1 (%2)" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "לא ידוע" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "סוג התוכן לא ידוע" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "שגיאה לא ידועה" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "הסרת עטיפה" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "הסרת מינוי" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "קונצרטים צפויים" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "עדכון רשימת ההשמעה ב־Grooveshark" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "עדכון כל הפודקאסטים" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "עדכון תיקיות שהשתנו בספרייה" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "עדכון הספרייה בזמן הפעלת Clementine" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "עדכון פודקאסט זה" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "מתבצע עדכון" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "עדכון %1" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "עדכון %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "הספרייה בעדכון" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "בשימוש" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "שימוש בתג אלבום אמן כאשר זמין" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "השתמש בקיצורי המקלדת של גנום" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "שימוש במידע נוסף על הגברת ניגון חוזר אם זמין" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "שימוש ב־Wii Remote" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "שימוש בערכת צבעים מותאמת אישית" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "שימוש בהודעות מותאמות אישית להתרעות" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "שימוש באימות" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "שימוש במנוע ניהול קצב סיביות" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "שימוש במצב דינמי" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "שימוש בהתרעות לדיווח על מצב ה־Wii Remote" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "שימוש בתצורת רעשים טמפורלית" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "שימוש בבררת המחדל של המערכת" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "שימוש בערכת הצבעים שמשמשת כבררת המחדל של המערכת" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "שימוש בהגדרות המתווך של המערכת" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "שימוש בנורמליזציה של עצמת השמע" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "בשימוש" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "למשתמש %1 אין חשבון Grooveshark Anywhere" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "מנשק משתמש" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "שם משתמש" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "שימוש בתפריט להוספת שיר יגרום ל..." #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "קצב סיביות משתנה" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "אמנים שונים" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "גרסה %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "הצגה" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "מצב אפקטים חזותיים" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "אפקטים חזותיים" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "הגדרת אפקטים חזותיים" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "זיהוי פעולות קול" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "עצמת שמע %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "אתר" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "שבועות" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "בהפעלת Clementine" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "כאשר הרשימה ריקה..." #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "מדוע לא לנסות..." #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "פס רחב (WB)" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii Remote %1: מופעל" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii Remote %1: מחובר" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii Remote %1: סוללה קריטית (%2%) " #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii Remote %1: כבוי" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii Remote %1: מנותק" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Remote %1: סוללה חלשה (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "שמע של Windows Media" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "האם ברצונך להעביר גם את שאר השירים באלבום לאמנים שונים?" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "האם ברצונך לבצע סריקה חוזרת כעת?" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "רשום את כל הסטטיסטיקות עבור השירים לתוך קבצי שירים" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "שם משתמש או סיסמא שגויים" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "שינוי" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "שינוי - אלבום" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "שנים" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "אתמול" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "האלבומים הבאים מועמדים להורדה" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "לא נכנסת." #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "כבר נכנסת בשם %1" #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "מחובר" #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "ניתן לשנות את הדרך שבה השירים מסודרים בספרייה שלך." #: internet/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "ניתן להאזין בחינם ללא חשבון, אך בעלי חשבון פרימיום יכולים להאזין להזרמות באיכות גבוהה יותר וללא פרסומות." #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "ניתן להאזין למוזיקת רקע תוך כדי האזנה למוזיקה אחרת." #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "ניתן להאזין לרצועות בחינם, אולם רק חברות בתשלום מאפשרת להזרים מ־Clementine לרדיו שב־Last.fm." #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "אין לך חשבון Grooveshark Anywhere." #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "אין לך חשבון פרימיום ב־Spotify." #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "אינך בעל מנוי פעיל" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "נותקת מ־Spotify, נא להכניס מחדש את הססמה בחלון ההגדרות." #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "נותקת מ־Spotify, נא להכניס מחדש את הססמה." #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "רצועה זו מוצאת חן בעיניך" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "באפשרותך לפתוח את הגדרות המערכת ולהפעיל את \"הפעלת הגישה להתקני עזר\" על מנת להשתמש בקיצורי דרך גלובליים ב־Clementine." #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "יש להפעיל מחדש את Clementine לאחר שינוי השפה." #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "אין אפשרות לנגן תחנות רדיו של Last.fm מכיוון שאינך מנוי." #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "כתובת ה-IP שלך:" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "הפרטים שהוקלדו עבור Last.fm אינם נכונים" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "פרטי החיבור שלך ל־Magnatune שגויים." #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "הספרייה שלך ריקה!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "רדיו המדיות הזורמות שלך" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "ה־scrobbles שלך: %1" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "למערכת שלך חסרה תמיכה ב־OpenGL, אפקטים חזותיים אינם זמינים." #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "שם המשתמש או הססמה שגויים" #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "אפס" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "הוספת %n שירים" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "אחרי" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "לפני" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "וגם" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "אוטומטי" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "לפני" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "בין" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "הכי גדול קודם" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "פעימות לדקה" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "מכיל" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "מנוטרל" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "דיסק %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "אינו מכיל" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "מסתיים ב־" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "שווה ל־" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "gpodder.net" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "ספריית gpodder.net " #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "גדול מ־" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "באחרון" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "קילוסיביות לשניה" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "קטן מ־" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "הארוך ביותר ראשון" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "העברת %n שירים" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "החדש ביותר ראשון" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "לא שווה" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "לא באחרון" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "לא ב־" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "הישן ביותר ראשון" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "ב־" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "אפשרויות" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "נא להיכנס" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "הסרת %n שירים" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "הקצר ביותר ראשון" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "ערבול שירים" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "הקטן ביותר ראשון" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "מיון שירים" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "מתחיל ב־" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "הפסקה" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "רצועה %1" clementine-1.2.0+dfsg/src/translations/he_IL.po000066400000000000000000003602551223327513400214210ustar00rootroot00000000000000# 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" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:08+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Hebrew (Israel) (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr "" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "" #: podcasts/gpoddersync.cpp:79 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "" #: playlist/playlistmanager.cpp:413 #, qt-format msgid "%1 selected of" msgstr "" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, qt-format msgid "%L1 other listeners" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "" #: transcoder/transcodedialog.cpp:192 #, c-format msgid "%n remaining" msgstr "" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "&Custom" msgstr "" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "" #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "" #: core/utilities.cpp:108 msgid "1 day" msgstr "" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "" #: library/library.cpp:60 msgid "50 random tracks" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "" #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:78 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:153 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "A-Z" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "" #: core/song.cpp:336 msgid "AIFF" msgstr "" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "" #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "" #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "" #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "" #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "" #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "" #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "" #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "" #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "" #: ui/about.cpp:74 msgid "All the translators" msgstr "" #: library/library.cpp:84 msgid "All tracks" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "" #: internet/spotifyblobdownloader.cpp:60 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:61 msgid "An error occurred loading the iTunes database" msgstr "" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:78 msgid "And:" msgstr "" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "" #: ui/about.cpp:65 msgid "Authors" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "" #: core/database.cpp:734 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "" #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "" #: core/song.cpp:339 msgid "CDDA" msgstr "" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "" #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "" #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "" #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "" #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "" #: ui/equalizer.cpp:115 msgid "Classical" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: internet/lastfmsettingspage.cpp:110 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 "" #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "" #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:116 msgid "Club" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "" #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "" #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "" #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "" #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "" #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "" #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "" #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "" #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:64 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: transcoder/transcoder.cpp:432 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "" #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "" #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "" #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "" #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "" #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "" #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "" #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "" #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "" #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "" #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:63 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "" #: core/song.cpp:328 msgid "Flac" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:43 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "" #: core/database.cpp:673 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "" #: internet/lastfmservice.cpp:437 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:154 msgid "Last.fm password" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "" #: ui/equalizer.cpp:123 msgid "Live" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "" #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "" #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "" #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "" #: core/song.cpp:330 msgid "MPC" msgstr "" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "" #: library/library.cpp:74 msgid "Most played" msgstr "" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "" #: library/library.cpp:67 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:80 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "" #: core/utilities.cpp:147 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:366 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "" #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "" #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "" #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "" #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "" #: core/organise.cpp:65 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:124 msgid "Party" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "" #: widgets/osd.cpp:156 msgid "Paused" msgstr "" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "" #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "" #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" 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:206 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "" #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "" #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:460 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "" #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "" #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 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 "" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "" #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "" #: core/song.cpp:341 msgid "Stream" msgstr "" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "" #: ui/about.cpp:70 msgid "Thanks to" msgstr "" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "" #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:56 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:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:174 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:151 msgid "Third level" msgstr "" #: internet/jamendoservice.cpp:171 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "" #: core/song.cpp:338 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "" #: devices/giolister.cpp:161 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "" #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "" #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "" #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "" clementine-1.2.0+dfsg/src/translations/header000066400000000000000000000004321223327513400212400ustar00rootroot00000000000000# 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.0+dfsg/src/translations/hi.po000066400000000000000000003612621223327513400210400ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # xanan , 2012 # FIRST AUTHOR , 2010 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:08+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Hindi (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr "kbps" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr "ms" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr "pt" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr "kshan" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "gaaney" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 album" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 din" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 din pehle" #: podcasts/gpoddersync.cpp:79 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "" #: playlist/playlistmanager.cpp:413 #, qt-format msgid "%1 selected of" msgstr "" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 gaaney miley" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 gaaney miley ( %2 pradarshit hain)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, qt-format msgid "%L1 other listeners" msgstr "%L1 aur shrota hain" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n samapt" #: transcoder/transcodedialog.cpp:192 #, c-format msgid "%n remaining" msgstr "%n baaki hain" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "&Custom" msgstr "" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "&Sahayata" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "&Chupaye %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "&Chupaye " #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "aur baaki saarey Amarok sahyogi" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 din" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 geet" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "Grooveshark Anywhere khaate ke zaroorat hai" #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "Spotify Premium khaate ke zaroorat hai" #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:78 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:153 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "A-Z" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "" #: core/song.cpp:336 msgid "AIFF" msgstr "" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "" #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "" #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "" #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "" #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "" #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "" #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "" #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "" #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Saare kalakaar" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "" #: ui/about.cpp:74 msgid "All the translators" msgstr "" #: library/library.cpp:84 msgid "All tracks" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "" #: internet/spotifyblobdownloader.cpp:60 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:61 msgid "An error occurred loading the iTunes database" msgstr "" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:78 msgid "And:" msgstr "" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Kalakar" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "" #: ui/about.cpp:65 msgid "Authors" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "" #: core/database.cpp:734 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "" #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "" #: core/song.cpp:339 msgid "CDDA" msgstr "" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "" #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "" #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "" #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "" #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "" #: ui/equalizer.cpp:115 msgid "Classical" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: internet/lastfmsettingspage.cpp:110 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 "" #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "" #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:116 msgid "Club" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "" #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "" #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "" #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "" #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "" #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "" #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "" #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "" #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:64 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: transcoder/transcoder.cpp:432 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "" #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "" #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "" #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "" #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "" #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "" #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "" #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "" #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "" #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "" #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:63 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "" #: core/song.cpp:328 msgid "Flac" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:43 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "" #: core/database.cpp:673 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "" #: internet/lastfmservice.cpp:437 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:154 msgid "Last.fm password" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "" #: ui/equalizer.cpp:123 msgid "Live" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "" #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "" #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "" #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "" #: core/song.cpp:330 msgid "MPC" msgstr "" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "" #: library/library.cpp:74 msgid "Most played" msgstr "" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "" #: library/library.cpp:67 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:80 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "" #: core/utilities.cpp:147 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:366 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "" #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "" #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "" #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "" #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "" #: core/organise.cpp:65 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:124 msgid "Party" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "" #: widgets/osd.cpp:156 msgid "Paused" msgstr "" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "" #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "" #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" 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:206 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "" #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "" #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:460 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "" #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "" #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 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 "" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "" #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "" #: core/song.cpp:341 msgid "Stream" msgstr "" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "" #: ui/about.cpp:70 msgid "Thanks to" msgstr "" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "" #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:56 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:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:174 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:151 msgid "Third level" msgstr "" #: internet/jamendoservice.cpp:171 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "" #: core/song.cpp:338 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "" #: devices/giolister.cpp:161 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "" #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "" #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "" #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "" clementine-1.2.0+dfsg/src/translations/hr.po000066400000000000000000004657121223327513400210560ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # gogo , 2010 # gogo , 2010 # printheos , 2013 # gogo , 2013 # gogo , 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-11 09:28+0000\n" "Last-Translator: gogo \n" "Language-Team: Croatian (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr " dana" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " msek" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " točka" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " sekundi" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " pjesme" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 albuma" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 dana" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 dana prije" #: podcasts/gpoddersync.cpp:79 #, 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:413 #, qt-format msgid "%1 selected of" msgstr "%1 odabranih od" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 pjesma" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 pjesme" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 pronađenih pjesma" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 pronađenih pjesama (prikazuje %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 pjesama" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 preuzeto" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: module Wiimote uređaja" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n nije uspjelo" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n završeno" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "&Podešeno" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "Dodaci" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "Pomoć" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "&Sakrij %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "&Sakrij..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Lijevo" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "Glazba" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Nijedan" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "Popis izvođenja" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Zatvorite Clementine" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "Način ponavljanja" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Desno" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "Način naizmjeničnog sviranja" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "&Rastegni stupce da stanu u prozor" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "Alati" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(različito kroz više pjesama)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "...i svi Amarokovi suradnici" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "0 piksela" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 dan" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 pjesma" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "127.0.0.1" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "40 %" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 naizmjeničnih pjesama" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "Nadogradite odmah na Premium račun" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "Napravite novi račun ili ponovno postavite svoju lozinku" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "Grooveshark Anywhere račun je potreban." #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "Spotify Premium račun je obvezan." #: ../bin/src/ui_networkremotesettingspage.h:189 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:78 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:153 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 sa ovm uvjetima" #: smartplaylists/searchterm.cpp:297 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "SVA SLAVA HYPNOTOADU!" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "Prekini" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "O %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "O Clementine..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "O Qt..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Pojedinosti računa" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "Pojedinosti računa (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Radnja" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Aktiviraj/deaktiviraj Wii Daljinski upravljač" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "Dodajte podcast" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Dodajte stream" #: ../bin/src/ui_notificationssettingspage.h:425 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:193 msgid "Add action" msgstr "Dodajte radnju" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Dodajte novi stream..." #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Dodajte direktorij..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "Dodaj datoteku" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "Dodaj datoteku u enkôder" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "Dodaj datoteku(e) u enkôder" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Dodajte datoteku..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Dodajte datoteku za transkôdiranje..." #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Dodajte mapu" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Dodajte mapu..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Dodajte novu mapu" #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "Dodajte podcast" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "Dodajte podcast..." #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Dodajte izraz za traženje" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "Dodajte oznaku albuma pjesme" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "Dodajte oznaku izvođača albuma" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "Dodajte oznaku izvođača pjesme" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "Dodaj auto pogodak pjesme" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "Dodajte oznaku skladatelja pjesme" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "Dodajte oznaku diska pjesme" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "Dodajte oznaku naziva pjesme" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "Dodajte oznaku žanra pjesme" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "Dodajte oznaku grupiranja pjesme" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "Dodajte oznaku duljine pjesme" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "Dodajte oznaku izvođača pjesme" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "Dodajte oznaku brojeva izvođenja pjesme" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "Dodaj ocjenu pjesme" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "Dodajte oznaku brojeva preskakanja pjesme" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "Dodajte oznaku naziva pjesme" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "Dodajte oznaku broja pjesme" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "Dodajte oznaku godine pjesme" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Dodajte stream..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "Dodaj u Grooveshark omiljene" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "Dodaj u Grooveshark popis izvođenja" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "Dodajte na drugi popis izvođenja" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Dodajte u popis izvođenja" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "Odaberite za reprodukciju i dodajte na popis izvođenja" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Dodajte radnju Wiimote uređaja" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Dodajte..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Dodano ovaj mjesec" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Dodano ovaj tjedan" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Dodano ove godine" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Dodano danas" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Dodano tijekom tri mjeseca" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "Dodavanje glazbe u Moju glazbu" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "Dodavanje pjesme u omiljene" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Napredno grupiranje..." #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "Nakon " #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "Nakon kopiranja..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Album (idealna glasnoća za sve pjesme)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Izvođač albuma" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "Omot albuma" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Album info na jamendo.com..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Albumi sa omotima" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Albumi bez omota" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Sve datoteke" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "Sva slava Hypnotoadu!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Svi albumi" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Svi izvođači" #: ui/albumcoverchoicecontroller.cpp:47 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:74 msgid "All the translators" msgstr "Svi prevoditelji" #: library/library.cpp:84 msgid "All tracks" msgstr "Sve pjesme" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "Dopusti klijentu da preuzme glazbu sa ovog računala." #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "Dopusti preuzimanja" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "Dopusti mid/side enkôdiranje" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "Pokraj orginala" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Uvijek sakrij glavni prozor" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Uvijek prikaži glavni prozor" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "Uvijek započinji reprodukciju glazbe" #: internet/spotifyblobdownloader.cpp:60 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:61 msgid "An error occurred loading the iTunes database" msgstr "Greška je nastala tijekom učitavanja iTunes baze podataka" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Greška je nastala zapisivanjem metapodataka '%1'" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "Dogodila se neodređena greška." #: ui/about.cpp:78 msgid "And:" msgstr "I:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "Bijesan" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Izgled" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Dodajte datoteku/URL u popis izvođenja" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "Dodajte na trenutni popis izvođenja" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "Pjesma će biti dodana na popis izvođenja" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "Primjenite kompresiju da spriječite isječak" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Sigurno želite izbrisati \"%1\" postavke?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "Sigurno želite izbrisati ovaj popis izvođenja?" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "Sigurno želite resetirati statistiku pjesama?" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Izvođač" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Info izvođača" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "Izvođač radia" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "Vrsta glazbe izvođača" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "Prvi izvođač" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Format zvuka" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Provjera autentičnosti nije uspjela" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "Autor" #: ui/about.cpp:65 msgid "Authors" msgstr "Autori" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Auto" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Automatsko ažuriranje" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "Automatski otvori pojedine kategorije u stablu fonoteke" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "Dostupno" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "Prosječna brzina prijenosa" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "Prosječna veličina slike" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "BBC podcasti" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "Stream pozadine" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Boja pozadine" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "Slika pozadine" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Prozirnost pozadine" #: core/database.cpp:734 msgid "Backing up database" msgstr "Sigurnosno kopiranje baze podataka" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "Balansiranje" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Zabrana" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "Bar analizator" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Osnovno plava" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "Osnovni zvučni format" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Ponašanje" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "Najbolje" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "Životopis sa %1" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Brzina prijenosa" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "Brzina prijenosa" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "Blok analizator" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "Vrsta bloka" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "Zamućenje" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "Pojedinosti" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "Boom analizator" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Pogledaj..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "Trajanje međuspremnika" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "Međupohrana" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "Ovi izvori su onemogućeni:" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Tipke" #: core/song.cpp:339 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "Podrška za CUE listu" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "Otkaži" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Promijenite omot albuma" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Promijeni veličinu slova..." #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "Promjenu načina ponavljanja" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Promijeni prečac..." #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "Promijenite naizmjenični mod" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Promijeni jezik" #: ../bin/src/ui_playbacksettingspage.h:330 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:228 msgid "Check for new episodes" msgstr "Provjeri za nove nastavke" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Provjeri ima li nadogradnja" #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "Izaberite naziv za svoj pametni popis izvođenja" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Automatski odabir" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Odaberite boju..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "Odaberite slova..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Odaberite sa popisa" #: smartplaylists/querywizardplugin.cpp:155 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." #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "Odaberi direktorij preuzimanja podcasta" #: ../bin/src/ui_songinfosettingspage.h:188 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:115 msgid "Classical" msgstr "Klasičan" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "Brisanje" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Isprazni" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Ispraznite popis izvođenja" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Clementine greška" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Clementine narančasto" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Clementine vizualizacija" #: ../bin/src/ui_deviceproperties.h:376 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_boxsettingspage.h:104 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:104 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:104 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_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "Clementine može reproducirati glazbu koju ste spremili na Ubuntu One" #: ../bin/src/ui_notificationssettingspage.h:431 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:250 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 sa vašim ostalim računalima i podcast aplikacijama. Napravite račun." #: visualisations/projectmvisualisation.cpp:128 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." #: internet/lastfmsettingspage.cpp:110 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 "Clementine ne može preuzeti status vaše pretplate jer postoji problemi sa vašom vezom. Svirane pjesme biti će spremljene i poslane kasnije u Last.fm." #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Clementine preglednik slika" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "Clementine nije pronašao rezultate za ovu datoteku" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "Clementine će potražiti glazbu u:" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Kliknite ovdje kako biste dodali glazbu!" #: playlist/playlisttabbar.cpp:293 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:72 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_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "Zatvori popis izvođenja" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "Zatvorite vizualizaciju" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "Zatvaranje ovog prozora poništit će download." #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "Zatvaranje ovog prozora zaustavit će pretragu omota albuma" #: ui/equalizer.cpp:116 msgid "Club" msgstr "Klub" #: ../bin/src/ui_appearancesettingspage.h:272 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:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Komentar" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "Završi oznake automatski" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "Završite oznake automatski..." #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Skladatelj" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "Konfiguracija %1..." #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "Podesi Grooveshark..." #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Podesi Last.fm..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "Podesi Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Podesi prečace" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "Podesite Spotify ..." #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "Podesi Subsonic..." #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "Podesite globalno pretraživanje..." #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "Podesi fonoteku..." #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "Podesite podcaste..." #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "Podesi..." #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "Spoji Wii Daljinski upravljač koristeći aktiviraj/deaktiviraj naredbu" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "Spoji uređaj" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "Spajanje Spotify-a" #: internet/subsonicsettingspage.cpp:107 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/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Veza je istekla, provjerite URL poslužitelja. Npr. http://localhost:4040/" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "Konzola" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "Konstantna brzina prijenosa" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "Konvertiraj svu glazbu" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "Konvertiraj svu glazbu koju uređaj može reproducirati" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "Kopiraj u međuspremnik" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Kopirajte na uređaj..." #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Kopirajte u fonoteku..." #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "Autorsko pravo" #: internet/subsonicsettingspage.cpp:81 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:64 #, 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" #: transcoder/transcoder.cpp:432 #, 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:426 #, 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/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "Nije moguće učitati Last.fm radio stanicu" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "Nije moguće otvoriti izlaznu datoteku %1" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Upravljanje omotima" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "Omot albuma iz ugrađene slike" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Omot albuma učitan automatski iz %1" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "Omot albuma ručno uklonjen" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "Omot albuma nije postavljen" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "Omot albuma postavljen iz %1" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "Omoti sa %1" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "Napravite novi Grooveshark popis izvođenja" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "Postepeno utišaj kada se pjesma mijenja automatski" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "Postepeno utišaj kada se pjesma mijenja ručno" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "Prilagođeno" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "Odaberite sliku pozadine:" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "Prilagođene postavke poruka" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "Ručno odabrani radio" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Prilagođeno..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "DBus putanja" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Dance" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Izrađeno datuma" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Izmjenjeno datuma" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "Dani" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "Za&dano" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "Smanji glasnoću zvuka za 4%" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "Smanji glanoću zvuka za posto" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Smanji glasnoću zvuka" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "Uobičajena slika pozadine" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "Zadano" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "Pauza između vizualizacija" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "Izbriši" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "Izbrišite Grooveshark popis izvođenja" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "Obriši preuzete podatke" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Izbrišite datoteku" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Izbrišite sa uređaja..." #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Izbrišite sa diska..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "Obriši reproducirane nastavke" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "Izbrišite predložak" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "Izbrišite pametni popis izvođenja" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "Izbriši orginalne datoteke" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Brisanje datoteka" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "Uklonite označenu pjesmu sa reprodukcije" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "Uklonite označenu pjesmu za reprodukciju" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Odredište" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Pojedinosti..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Uređaj" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Mogućnosti uređaja" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Naziv uređaja" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Mogućnosti uređaja..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Uređaji" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Jeste li možda mislili" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "Digitalni uvez" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "Lozinka" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "Korisničko ime" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "Direktna internet veza" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Direktorij" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "Onemogućite vrijeme trajanja" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "Onemogući generiranje traka tonaliteta" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Onemogući" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Disk" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "Isprekidani prijenos" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 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:715 msgid "Do a full library rescan" msgstr "Pretražite ponovno cijelu fonoteku" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "Ne konvertiraj glazbu" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "Nemoj prepisati" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Ne ponavljaj" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "Ne prikazuj u različitim izvođačima" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "Ne sviraj naizmjenično" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "Ne zaustavljaj!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "Donirajte" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Za otvaranje kliknite dva puta" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "Dvostrukim klikom pjesma će..." #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "Preuzeto %n nastavaka" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "Preuzmi direktorij" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "Preuzmi nastavke u" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "Učlani se" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "Preuzmi automatski nove nastavke" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "Zahtjev preuzimanja" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "Preuzmite Android aplikaciju" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Preuzmi ovaj album" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Preuzmi ovaj album..." #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "Preuzmi ovaj nastavak" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "Preuzmi..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "Preuzimanje (%1%)..." #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "Preuzimanje Icecast direktorija" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "Preuzimanje Jamendo kataloga" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "Preuzimanje Magnatune kataloga" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "Preuzimanje Spotify dodatka" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "Preuzimanje metapodataka" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "Promijenite položaj pomicanjem mišem" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "Dropbox" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "Dinamičan način je uključen" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "Dinamičan naizmjeničan mix" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "Uredite pametni popis izvođenja..." #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Uredite oznake u \"%1\"..." #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "Uredite oznake..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "Uredite oznake" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Uredite informacije o pjesmi" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "Uredite informacije o pjesmi..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Uredite informacije pjesama..." #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Uredite ..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "Omogući podršku Wii Daljinskog upravljanja" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "Omogući ekvalizator" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "Omogući prečac samo ako je Clementine fokusiran" #: ../bin/src/ui_globalsearchsettingspage.h:147 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:62 msgid "Enable/disable Last.fm scrobbling" msgstr "Omogući/Onemogući Last.fm scrobblanje" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "Složenost enkôdiranja" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "Kvaliteta pogona enkôdiranja" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "Način enkôdiranja" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "Upišite URL" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "Upišite URL da bi mogli preuzeti omot sa interneta:" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "Upišite naziv za izvezene omote (bez vrste datoteke):" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "Upišite novi naziv za popis izvođenja" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Upišite izvođača ili oznaku za početak slušanja Last.fm radia." #: ../bin/src/ui_globalsearchview.h:209 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:77 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:77 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:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "Upišite zahtjev za pretraživanje ovdje" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "Upišite URL internet radio streama:" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "Upišite naziv mape" #: ../bin/src/ui_networkremotesettingspage.h:198 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:87 msgid "Entire collection" msgstr "Cijelu kolekciju" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Greška" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Greška pri spajanju na MTP uređaj" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "Greška u kopiranju pjesama" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "Greška u brisanju pjesama" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "greška pri preuzimanju Spotify dodatka" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "Greška pri učitavanju %1" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Greška pri učitavanju di.fm popisa izvođenja" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "Greška pri obradi %1: %2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "Greška pri učitavanju glazbenog CD-a" #: library/library.cpp:63 msgid "Ever played" msgstr "Ikada reproducirano" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "Svakih 10 minuta" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "Svakih 12 sati" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "Svaka 2 sata" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "Svakih 20 minuta" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "Svakih 30 minuta" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "Svakih 6 sati" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "Svakih sat vremena" #: ../bin/src/ui_playbacksettingspage.h:303 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:208 msgid "Existing covers" msgstr "Postojeći omoti" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "Proširi" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "Istječe %1" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "Izvezi omote" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "Izvoz omota" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "Izvezi preuzete omote" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "Izvezi umetnute omote" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "Izvoz završen" #: ui/albumcovermanager.cpp:786 #, 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:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 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:300 msgid "Fade out when stopping a track" msgstr "Utišaj kada se zaustavlja pjesma" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "Utišavanje" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "Trajanje utišavanja" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "Neuspjelo dohvaćanje direktorija" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "Neuspjelo preuzimanje podcasta" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "Neuspjelo učitavanje podcasta" #: podcasts/podcasturlloader.cpp:167 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:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "Brzo" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "Omiljeno" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "Omiljene pjesme" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "Preuzmi prazne omote" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "Preuzmi automatski" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "Preuzimanje završeno" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "Dohvaćanje Subsonic fonoteke" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Greška pri preuzimanju omota" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "Ekstenzija datoteke" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "Format datoteke" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Naziv datoteke" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "Naziv datoteke (bez putanje)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Veličina datoteke" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Vrsta datoteke" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Naziv datoteke" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Datoteke" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "Datoteke za enkôdiranje" #: smartplaylists/querywizardplugin.cpp:90 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." #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "Prepoznavanje pjesme" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "Kraj" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "Prva razina" #: core/song.cpp:328 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Veličina slova" #: ../bin/src/ui_spotifysettingspage.h:213 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:204 msgid "Force mono encoding" msgstr "Forsiraj mono enkôdiranje" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "Zaboravi uređaj" #: devices/deviceview.cpp:311 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 sa ovog popisa i Clementine će morati ponovno pretražiti sve pjesme sljedeći put kada ga spojite." #: ../bin/src/ui_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Oblik" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "Format" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Broj sličica" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "Okvira po međuspremniku" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Prijatelji" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "Smrznt" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Pun Bas" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "Pun Bas + Treble" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "Pun Treble" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "GStreamer zvučni pogon" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "Općenito" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Opće postavke" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Vrsta glazbe" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "Preuzmi URL za dijeljenje ovog Grooveshark popisa izvođenja" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "Preuzmi URL za dijeljenje ove Grooveshark pjesme" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "Pribavljanje Grooveshark popularnih pjesama" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "Pribavljanje kanala" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "Pribavljanje streamova" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "Upišite naziv streama:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "Idi" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "Idi na sljedeću karticu popisa izvođenja" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "Idi na prijašnju karticu popisa izvođenja" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "Google Disk" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, 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:206 msgid "Grey out non existent songs in my playlists" msgstr "Posivi pjesme kojih nema na popisu izvođenja" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "Grooveshark greška prijave" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "Grooveshark popis izvođenja je URL" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "Grooveshark radio" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "URL Grooveshark pjesmi" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "Grupiraj fonoteku po..." #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "Grupiraj po" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "Grupiraj po Albumu" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "Grupiraj po Izvođaču" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "Grupiraj po Izvođaču/Albumu" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "Grupiraj po Izvođaču/Godini-Albumu" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "Grupiraj po Vrsti glazbe/Albumu" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "Grupiraj po Vrsti glazbe/Izvođaču/Albumu" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "Grupiranje" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "HTML stranica ne sadrži niti jedan RSS izvor" #: internet/subsonicsettingspage.cpp:135 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:163 msgid "HTTP proxy" msgstr "HTTP proxy" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "Sretan" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "Informacije o hardveru" #: ../bin/src/ui_deviceproperties.h:372 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:202 msgid "High" msgstr "Najbrže" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "Puno (%1 fps)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "Visoka (1024x1024)" #: internet/subsonicsettingspage.cpp:112 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:310 msgid "Hours" msgstr "Sati" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "Nemam Magnatune račun" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Ikona" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "Ikona na vrh" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "Prepoznavanje pjesme" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 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:77 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:204 msgid "Ignore \"The\" in artist names" msgstr "Ignoriraj \"The\" u nazivu izvođača" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Slike (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "Za %1 dana" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "Za %1 tjedna" #: ../bin/src/ui_wizardfinishpage.h:86 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/spotifyservice.cpp:360 msgid "Inbox" msgstr "Pristigle poruke" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "Prikaži omot albuma u obavijesti" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "Obuhvati sve pjesme" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Nekompatibilna Subsonic REST protokol inačica. Klijent se mora nadograditi." #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Nekompatibilna Subsonic REST protokol inačica. Poslužitelj se mora nadograditi." #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Nepotpuno podešavanje, pobrinite se da su sva polja popunjena." #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "Pojačaj glasnoću zvuka za 4%" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "Povećaj glanoću zvuka za posto" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Pojačaj glasnoću zvuka" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "Indeksiranje %1" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "Informacije" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "Umetni..." #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Instaliran" #: core/database.cpp:673 msgid "Integrity check" msgstr "Provjera integriteta" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "Internet pružatelji usluga" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "Neispravan API ključ" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Neispravan format" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "Neispravna metoda" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "Neispravni parametri" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "Neispravan izvor naveden" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "Neispravna usluga" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "Neispravan ključ sesije" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "Neispravno korisničko ime i/ili lozinka" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "Jamendo najslušanija pjesma" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "Jamendo top pjesma" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "Jamendo top pjesma mjeseca" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "Jamendo top pjesma tjedna" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "Jamendo baza podataka" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "Prebaci na trenutno reproduciranu pjesmu" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Držite tipke za %1 sekundu..." #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Držite tipke za %1 sekundu..." #: ../bin/src/ui_behavioursettingspage.h:193 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:193 msgid "Keep the original files" msgstr "Zadrži orginalne datoteke" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "Mačići" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Jezik" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "Laptop/Slušalice" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Velika dvorana" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "Veliki omot albuma" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "Velika bočna traka" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "Zadnje reproducirano" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "Last.fm naručen radio: %1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Last.fm fonoteka - %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "Last.fm mix radio - %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Last.fm susjedni radio - %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Last.fm radio stanica - %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Last.fm srodni izvođači u %1" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Last.fm oznaka radio: %1" #: internet/lastfmservice.cpp:437 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:154 msgid "Last.fm password" msgstr "Last.fm lozinka" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "Last.fm broj izvođenja" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Last.fm preporuke" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Last.fm korisničko ime" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Last.fm wiki" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "Najmanje omiljene pjesme" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "Ostavite prazno za zadano. Naprimjer: \"/dev/dsp\", \"front\", itd." #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "Lijevo" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Trajanje" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Fonoteka" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "Napredno grupiranje fonoteke" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "Obavijest o ponovnom pretraživanju fonoteke" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "Pretraživanje fonoteke" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Granice" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "Slušajte Grooveshark pjesme temeljene na prijašnjim slušanjima" #: ui/equalizer.cpp:123 msgid "Live" msgstr "Live" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Učitaj" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "Učitajte omot sa URL" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "Učitajte omot sa URL..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "Učitaj omot sa diska" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "Učitajte omot sa diska..." #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "Otvorite popis izvođenja" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "Otvorite popis izvođenja..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Učitaj Last.fm radio" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Učitaj MTP uređaj" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "Učitaj iPod bazu podataka" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "Učitaj pametni popis izvođenja" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "Učitavanje pjesama" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "Učitaj stream" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "Učitavanje pjesama" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "Učitavanje informacija o pjesmi" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "Učitavanje..." #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "Učitaj Datoteke/URL, zamijeni trenutni popis izvođenja" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Prijava" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "Neuspjela prijava" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "Profil dugoročnog predviđanja (DP)" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "Sviđa mi se" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Malo (%1 fps)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "Niska (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "Profil niske složenosti (NS)" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "Tekstovi pjesama" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "Tekstovi pjesama sa %1" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Magnatune preuzimanje" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Magnatune preuzimanje završeno" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "Glavni profil (GLAVNI)" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "Učinite tako!" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "Učini popis izvođenja dostupnim kada je veza prekinuta" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "Neispravan odgovor" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "Ručno proxy podešavanje" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "Ručno" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "Proizvođač" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "Označi kao preslušano" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "Označi kao novo" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "Svaki uvjet za pretragu se mora podudarati (AND)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "Jedan ili više uvjeta za pretragu se mora podudarati (OR)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "Maksimalna brzina prijenosa" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "Srednje (%1 fps)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "Srednja (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "Vrsta članstva" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "Minimalna brzina prijenosa" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "Nedostaju projectM predložci" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "Model" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "Nadziri fonoteku radi promjena" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "Mono reprodukcija" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "Mjeseci" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "Tonalitet" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "Stil trake tonaliteta" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "Traka tonaliteta" #: library/library.cpp:74 msgid "Most played" msgstr "Najviše reproducirano" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "Točka montiranja" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "Točka montiranja" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "Pomakni dolje" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "Premjesti u fonoteku..." #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "Pomakni gore" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "Glazba" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Fonoteka" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "Utišaj" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "Moja Last.fm fonoteka" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "Moj Last.fm mix radio" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "Moj Last.fm susjed" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "Moj Last.fm preporučeni radio" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "Moj mix radio" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "Moja glazba" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "Moje susjedstvo" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "Moje radio stanice" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "Moje preporuke" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Naziv" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "Mogućnosti promjene naziva" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "Uskopojasni (UP)" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "Susjedi" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "Mreža" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "Mrežni Proxy" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "Mrežno upravljanje" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "Nikada" #: library/library.cpp:67 msgid "Never played" msgstr "Nikada reproducirano" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "Nikada ne započinji reprodukciju glazbe" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "Nova mapa" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "Novi popis izvođenja" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "Novi pametni popis izvođenja" #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "Nove pjesme" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "Nova pjesma bit će automatski dodana." #: library/library.cpp:80 msgid "Newest tracks" msgstr "Najnovija pjesma" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "Sljedeća pjesma" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Sljedeća pjesma" #: core/utilities.cpp:147 msgid "Next week" msgstr "Sljedeći tjedan" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "Bez analizatora" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "Bez slike pozadine" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "Nema omota za izvoz." #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "Bez dugih blokova" #: playlist/playlistcontainer.cpp:366 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:145 msgid "No short blocks" msgstr "Bez kratkih blokova" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "Ništa" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 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:155 msgid "Normal" msgstr "Normalan" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "Normalna vrsta blokova" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "Nije dostupno tijekom korištenja dinamičkog popis izvođenja" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "Nije spojeno" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "Nema dovoljno sadržaja" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "Nema dovoljno obožavatelja" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "Nema dovoljno članova" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "Nema dovoljno susjeda" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Nije instaliran" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "Niste prijavljeni" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "Nije montirano - dva put klikni za montiranje" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "Vrsta obavijesti" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Obavijesti" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Sada se reproducira" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "OSD Prikaz" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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 veze 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:187 msgid "Only allow connections from the local network" msgstr "Samo dopusti veze sa lokalne mreže" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Samo prikaži prvi" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "Opacity" msgstr "Zasjenjenost" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "Otvori %1 u pregledniku" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "Otvorite &glazbeni CD..." #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "Otvori OPML datoteku" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "Otvori OPML datoteku..." #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "Otvorite uređaj" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "Otvorite datoteku..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "Otvori u Google Disku" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "Otvorite u novom popisu izvođenja" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Otvorite..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "Radnja nije izvršena" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "Podesite brzinu prijenosa" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "Podesite kvalitetu" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "Mogućnosti..." #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "Organizirajte datoteke" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "Organizirajte datoteke..." #: core/organise.cpp:65 msgid "Organising files" msgstr "Organiziranje datoteka" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "Orginalne oznake" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Druge mogućnosti" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "Izlaz" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "Izlazni uređaj" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "Izlazne mogućnosti" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "Izlazni priključak" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "Prepiši sve" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "Prekopiraj preko postojeće datoteke" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "Prepiši samo manje" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "Vlasnik" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "Raščlanjivanje Jamendo kataloga" #: ui/equalizer.cpp:124 msgid "Party" msgstr "Party" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "Lozinka" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Pauziraj reprodukciju" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "Pauziraj reprodukciju" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Reprodukcija pauzirana" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "Izvođač" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "Piksela" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "Jednostavna bočna traka" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Pokreni reprodukciju" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "Reproduciraj izvođača ili oznaku" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "Reproduciraj Izvođača radia..." #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "Broj izvođenja" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "Reproduciraj ručno odabrani radio..." #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "Reproduciraj ako se zaustavi, pauziraj ako svira" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "Reproduciraj glazbu ako se trenutno ništa ne reproducira" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "Reproduciraj odabrani radio..." #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "Reproduciraj pjesmu iz popisa izvođenja" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "Pokreni reprodukciju/Pauziraj" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Reprodukcija" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Mogućnosti preglednika" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "Popis izvođenja" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "Popis izvođenja je završen" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "Mogućnosti popisa izvođenja" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "Vrsta popisa izvođenja" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "Popis izvođenja" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "Odaberite vaš preglednik i vratite se u Clementine." #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "Status dodatka:" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "Podcasti" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Pop" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "Popularne pjesme" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "Popularne pjesme mjeseca" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "Danas popularne pjesme" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "Trajanje skočnog prozora, obavijesti ili ljepšeg OSD-a" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "Ulaz" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "Pred-pojačanje" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "Mogućnosti" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "Mogućnosti..." #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "Prioritetni nazivi omota albuma (odvojeno zarezom)" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "Željeni zvučni format" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "Poželjna brzina prijenosa" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "Željeni format" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "Premium zvučni format" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "Predložci:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "Pritisni kombinaciju tipka za korištenje" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "Pritisni tipku" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Pritisni kombinaciju tipka za korištenje %1..." #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "Mogućnosti ljepšeg OSD-a" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "Prikaz" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "Prijašnja pjesma" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 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:131 msgid "Profile" msgstr "Profil" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "Napredak" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 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:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "Kvaliteta" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "Tražim uređaj..." #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "Upravljanje odabranim pjesmama za reprodukciju" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "Odaberite označenu pjesmu za reprodukciju" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "Odaberite pjesmu za reprodukciju" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "Radio (jednaka glasnoća za sve pjesme)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "Radio stanice" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "Kiša" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "Naizmjenična vizualizacija" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "Ocjenite trenutnu pjesmu sa 0 zvijezdica" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "Ocjenite trenutnu pjesmu sa 1 zvijezdicom" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "Ocjenite trenutnu pjesmu sa 2 zvijezdice" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "Ocjenite trenutnu pjesmu sa 3 zvijezdice" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "Ocjenite trenutnu pjesmu sa 4 zvijezdice" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "Ocjenite trenutnu pjesmu sa 5 zvijezdica" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "Ocjena" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "Stvarno želite prekinuti?" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "Ograničenje preusmjeravanja je premašeno, potvrdite podešavanje poslužitelja." #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "Osvježi" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "Osvježi katalog" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "Osvježi kanale" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "Osvježi popis prijatelja" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "Osvježi popis stanica" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "Osvježi streamove" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Reggae" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "Zapamti wiiremote zamah" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "Zapamti od prošlog pokretanja" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Uklonite" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "Uklonite radnju" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "Ukloni duplikate iz popisa izvođenja" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "Uklonite mapu" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "Ukoni iz Moje glazbe" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "Ukloni iz omiljenih" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "Uklonite iz popisa izvođenja" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "Ukloni popis izvođenja" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "Ukloni popise izvođenja" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "Uklanjanje pjesama iz Moje glazbe" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "Uklanjanje pjesama iz omiljenih" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "Promijeni naziv \"%1\" popisa izvođenja" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "Promijeni naziv Grooveshark popisa izvođenja" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "Preimenujte popis izvođenja" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "Preimenujte popis izvođenja..." #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "Promjenite redosljed pjesama ovim redosljedom..." #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Ponovi" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "Ponovi album" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "Ponovi popis izvođenja" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "Ponovi pjesmu" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Zamijenite trenutni popis izvođenja" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "Zamijenite popis izvođenja" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "Zamjeni razmake sa podcrtama" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "Ponavljanje pojačanja" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "Način pred-pjačanja" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "Izmješajte pjesme" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "Potreban je kôd autentifikacije" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "Poništite" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" msgstr "Poništite broj izvođenja" #: 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:206 msgid "Restrict to ASCII characters" msgstr "Ograniči na ASCII znakove" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "Nastavi reprodukciju od prošloga pokretanja" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "Primanje Grooveshark pjesama Moje glazbe" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "Dobivanje Grooveshark omiljenih pjesama" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "Dobivanje Grooveshark popisa izvođenja" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "Povratak u Clementine" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "Desno" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "Pokreni" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "SOCKS proxy" #: internet/subsonicsettingspage.cpp:122 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:202 msgid "Safely remove device" msgstr "Sigurno ukloni uređaj" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "Sigurno ukloni uređaj nakon kopiranja" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "Frekvencija" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "Frekvencija" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "Spremi .mood datoteke u vašu fonoteku" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "Spremite omot albuma" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "Spremite omot na disk..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "Preuzmi sliku" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "Spremite popis izvođenja" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "Spremite popis izvođenja..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "Spremite predložak" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "Spremi ocjene u datoteku oznaka kada je moguće" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "Spremi statistiku u datoteku oznaka kada je moguće" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "Spremite ovaj stream u internet kartici" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "Spremanje statistike pjesama u datoteke pjesama" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "Spremam pjesme" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "Profil skalabilne brzine uzorkovanja (SBU)" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "Promijeni veličinu" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "Pogodci" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "Scrobblaj pjesmu koju slušam" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "Traži" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "Pretražite Icecast stanice" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "Icecast Jamendo" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Pretražite Magnatune stanice" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "Subsonic pretraživanje" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "Pretražite omote albuma..." #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "Upišite pretragu" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "Pretraži gpodder.net" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "Pretraži iTunes" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "Način pretraživanja" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "Mogućnosti pretraživanja" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "Rezultati pretrage" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "Uvjeti pretraživanja" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "Pretraživanje Groovesharka" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "Druga razina" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "Traži unatrag" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "Traži unaprijed" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "Traži pjesmu koja se tranutno izvodi po ralativnom broju" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "Traži pjesmu koja se tranutno izvodi po apsolutnom položaju" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "Odaberi sve" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "Odaberi ništa" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "Odaberite boju pozadine:" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "Odaberite sliku pozadine" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "Odaberite najbolju moguću podudarnost" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "Odaberite boju slova:" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "Odaberite vizualizaciju" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "Odaberite vizualizaciju..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "Serijski broj" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "URL poslužitelja" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "Pojedinosti poslužitelja" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "Usluga nedostupna" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Postavite %1 na \"%2\"..." #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "Postavi glasnoću zvuka na posto" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "Postavi vrijednosti za sve odabrane pjesme..." #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "Postavke" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Prečac" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "Prečac za %1" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Prečac za %1 već postoji" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Prikaži" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "Prikaži OSD" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "Prikaži sjajnu animaciju za trenutnu pjesmu" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "Prikaži traku tonaliteta u traci napretka pjesme" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "Prikaži izvornu obavijest radne površine" #: ../bin/src/ui_notificationssettingspage.h:442 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:441 msgid "Show a notification when I change the volume" msgstr "Prikaži obavijest kada mijenjate glasnoću zvuka" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "Prikažite skočni prozor iz trake sustava" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "Prikaži ljepši OSD" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "Prikaži iznad statusne trake" #: ui/mainwindow.cpp:460 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:209 msgid "Show cover art in library" msgstr "Prikaži omot albuma u fonoteci" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "Prikaži razdjelnike u stablu fonoteke" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "Prikaži u punoj veličini..." #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "Prikaži u pregledniku datoteka..." #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "Prikaži u različitim izvođačima" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "Prikaži traku tonaliteta" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "Prikaži samo duplicirane pjesme" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "Prikaži samo neoznačene pjesme" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "Prikaži prijedloge pretraživanja" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "Prikaži \"Sviđa mi se\" i \"Zabrana\" tipku" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "Prikaži tipku scrobblanja u glavnom prozoru" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "Prikaži ikonu u traci sustava" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "Prikaži omogućene i onemogućene izvore" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "Prikaži/Sakrij" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Sviraj naizmjenično" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "Sviraj naizmjenično albume" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "Sviraj naizmjenično sve" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "Izmješajte popis izvođenja" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "Sviraj naizmjenično pjesme u ovom albumu" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "Prijava" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "Odjavi se" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "Prijavljivanje..." #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "Srodni izvođači" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "Veličina" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "Razlučivost:" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "Preskoči unatrag u popisu izvođenja" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "Preskoči računanje" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "Preskoči unaprijed u popisu izvođenja" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "Mali omot albuma" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "Mala bočna traka" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "Pametni popis izvođenja" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "Pametni popisi izvođenja" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "Informacije o pjesmi" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "Info pjesme" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "Sonogram" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "Isprika" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "Razvrstaj po vrsti glazbe (abecednim redosljedom)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "Razvrstaj po vrsti glazbe (po popularnosti)" #: ../bin/src/ui_icecastfilterwidget.h:77 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" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "Izvor" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "Izvori" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "Spotify greška prijave" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "Spotify dodatak" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "Spotify dodatak nije instaliran" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "Standardno" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "Sa zvjezdicom" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "Pokrenite popis izvođenja koji se trenutno izvodi" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "Započni enkôdiranje" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 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:405 #, qt-format msgid "Starting %1" msgstr "Započinjem %1" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "Započinjem..." #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "Stanice" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Zaustavi reprodukciju" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "Zaustavi nakon" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "Zaustavi reprodukciju nakon ove pjesme" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Zaustavi reprodukciju" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "Zaustavi reprodukciju nakon trenutne pjesme" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "Reprodukcija zaustavljena" #: core/song.cpp:341 msgid "Stream" msgstr "Stream" #: internet/subsonicsettingspage.cpp:30 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:160 msgid "Streaming membership" msgstr "Streaming račun" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "Pretplaćeni popis izvođenja" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "Pretplatnici" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "Uspješno!" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "Uspješno zapisano %1" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "Predložene oznake" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "Sažetak" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "Super visoko (%1 fps)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "Super visoka (2048x2048)" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "Podržani formati" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "Uskaldi statistiku sa datotekama odmah" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "Sinkronizacija Spotify ulaznog spremnika" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "Sinkroniziranje Spotify popisa izvođenja" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "Sinkronizacija Spotify pjesama označenim zvjezdicama" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "Boje sustava" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "Kartice pri vrhu" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Oznake" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "Preuzimanje oznaka" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "Označi radio" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "Ciljana brzina prijenosa" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "Mogućnosti teksta" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Zahvaljujemo" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "\"%1\" naredba se ne može pokrenuti." #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "Omot albuma trenutno reproducirane pjesme" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "Direktorij %1 nije valjan" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "Popis izvođenja '%1' je prazan ili se ne može očitati." #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "Stranica koju ste zatražli nije slika!" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "Postoje i druge pjesme u ovom albumu" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "Dogodio se problem u komunikaciji sa gpodder.net" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Dogodio se problem u preuzimanju metapodataka iz Magnatune" #: podcasts/itunessearchpage.cpp:76 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:56 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:389 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:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 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:187 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:174 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:151 msgid "Third level" msgstr "Treća razina" #: internet/jamendoservice.cpp:171 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/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "Ovaj album nije dostupan u zadanom formatu" #: ../bin/src/ui_deviceproperties.h:381 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:375 msgid "This device supports the following file formats:" msgstr "Uređaj podržava sljedeće formate datoteka:" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Uređaj neće raditi ispravno" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Ova mogućnost se može promijeniti u \"Ponašanje\" osobitostima" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "Ovaj stream je samo za pretplaćene korisnike" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "Ova vrst uređaja nije podržana: %1" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "Istek vremena" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Naziv" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "Za pokretanje Grooveshark radija, Prvo biste trebali poslušati nekoliko drugih Grooveshark pjesama" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "Danas" #: core/globalshortcuts.cpp:59 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:1369 msgid "Toggle queue status" msgstr "Uključi/isključi stanje reda čekanja" #: ../bin/src/ui_mainwindow.h:718 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:143 msgid "Tomorrow" msgstr "Sutra" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "Previše preusmjeravanja" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "Najpopularnije pjesme" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "Ukupno albuma:" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "Ukupno preuzeto bajtova" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "Ukupno mrežnih zahtjeva" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Broj" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "Enkôdiranje glazbe" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "Log enkôdiranja" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "Enkôdiranje" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Enkôdiranje %1 datoteka koristeći %2 zadana" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "Mogućnosti enkôdiranja" #: core/song.cpp:338 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "Turbina" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "Isključivanje" #: devices/giolister.cpp:161 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "URL(ovi)" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "Ubuntu One lozinka" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "Ubuntu One korisničko ime" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "Ultra širokopojasni (UŠP)" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Nije moguće preuzeti %1 (%2)" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Nepoznato" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "Nepoznata vrsta sadržaja" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Nepoznata greška" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "Uklonite omot" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "Otkažite pretplatu" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "Nadolazeći koncerti" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "Ažuriraj Grooveshark popis izvođenja" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "Ažuriraj sve podcaste" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "Ažurirajte promjene u mapi fonoteke" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "Ažuriraj fonoteku kada se Clementine pokrene" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "Ažuriraj ovaj podcast" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "Ažuriranje" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Ažuriranje %1" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "Ažuriranje %1..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Ažuriranje fonoteke" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "Upotreba" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "Koristi oznaku izvođača albuma kada je dostupna" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "Koristi Gnome prečace" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "Koristi ponovno dobivene metapodatake ako su dostupni" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "Koristi SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "Koristi Wii Daljinski upravljač" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "Koristi prilagođene boje" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "Koristi prilagođene poruke za obavijesti" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "Koristi mrežni daljinski upravljač" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "Koristite autentifikaciju" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "Koristi pogon upravitelja brzine prijenosa" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "Koristi dinamički mod" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "Koristi obavijesti za prijavu statusa Wii Daljinskog upravljača" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "Koristi vremensko oblikovanje šuma" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "Koristi zadano sustavom" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "Koristi boje zadane sustavom" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "Koristi proxy postavke sustava" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "Koristi normalizaciju glasnoće zvuka" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "Iskorišteno" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "Korisnik %1 nema Grooveshark Anywhere račun" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "Korisničko sučelje" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Korisničko ime" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "Korištenje izbornika pri dodavanju pjesme će..." #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "Promjenjiva brzina prijenosa" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "Razni izvođači" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "Inačica %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "Pogled" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "Način vizualizacije" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "Vizualizacija" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "Mogućnosti vizualizacije" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "Detekcija govorne aktivnosti" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "Glasnoća zvuka %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "Upozori me pri zatvaranju kartice popisa izvođenja" #: core/song.cpp:337 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "Web stranica" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "Tjedni" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "Kada je Clementine pokrenut" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "Kada je popis prazan..." #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "Mogli biste još poslušati..." #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "Širokopojasni (ŠP)" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii Daljinski upravljač %1: aktiviran" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii Daljinski upravljač %1: spojen" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii Daljinski upravljač %1: baterija kritično (%2%) " #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii Daljinski upravljač %1: deaktiviran" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii Daljinski upravljač %1: odspojen" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Daljinski upravljač %1: slaba baterija (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "Wiimote uređaj" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "Windows Media audio" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "Bez omota:" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Želite li preseliti druge pjesme sa ovog albuma u razne izvođače?" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "Želite li pokrenuti ponovnu potpunu prtetragu odmah?" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "Zapiši svu statistiku pjesama u datoteke pjesama" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "Pogrešno korisničko ime ili lozinka." #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "Godina" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "Godina - Album" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "Godine" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "Jučer" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "Preuzeti ćete sljedeće albume" #: playlist/playlistlistcontainer.cpp:311 #, 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:177 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:172 msgid "You are not signed in." msgstr "Niste prijavljeni." #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "Prijavljeni ste kao %1." #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "Prijavljeni ste." #: ../bin/src/ui_groupbydialog.h:123 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/digitallyimportedsettingspage.cpp:46 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/magnatunesettingspage.cpp:53 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:57 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." #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "Možete scrobblat pjesme besplatno, ali samo pretplatnici mogu slušati streamove Last.fm radia iz Clementine." #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "Nemate Grooveshark Anywhere račun." #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Nemate Spotify Premium račun." #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "Nemate aktivnu pretplatu" #: internet/spotifyservice.cpp:170 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/spotifysettingspage.cpp:158 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:87 msgid "You love this track" msgstr "Sviđa vam se ova pjesma" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "Morate pokrenuti mogućnosti sustava i uključiti ih \"Omogući pristup za pomoćne uređaje\" da koriste globalne prečace u Clementine" #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "Morate ponovno pokrenuti Clementine ako mijenjate jezik." #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "Ako niste Last.fm pretplatnik nećete biti u mogućnosti slušati Last.fm radio stanice." #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "Vaša IP adresa:" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Vaši Last.fm pristupni podaci su neispravni" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "Vaši Magnatune pristupni podaci su neispravni" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "Vaša fonoteka je prazna!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "Vaši radio streamovi" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "Vaši scrobbles: %1" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Vašem sustavu nedostaje OpenGL podrška, vizualizacija je nedostupna." #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "Vaše korisničko ime ili lozinka su neispravni." #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Nula" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "dodajte %n pjesama" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "nakon" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "prije" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "i" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "automatski" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "prije" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "Između" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "najveći prvi" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "sadrži" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "onemogućeno" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "disk %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "ne sadrži" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "završetak sa" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "jednak" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "gpodder.net" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "gpodder.net direktorij" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "veći od" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "u posljednjih" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "manje od" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "najduži prvi" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "premjesti %n pjesama" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "najnovije prvo" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "nije jednako" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "nije u posljednjih" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "nije na" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "najstarije prvo" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "na" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "mogućnosti" #: ../bin/src/ui_networkremotesettingspage.h:203 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:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "premjesti %n pjesama" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "najkraći prvi" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "naizmjenične pjesme" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "najmanji prvi" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "razvrstaj pjesme" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "započnite sa" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "zaustavi" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "pjesma %1" clementine-1.2.0+dfsg/src/translations/hu.po000066400000000000000000004616601223327513400210570ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # FIRST AUTHOR , 2010 # gyeben , 2012 # lukibeni , 2012 # Márk Lutring , 2012 # Péter Polonkai , 2012 # ricsipontaz , 2012 # Sándor Balikó , 2011 # ulysses , 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:08+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Hungarian (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr " napok" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " kbit/s" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " pt" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " másodperc" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " számok" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 album" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 nap" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 nappal ezelőtt" #: podcasts/gpoddersync.cpp:79 #, 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:413 #, qt-format msgid "%1 selected of" msgstr "%1 kiválasztva" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 szám" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 szám" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 szám megtalálva" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 szám megtalálva (mutatva %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 szám" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 átküldve" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimotedev modul" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "%fájlnév%" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n meghiúsult" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n befejezve" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "&Egyéni" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "Extrák" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "&Súgó" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "&%1 elrejtése" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "&Elrejtés..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Balra" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "Zene" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Egyik sem" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "Lejátszási lista" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Kilépés" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "Ismétlési mód" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Jobbra" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "Véletlenszerű lejátszási mód" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "&Oszlopszélességek igazítása az ablakhoz" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "Eszközök" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(különbözik több számnál)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "...és az összes Amarok közreműködő" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "0px" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 nap" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 szám" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 véletlen szám" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "Válts Prémiumra most" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "Grooveshark Anywhere fiók szükséges." #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "Spotify prémium fiók szükséges" #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:78 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:153 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:297 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "MINDEN DICSŐSÉG A HYPNOTOADÉ!" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "A(z) %1 névjegye" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "A Clementine névjegye" #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "Qt névjegye…" #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Fiók részletek" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "Fiók részletek (prémium)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Esemény" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Wiiremote aktiválása/deaktiválása" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "Podcast hozzáadása" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Adatfolyam hozzáadása" #: ../bin/src/ui_notificationssettingspage.h:425 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:193 msgid "Add action" msgstr "Esemény felvétele" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Új adatfolyam hozzáadása" #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Mappa hozzáadása" #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "Új fájl" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Fájl hozzáadása" #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Fájlok felvétele átkódoláshoz" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Mappa hozzáadása" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Mappa hozzáadása..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Új mappa hozzáadása…" #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "Podcast hozzáadása" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "Podcast hozzáadása..." #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Keresési feltétel megadása" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "Album címke hozzáadása" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "Album előadó hozzáadása" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "Előadó címke hozzáadása" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "Zeneszerző címke hozzáadása" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "Lemezsorszám címke hozzáadása" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "A szám fájlnevének hozzáadása" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "Műfaj címke hozzáadása" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "Számhossz hozzáadása" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "Lejátszásszámláló hozzáadása" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "Számkihagyás számláló hozzáadása" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "Számcím címke hozzáadása" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "Szám sorszámának hozzáadása" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "Szám évének hozzáadása" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Adatfolyam hozzáadása…" #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "Hozzáadás a Grooveshark kedvencekhez" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "Hozzáadás a Grooveshark lejátszólistákhoz" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "Hozzáadás másik lejátszási listához" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Hozzáadás a lejátszási listához" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "Sorbaállít" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Wiimotedev esemény hozzáadása" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Hozzáadás.." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Hozzáadva ebben a hónapban" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Hozzáadva ezen a héten" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Hozzáadva ebben az évben" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Hozzáadva ma" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Hozzáadva három hónapon belül" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "Számok hozzáadása a Zenéimhez" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "Számok hozzáadása a kedvencekhez" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Egyedi csoportosítás…" #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "Utána" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "Másolás után…" #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Album (ideális hangerő minden számhoz)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Album-előadó" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "Albumborító" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Album információ a jamendo.com-ról…" #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Albumok borítóval" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Albumok bórító nélkül" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Minden fájl (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "Minden Dicsőség a Hypnotoadnak!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Minden album" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Minden előadó" #: ui/albumcoverchoicecontroller.cpp:47 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:74 msgid "All the translators" msgstr "Minden fordító" #: library/library.cpp:84 msgid "All tracks" msgstr "Minden szám" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "Mid/side kódolás engedélyezése" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "Az eredetiek mellett" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Mindig rejtse a főablakot" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Mindig mutassa a főablakot" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "Mindig indítja a lejátszást" #: internet/spotifyblobdownloader.cpp:60 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:61 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:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Hiba történt '%1' metaadatainak írása közben" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:78 msgid "And:" msgstr "És:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "Mérges" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Megjelenés" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Fájlok/URL-ek hozzáadása a lejátszási listához" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "Hozzáfűz az aktuális listához" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "Hozzáadja a lejátszási listához" #: ../bin/src/ui_playbacksettingspage.h:318 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:197 #, 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?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "Biztosan törölni szeretnéd ezt a lejátszási listát?" #: ui/edittagdialog.cpp:769 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:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Előadó" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Előadó infó" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "Előadó rádió" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "Előadó címkék" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "Előadó kezdése" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Hang formátum" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "A hitelesítés meghiúsult" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "Szerző" #: ui/about.cpp:65 msgid "Authors" msgstr "Szerzők" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Automatikus" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Automatikus frissítés" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "Egyelemű kategóriák automatikus listázása a zenetárban" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "Elérhető" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "Átlagos bitráta" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "Átlagos képméret" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "BBC podcastok" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "Háttér adatfolyamok" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Háttérszín" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "Háttérkép" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Háttér áttetszősége" #: core/database.cpp:734 msgid "Backing up database" msgstr "Adatbázis biztonsági mentése" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Tiltás" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "Oszlop" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Egyszerű kék" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "Alap audió típus" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Viselkedés" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "Legjobb" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "Életrajz innen: %1" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Bitráta" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "Bitráta" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "Blokk" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "Blokk típus" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "Törzs" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "Fellendülés" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Tallózás…" #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "Pufferelés" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "De ezek a források le vannak tiltva:" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Gombok" #: core/song.cpp:339 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "CUE fájl támogatás" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "Mégsem" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Albumborító módosítása" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Betűméret megváltoztatása..." #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "Ismétlési mód megváltoztatása" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Billentyűparancs módosítása..." #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "Véletlenszerű lejátszási mód megváltoztatása" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Nyelv váltása" #: ../bin/src/ui_playbacksettingspage.h:330 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:228 msgid "Check for new episodes" msgstr "Új epizódok keresése" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Frissítés keresése..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "Válassz egy nevet az intelligens lejátszási listádnak" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Automatikus választás" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Szín választása..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "Betűtípus választása..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Választás a listáról" #: smartplaylists/querywizardplugin.cpp:155 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." #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "Válassza ki podcastok letöltési helyét" #: ../bin/src/ui_songinfosettingspage.h:188 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:115 msgid "Classical" msgstr "Klasszikus" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "Tisztítás" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Kiürít" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Lejátszási lista űrítése" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Clementine hiba" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Clementine Narancs" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Clementine Megjelenítés" #: ../bin/src/ui_deviceproperties.h:376 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_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:104 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:104 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_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "A Clementine képes lejátszani a számait amit ön feltöltött az Ubuntu One-ba" #: ../bin/src/ui_notificationssettingspage.h:431 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:250 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:128 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." #: internet/lastfmsettingspage.cpp:110 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 "A Clementine nem tudja frissíteni a fiókodhoz tartozó információkat, mert problémák adódtak az kapcsolatban. A lejátszott számokhoz tartozó információk mentve lesznek és később küldésre kerülnek a Last.fm-hez." #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Clementine képmegjelenítő" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "Nincsenek találatok ehhez a fájlhoz" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "A Clementine ezen források között fog zenéket keresni:" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Zene felvételéhez kattintson ide" #: playlist/playlisttabbar.cpp:293 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:72 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_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "Lejátszólista bezárása" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "Megjelenítés bezárása" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "Ezen ablak bezárása megszakítja a letöltést." #: ui/albumcovermanager.cpp:216 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:116 msgid "Club" msgstr "Club" #: ../bin/src/ui_appearancesettingspage.h:272 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:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Megjegyzés" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "Címkék automatikus kiegészítése" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "Címkék automatikus kiegészítése" #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Zeneszerző" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "%1 beállítása..." #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "Grooveshark beállítás..." #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Last.fm beállítása" #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "Magnatune beállítása..." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Billentyűkombinációk beállítása" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "Spotify beállítása..." #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "Globális keresés beállítása..." #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "Zenetár beállítása..." #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "Podcastok beállítása…" #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "Beállítás..." #: ../bin/src/ui_wiimotesettingspage.h:186 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:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "Eszköz csatlakoztatása" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "Csatlakozás a Spotifyhoz" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "Konzol" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "Állandó bitráta" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "Minden szám tömörítése" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "Az eszköz által nem támogatott számok konvertálása" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "Másolás vágólapra" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Másolás eszközre..." #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Másolás a zenetárba..." #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "Szerzői jog" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:64 #, 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." #: transcoder/transcoder.cpp:432 #, 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:426 #, 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/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "Nem sikerült betölteni a Last.fm rádióállomást" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "A %1 célfájl megnyitása sikertelen" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Borítókezelő" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "Albumborító a beágyazott képből" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Az albumborítót %1 helyről automatikusan betölti" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "Az albumborító manuálisan eltávolítva" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "Albumborító nincs beállítva" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "Albumborító beállítva %1 helyről" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "Borítók %1 helyről" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "Új Grooveshark lejátszólista létrehozása" #: ../bin/src/ui_playbacksettingspage.h:302 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:301 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:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "Egyéni" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "Egyéni kép:" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "Egyedi üzenetbeállítások" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "Egyéni rádió" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Egyéni..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "DBus elérési útvonal" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Dance" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Létrehozás dátuma" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Módosítás dátuma" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "Nap" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "&alapértelmezés" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "Hangerő csökkentése 4%-kal" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Hangerő csökkentése" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "Alapértelmezett háttérkép" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "Alapértelmezések" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "Megjelenítések között váltás ideje" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "Törlés" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "Grooveshark lejátszólista törlése" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "Letöltött adatok törlése" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Fájlok törlése" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Törlés az eszközről..." #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Törlés a lemezről..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "Lejátszott epizódok törlése" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "Beállítás törlése" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "Intelligens lejátszási lista törlése" #: ../bin/src/ui_organisedialog.h:194 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:1363 msgid "Dequeue selected tracks" msgstr "Kiválasztott számok törlése a sorból" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "Szám törlése a sorból" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Cél" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Részletek…" #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Eszköz" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Eszköztulajdonságok" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Eszköznév" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Eszköztulajdonságok..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Eszközök" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Talán erre gondoltál:" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "Digitally Imported jelszó" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "Digitally Imported felhasználónév" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "Közvetlen internetkapcsolat" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Mappa" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "Időtartam letiltása" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "Hangulatsáv generáció letiltása" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Tiltva" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Lemez" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "Szakaszos átvitel" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 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:715 msgid "Do a full library rescan" msgstr "Teljes zenetár újraolvasása" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "Ne konvertáljon egy számot sem" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Ne ismételjen" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "Ne mutassa a különböző előadók között" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "Ne keverje össze" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "Ne álljon meg!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Dupla kattintás a megnyitáshoz" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "Dupla kattintásra egy számon..." #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "%n epizód letöltése" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "Letöltési mappa" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "Epizódok letöltése ide" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "Tagsági információk betöltése" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "Új epizódok automatikus letöltése" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "Letöltés sorba állítva" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Album letöltése" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Album letöltése..." #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "Epizód letöltése" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "Letöltés…" #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "Letöltés (%1%)..." #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "Icecast könyvtár letöltése" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "Jamendo katalógus letöltése" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "Magnatune katalógus letöltése" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "Spotify beépülő letöltése" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "Metaadat letöltése" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "Fogja meg az áthelyezéshez" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "Dropbox" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "Dinamikus mód bekapcsolva" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "Dinamikus véletlenszerű mix" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "Intelligens lejátszási lista szerkesztése..." #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "\"%1\" információ módosítása..." #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "Címke módosítása..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "Címkék szerkesztése" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Száminformációk szerkesztése" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "Száminformációk szerkesztése..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Száminformációk szerkesztése" #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Szerkesztés..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "Wii távvezérlő támogatás engedélyezése" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "Hangszínszabályzó engedélyezése" #: ../bin/src/ui_wiimotesettingspage.h:187 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_globalsearchsettingspage.h:147 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:62 msgid "Enable/disable Last.fm scrobbling" msgstr "Last.fm scrobbling engedélyezése/tiltása" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "Átkódolás komplexitása" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "Átkódolás minősége" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "Kódolási mód" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "Adjon meg egy URL-t" #: ../bin/src/ui_coverfromurldialog.h:103 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:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "Adjon meg új nevet ennek a lejátszási listának" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Adjon meg egy előadót vagy címkét, hogy Last.fm rádiót hallgathasson." #: ../bin/src/ui_globalsearchview.h:209 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:77 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:77 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:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "Adja meg a keresési kifejezést" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "Adja meg egy rádió adatfolyam URL címét:" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "Adja meg a mappa nevét" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "A teljes kollekció" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Hiba" #: 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:55 msgid "Error copying songs" msgstr "Hiba történt a számok másolása közben" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "Hiba történt a számok törlése közben" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "Hiba a Spotify beépülő letöltése közben" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "Hiba %1 betöltésekor" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Hiba a di.fm lejátszólista letöltésekor" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "Hiba %1: %2 feldolgozásakor" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "Hiba az hang CD betöltése közben" #: library/library.cpp:63 msgid "Ever played" msgstr "Valaha játszott" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "Minden 10. percben" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "Minden 12. órában" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "Minden 2." #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "Minden 20. percben" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "Minden 30. percben" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "Minden 6. órában" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "Minden órában" #: ../bin/src/ui_playbacksettingspage.h:303 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:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "Kibontás" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "Lejár ekkor: %1" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "Elhalkulás szám megállításakor" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "Elhalkulás" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "Elhalkulás hossza" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "A mappa lekérése meghiúsult" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "Nem sikerült letölteni a podcastot" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "Nem sikerült betölteni a podcastot" #: podcasts/podcasturlloader.cpp:167 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:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "Gyors" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "Kedvencek" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "Kedvenc számok" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "A hiányzó borítók letöltése" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "Letöltés automatikusan" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "Letöltés sikeres" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Hiba a borító betöltése közben" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "Fájlkiterjesztés" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "Fájl formátumok" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Fájlnév" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "Fájlnév (útvonal nélkül)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Fájlméret" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Fájltípus" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Fájlnév" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Fájlok" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "Átkódolandó fájlok" #: smartplaylists/querywizardplugin.cpp:90 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." #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "Ujjlenyomat generálása a számhoz" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "Befejez" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "Első szinten" #: core/song.cpp:328 msgid "Flac" msgstr "FLAC" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Betűméret" #: ../bin/src/ui_spotifysettingspage.h:213 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:204 msgid "Force mono encoding" msgstr "Mono kódolás kényszerítése" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "Eszköz elfelejtése" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Űrlap" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "Formátum" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Frissítési gyakoriság" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "Képkockák pufferenként" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Barátok" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "Fagyos" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Teljes basszus" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "Teljes basszus + Magas" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "Teljes magas" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "GStreamer hang meghajtó" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "Általános" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Általános beállítások" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Műfaj" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "URL lekérése ezen Grooveshark lejátszási lista megosztásához" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "URL lekérése ezen Grooveshark lejátszási lista megosztásához" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "Grooveshark népszerű számok beszerezése" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "Csatornák betöltése" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "Adatfolyamok lekérése" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "Adjon meg egy nevet:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "Ugrás" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "Váltás a következő lejátszási lista lapra" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "Váltás az előző lejátszási lista lapra" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, 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:206 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_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "Grooveshark belépési hiba" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "Grooveshark lejátszási lista URL-je" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "Grooveshark rádió" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "Grooveshark szám URL-je" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "Zenetár csoportosítása..." #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "Csoportosítás" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "Album szerint" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "Előadó szerint" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "Előadó/Album szerint" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "Előadó/Év - Album szerint" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "Műfaj/Album szerint" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "Műfaj/Előadó/Album szerint" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "A HTML oldal nem tartalmaz RSS forrást" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "HTTP proxy" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "Boldog" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "Hardverjellemzők" #: ../bin/src/ui_deviceproperties.h:372 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:202 msgid "High" msgstr "Magas" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "Magas (%1 fps)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "Magas (1024x1024)" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "Óra" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "Nincs Magnatune fiókom" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Ikon" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "Ikonok felül" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "Zeneszám azonosítása" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 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:77 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:204 msgid "Ignore \"The\" in artist names" msgstr "A \"The\" mellőzése előadó nevekben" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Képek (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "%1 napon belül" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "%1 héten belül" #: ../bin/src/ui_wizardfinishpage.h:86 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/spotifyservice.cpp:360 msgid "Inbox" msgstr "Beérkezett üzenetek" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "Albumborító megjelenítése az értesítésben" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "Vegyen bele minden számot" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "Hangerő növelése 4%-kal" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Hangerő növelése" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "%1 indexelése" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "Információ" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "Beszúrás..." #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Telepítve" #: core/database.cpp:673 msgid "Integrity check" msgstr "Integritás ellenőrzése" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "Internet szolgáltatók" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "Érvénytelen API kulcs" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Érvénytelen formátum" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "Érvénytelen eljárás" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "Érvénytelen paraméterek" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "Hibás eszközspecifikáció" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "Érvénytelen szolgáltatás" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "Érvénytelen munkafolyamat kulcs" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "Érvénytelen felhasználói név és/vagy jelszó" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "Legtöbbet hallgatott számok a Jamendon" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "Legnépszerűbb számok a Jamendon" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "A hónap legnépszerűbb számai a Jamedon" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "A Jamendo legnépszerűbb számai a héten" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "Jamendo adatbázis" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "Ugrás a most lejátszott számra" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Tartsa nyomva a gombokat %1 másodpercig" #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Tartsa nyomva a gombokat %1 másodpercig" #: ../bin/src/ui_behavioursettingspage.h:193 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:193 msgid "Keep the original files" msgstr "Eredeti fájlok megőrzése" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "Kismacskák" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Nyelv" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "Laptop/Fejhallgató" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Nagy terem" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "Nagy albumborító" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "Nagy oldalsáv" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "Utoljára lejátszva" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "Last.fm Egyéni Rádió: %1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Last.fm Zenetár - %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "Last.fm Mix Rádió - %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Last.fm Szomszédos Rádió - %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Last.fm Rádió Állomás - %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Last.fm Hasonló Előadók - %1" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Last.fm Címke Rádió: %1" #: internet/lastfmservice.cpp:437 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:154 msgid "Last.fm password" msgstr "Last.fm jelszó" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "Last.fm lejátszás számláló" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Last.fm címkék" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Last.fm felhasználói név" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Last.fm wiki" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "Legkevésbé kedvelt számok" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "Hagyja üresen az alapértelmezéshez. Példák: \"/dev/dsp\", \"front\", stb." #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Időtartam" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Zenetár" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "Zenetár egyedi csoportosítása" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "Zenetár újraolvasási figyelmeztetés" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "Keresés a zenetárban" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Szűrések" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "Grooveshark zenék hallgatása, az előzőleg hallgatott zeneszámok alapján" #: ui/equalizer.cpp:123 msgid "Live" msgstr "Élő" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Betöltés" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "Borító letöltése URL-ről" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "Borító letöltése URL-ről..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "Borító betöltése lemezről" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "Borító betöltése lemezről..." #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "Lejátszási lista betöltése" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "Lejátszási lista betöltése..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Last.fm rádió betöltése" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "MTP eszköz beolvasása" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "iPod adatbázis betöltése" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "Inteligens lejátszási lista betöltése" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "Számok betöltése" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "Adatfolyam betöltése" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "Számok betöltése" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "Szám információk betöltése" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "Töltés..." #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "Fájlok/URL-ek betöltése, lejátszási lista cseréje" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Bejelentkezés" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "Sikertelen bejelentkezés" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "Hosszú távú előrejelzésen alapuló profil (LTP" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "Kedvenc" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Alacsony (%1 fps)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "Alacsony (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "Alacsony komplexitású profil (LC)" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "Dalszövegek" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "%1" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Magnatune Letöltés" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Letöltés a Magnatuneról befejezve" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "Fő profil (MAIN)" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "Lejátszólista elérhetővé tétele offline módban is" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "Hibásan formázott válasz" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "Kézi proxybeállítás" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "Manuálisan" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "Gyártó" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "Megjelölés meghallgatottként" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "Megjelölés újként" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "Illeszkedés minden keresési feltételre (ÉS)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "Illeszkedés legalább egy keresési feltételre (VAGY)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "Maximális bitráta" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "Közepes (%1 fps)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "Közepes (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "Tagság típusa" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "Minimális bitráta" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "Hiányzó projectM beállítások" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "Modell" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "Zenetár figyelése változások után" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "Mono lejátszás" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "Hónap" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "Hangulat" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "Hangulatsáv stílus" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "Hangulatsávok" #: library/library.cpp:74 msgid "Most played" msgstr "Gyakran játszott" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "Csatolási pont" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "Csatolási pontok" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "Mozgatás lefelé" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "Áthelyezés a zenetárba..." #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "Mozgatás felfelé" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "Zene" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Zenetár" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "Némítás" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "A Last.fm zenetáram" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "A Last.fm mix rádióm" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "A Last.fm szomszédaim" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "A Last.fm ajánlott rádióm" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "Az én mixem rádió" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "Zenéim" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "Szomszédaim" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "A rádióadóm" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "Ajánlásaim" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Név" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "Elnevezési opciók" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "Keskenysávú (NB)" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "Szomszédok" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "Hálózat" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "Hálózati Proxy" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "Soha" #: library/library.cpp:67 msgid "Never played" msgstr "Sohasem játszott" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "Soha ne indítsa el a lejátszást" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "Új mappa" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "Új lejátszási lista" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "Új intelligens lejátszási lista..." #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "Új számok" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "Az új számok automatikusan fel lesznek véve." #: library/library.cpp:80 msgid "Newest tracks" msgstr "Legújabb számok" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "Következő" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Következő szám" #: core/utilities.cpp:147 msgid "Next week" msgstr "Következő héten" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "Kikapcsolva" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "Nincs háttérkép" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "Hosszú blokkok nélkül" #: playlist/playlistcontainer.cpp:366 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:145 msgid "No short blocks" msgstr "Rövid blokkok nélkül" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "Egyik sem" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 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:155 msgid "Normal" msgstr "Normális" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "Normál blokkok" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "Nem elérhető dinamikus lejátszási lista használatakor" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "Nincs kapcsolat" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "Nincs elég tartalom" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "Nincs elég rajongó" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "Nincs elég tag" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "Nincs elég szomszédja" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Nincs telepítve" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "Nem vagy bejelentkezve" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "Nincs csatolva - kattintson duplán a csatoláshoz" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "Értesítés módja" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Értesítések" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Most játszott" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "OSD Előnézet" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "OGG FLAC" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 msgid "Only allow connections from the local network" msgstr "" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Csak a legelsőt mutassa" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "Opacity" msgstr "" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "%1 megnyitása a böngészőben" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "&Hang CD megnyitása..." #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "OPML-fájl megnyitása" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "OPML-fájl megnyitása..." #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "Eszköz megnyitása" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "Fájl megnyitása..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "Google Drive megnyitása" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "Megnyitás új lejátszási listán" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Megnyitás..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "A művelet sikertelen" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "Optimalizálás bitrátára" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "Optimalizálás minőségre" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "Beállítások..." #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "Fájlok rendezése" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "Fájlok rendezése..." #: core/organise.cpp:65 msgid "Organising files" msgstr "Fájlok rendezés alatt" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "Eredeti címkék" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Egyéb beállítások" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "Kimenet beállításai" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "Létező fájlok felülírása" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "Tulajdonos" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "Jamendo katalógus feldolgozása" #: ui/equalizer.cpp:124 msgid "Party" msgstr "Party" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "Jelszó" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Szünet" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "Lejátszás szüneteltetése" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Szüneteltetve" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "Egyszerű oldalsáv" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Lejátszás" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "Előadó vagy Címke lejátszása" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "Előadó rádió lejátszása" #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "Lejátszások száma" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "Egyéni rádió lejátszása..." #: core/commandlineoptions.cpp:152 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:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "Lejátszás, ha nincs lejátszás folyamatban" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "Címke rádió lejátszása..." #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "A(z) . szám lejátszása a listában" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "Lejátszás/Szünet" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Lejátszás" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Lejátszó beállítások" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "Lejátszási lista" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "A lejátszási lista befejezve" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "Lejátszási lista beállítások" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "Lejátszási lista típus" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "Lejátszási lista" #: ../data/oauthsuccess.html:36 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:214 msgid "Plugin status:" msgstr "Beépülő állapot:" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "Podcastok" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Pop" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "Népszerű dalok" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "A hónap népszerű számai" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "A nap népszerű számai" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "Értesítés időtartama" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "Port" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "Előerősítő" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "Beállítások" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "Beállítások..." #: ../bin/src/ui_librarysettingspage.h:202 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:167 msgid "Preferred audio format" msgstr "Előnyben részesített hangformátum" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "Kedvelt bitráta" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "Előnyben részesített formátum" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "Prémium audió típus" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "Beállítás:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 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:73 msgid "Press a key" msgstr "Nyomjon meg egy billentyűt" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, 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_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "Pretty OSD beállítások" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "Előnézet" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "Előző" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 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:131 msgid "Profile" msgstr "Profil" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "Folyamat" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 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:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "Minőség" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "Eszköz lekérdezése..." #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "Sorkezelő" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "Sorba állítja a kiválasztott számokat" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "Szám sorba állítása" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "Rádió (egyenlő hangerő minden számhoz)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "Rádiók" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "Eső" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "Véletlenszerű megjelenítés" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "A most játszott szám értékelése 0 csillaggal" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "A most játszott szám értékelése 1 csillaggal" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "A most játszott szám értékelése 2 csillaggal" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "A most játszott szám értékelése 3 csillaggal" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "A most játszott szám értékelése 4 csillaggal" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "A most játszott szám értékelése 5 csillaggal" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "Értékelés" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "Tényleg mégse?" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "Frissítés" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "Katalógus frissítése" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "Csatornák frissítése" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "Barátok listájának frissítése" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "Állomáslista frissítése" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "Adatfolyamok frissítése" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Reggae" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "Emlékezzen a Wii távvezérlő mozdulatra" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "Ahogy legutoljára volt" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Eltávolítás" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "Esemény eltávolítása" #: ../bin/src/ui_mainwindow.h:720 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:189 msgid "Remove folder" msgstr "Mappa eltávolítása" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "Eltávolítás a Zenéimből" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "Eltávolítás a kedvencekből" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "Eltávolítás a lejátszási listáról" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "Számok eltávolítása a Zenéimből" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "Számok eltávolítása a kedvencekből" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "„%1” lejátszólista átnevezése" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "Grooveshark lejátszólista átnevezése" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "Lejátszási lista átnevezése" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "Lejátszási lista átnevezése..." #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "Számok újraszámozása ebben a sorrendben..." #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Ismétlés" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "Album ismétlése" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "Lejátszási lista ismétlése" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "Szám ismétlése" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Az aktuális lista cseréje" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "Lejátszási lista cseréje" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "Szóközök alulvonásokkal való helyettesítése" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "Replay Gain" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "Újbóli feltöltés" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "Visszaállítás" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" msgstr "Lejátszás számlálók visszaállítása" #: 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:206 msgid "Restrict to ASCII characters" msgstr "Korlátozás ASCII karakterekre" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "„Grooveshark - Zenéim” zeneszámok lekérése" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "„Grooveshark - kedvencek” zeneszámok lekérése" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "Grooveshark lejátszási listák lekérése" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "Visszatérés a Clementine-be" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "Futtatás" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "SOCKS proxy" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "Eszköz biztonságos eltávolítása" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "Eszköz biztonságos eltávolítása másolás után" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "Mintavételi sűrűség" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "Mintavétel" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "A .mood fájlok mentés a zenekönyvtárba" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "Albumborító mentése" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "Borító mentése lemezre..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "Kép mentése" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "Lejátszási lista mentése" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "Lejátszási lista mentése..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "Beállítás mentése" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "Adatfolyam mentése az Internet fül alá" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "Számok mentése" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "Skálázható mintavételezési profil (SSR)" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "Pontszám" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "Az általam hallgatott számok Scrobble funkcióval történő figyelése" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "Keresés" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "Icecast állomások keresése" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "Keresés Jamendo-n" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Keresés a Magnatune-on" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "Albumborítók keresése..." #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "Keresés bármire" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "Keresés gpodder.neten" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "Keresés iTunes-on" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "Keresési mód" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "Keresési beállítások" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "Találatok" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "Keresési feltételek" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "Keresés Groovesharkon" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "Második szinten" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "Léptetés hátra" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "Léptetés előre" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "Léptetés hátra" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "A lejátszott szám adott pozícióra léptetése" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "Összes kiválasztása" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "Kiválasztás megszüntetése" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "Válassz háttérszínt:" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "Háttérkép kiválasztása" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "A legjobban illeszkedő találatot választja" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "Válassz előtéri színt:" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "Megjelenítések kiválasztása" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "Megjelenítések kiválasztása..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "Sorozatszám" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "A szolgáltatás nem üzemel" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "%1 beállítása \"%2\"-ra/re..." #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "Hangerő beállítása százalékra" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "Érték beállítása minden kiválasztott számnak..." #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Billentyűparancs" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "%1 billentyűparancsa" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "%1 billentyűparancsa már létezik" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Megjelenítés" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "OSD megjelenítése" #: ../bin/src/ui_playbacksettingspage.h:298 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:293 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:434 msgid "Show a native desktop notification" msgstr "Rendszer alapértelmezett értesítés mutatása" #: ../bin/src/ui_notificationssettingspage.h:442 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:441 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:436 msgid "Show a popup from the system tray" msgstr "Értesítés megjelenítése a rendszertálcán" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "Pretty OSD megjelenítése" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "Jelenítse meg az állapotsáv fölött" #: ui/mainwindow.cpp:460 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:209 msgid "Show cover art in library" msgstr "Albumborító megjelenítése a zenetárban" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "Elválasztók mutatása" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "Jelenítse meg teljes méretben..." #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "Mutassa a fájlböngészőben..." #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "Jelenítse meg a különböző előadók között" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "Hangulatsáv megjelenítése" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "Csak az ismétlődések mutatása" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "Csak a címke nélküliek mutatása" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "Keresési javaslatok megjelenítése" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "Jelenítse meg a \"kedvenc\" és \"tiltás\" gombokat" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "Scrobble gomb mutatása a főablakban" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "Tálcaikon megjelenítése" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "Mutassa melyik forrás van engedélyezve vagy letiltva" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "Megjelenítés/Elrejtés" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Keverés" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "Albumok összekeverése" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "Az összes véletlenszerűen" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "Lejátszási lista véletlenszerűen" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "Zeneszámok összekeverése az albumokban" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "Bejelentkezés" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "Kijelentkezés" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "Belépés..." #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "Hasonló előadók" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "Visszalépés a lejátszási listában" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "Kihagyások száma" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "Léptetés előre a lejátszási listában" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "Kis albumborító" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "Kis oldalsáv" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "Intelligens lejátszási lista" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "Intelligens lejátszási listák" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Lágy" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "Lágy Rock" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "Száminformációk" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "Szám infó" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "Szonográfia" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "Bocsánat" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "Rendezés műfaj szerint (abc sorrendben)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "Rendezés műfaj szerint (népszerűség alapján)" #: ../bin/src/ui_icecastfilterwidget.h:77 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" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "Forrás" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "Forrás" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "Hiba a Spotifyra való bejelentkezéskor" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "Spotify beépülő" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "A Spotify beépülő nincs telepítve" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "Normál" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "Kedvenc" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "Az éppen lejátszott lista indítása" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "Átkódolás indítása" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 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:405 #, qt-format msgid "Starting %1" msgstr "%1 indítása" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "Indítás…" #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "Állomások" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Leállít" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "Megállít utána" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "Leállítás az aktuális szám után" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Lejátszás leállítása" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "Leállítás az aktuális szám után" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "Leállítva" #: core/song.cpp:341 msgid "Stream" msgstr "Adatfolyam" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "Adatfolyam tagság" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "Feliratkozott lejátszólisták" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "Feliratkozók" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "Siker!" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "%1 sikeresen írva" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "Javasolt címkék" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "Összegzés" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "Nagyon magas (%1 fps)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "Nagyon magas (2048x2048)" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "Támogatott formátumok" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "Spotify üzenetek szinkronizálása" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "Spotify lejátszási lista szinkronizálása" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "Spotify csillagozott számok szinronizálása" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "Rendszer színek" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "Lapfülek felül" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Címke" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "Címke letöltő" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "Címkerádió" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "Cél bitráta" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "Szövegopciók" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Köszönet" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "A \"%1\" parancs nem végrehajtható." #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "A jelenleg játszott szám albumborítója" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "A %1 mappa érvénytelen" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "A '%1' lejátszási lista üres vagy érvénytelen." #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "A kért oldal nem egy kép!" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "Vannak más zeneszámok is ebben az albumban" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 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/magnatunedownloaddialog.cpp:158 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" #: podcasts/itunessearchpage.cpp:76 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:56 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:389 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:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 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:174 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:151 msgid "Third level" msgstr "Harmadik szinten" #: internet/jamendoservice.cpp:171 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/magnatunedownloaddialog.cpp:175 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_deviceproperties.h:381 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:375 msgid "This device supports the following file formats:" msgstr "Ez az eszköz az alábbi fájlformátumokat támogatja:" #: devices/devicemanager.cpp:566 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:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "Ez az adatfolyam csak előfizetőknek érhető el" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "A %1 eszköztípus nem támogatott" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "Időkorlát" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Cím" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "A Grooveshark rádió elindításához előbb meg kell hallgatnia néhány más Grooveshark zeneszámot." #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "Ma" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "OSD ki-bekapcsolása" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Teljes képernyő" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "Sorállapot megjelenítése" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "Scrobble funkció váltása" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "Holnap" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "Túl sok átirányítás" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "Népszerű számok" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "Összes átküldött bájt" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "Összes hálózati kérés" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Szám" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "Zene átkódolása" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "Átkódolási napló" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "Átkódolás" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Átkódolás %1 fájlt %2 folyamatban" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "Kódolási opciók" #: core/song.cpp:338 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "Turbina" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "Kikapcsolás" #: devices/giolister.cpp:161 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "URL(-ek)" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "Ultra szélessávú (UWB)" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "%1 (%2) nem letölthető" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Ismeretlen" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "Ismeretlen tartalom" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Ismeretlen hiba" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "Borító törlése" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "Leiratkozás" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "Következő koncertek" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "Grooveshark lejátszólisták frissítése" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "Összes podcast frissítése" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "Megváltozott zenetárbeli könyvtárak frissítése" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "Zenetár frissítése a Clementine indításakor" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "Podcast frissítése" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "Frissítés" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "%1 frissítése" #: devices/deviceview.cpp:103 #, 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:150 msgid "Usage" msgstr "Kihasználtság" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "Album előadója címke használata (ha elérhető)" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "Gnome gyorsbillentyűk használata" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "Replay Gain adatok használata, ha elérhetőek" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "Wii távvezérlő használata" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "Saját színkészlet használata" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "Egyéni üzenet használata értesítésnél" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "Hitelesítés használata" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "Bitráta menedzselés használata" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "Dinamikus mód használata" #: ../bin/src/ui_wiimotesettingspage.h:188 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:139 msgid "Use temporal noise shaping" msgstr "Átmeneti zajszűrő alkalmazása" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "Rendszer alapértelmezés használata" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "Rendszer alapértelmezett színkészletének használata" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "A rendszer proxy beállításainak használata" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "Hangerő normalizálása" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "Használt" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "%1 felhasználónak nincs Grooveshark Anywhere fiókja" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "Kezelőfelület" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Felhasználónév" #: ../bin/src/ui_behavioursettingspage.h:207 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:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "Változó bitráta" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "Különböző előadók" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "%1 Verzió" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "Nézet" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "Megjelenítés módja" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "Megjelenítések" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "Megjelenítések Beállításai" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "Hangtevékenység felismerése" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "Hangerő %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "WAV" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "Weboldal" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "Hét" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "Amikor a Clementine elindul" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "Amikor a lista üres..." #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "Miért nem próbálja..." #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "Széles sávú (WB)" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii távvezérlő %1: aktiválva" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii távvezérlő %1: kapcsolódva" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii távvezérlő %1: kritikus teleptöltés (%2%) " #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii távvezérlő %1: deaktiválva" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii távvezérlő %1: lekapcsolódva" #: widgets/osd.cpp:259 #, 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:182 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "Windows Media audio" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:530 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:2088 msgid "Would you like to run a full rescan right now?" msgstr "Akarsz futtatni egy teljes újraolvasást most?" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "Év" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "Év - Album" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "Év" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "Tegnap" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "A következő albumokat készül letölteni" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "Nem vagy bejelentkezve." #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "Be vagy jelentkezve, mint %1." #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "Be vagy jelentkezve." #: ../bin/src/ui_groupbydialog.h:123 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/digitallyimportedsettingspage.cpp:46 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/magnatunesettingspage.cpp:53 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:57 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." #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "Scrobble funkcióval ingyenesen figyeltetheted a számokat, de csak előfizetők hallgathatnak Last.fm rádiót a Clementineből." #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "Nincs Grooveshark Anywhere fiókod." #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Nincs Spotify prémium fiókod." #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "Nincs aktív feliratkozása" #: internet/spotifyservice.cpp:170 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/spotifysettingspage.cpp:158 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:87 msgid "You love this track" msgstr "Kedveled ezt a számot" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "A Rendszerbeállításokban engedélyeznie kell a \"Hozzáférés engedélyezése kisegítő eszközökhöz\" opciót a globális billentyűparancsok használatához." #: ../bin/src/ui_behavioursettingspage.h:200 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." #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "Last.fm rádióállomásokat nem játszhatsz le, mivel nincs Last.fm fiókod." #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "A Last.fm előfizetési adatai hibásak" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "A Magnatune bejelentkezési adataid nem megfelelőek" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "Az ön zenetára üres!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "Az ön rádió adatfolyamai" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "Scrobblejaid: %1" #: visualisations/visualisationcontainer.cpp:152 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/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "A felhasználóneved vagy a jelszavad hibás." #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Nulla" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "%n szám felvétele" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "után" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "óta" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "és" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "automatikus" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "előtt" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "között" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "nagyobb először" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "tartalmazza" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "letiltva" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "%1. lemez" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "nem tartalmazza" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "végződik" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "egyenlő" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "gpodder.net" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "gpodder.net mappa" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "nagyobb mint" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "az utóbbi" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "kevesebb mint" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "hosszabb először" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "%n szám mozgatása" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "újabb először" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "nem egyezik meg" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "nem az utóbbi" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "régebbi először" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "ezen" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "beállítások" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "nyomja meg az entert" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "%n szám eltávolítása" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "rövidebb először" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "zeneszámok keverése" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "kisebb először" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "rövid számok" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "kezdődik" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "leállítás" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "%1. szám" clementine-1.2.0+dfsg/src/translations/hy.po000066400000000000000000003613001223327513400210510ustar00rootroot00000000000000# 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" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:08+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Armenian (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " վայրկյան" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " երգ" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 ալբոմ" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 օր" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 օր առաջ" #: podcasts/gpoddersync.cpp:79 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "" #: playlist/playlistmanager.cpp:413 #, qt-format msgid "%1 selected of" msgstr "" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 երգ" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 երգ" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 երգ գտավ" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 երգ գտավ (ցույց տրվում է %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, qt-format msgid "%L1 other listeners" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n ավարտված" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "&Օգնություն" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "" #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Ձախ" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Դուրս գալ" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Աջ" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 օր" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "" #: library/library.cpp:60 msgid "50 random tracks" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "" #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:78 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:153 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "A-Z" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "" #: core/song.cpp:336 msgid "AIFF" msgstr "" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "ՏՎԵՔ ԲՈԼՈՐ ՓԱՌՔ «ՀԻՊՆՈՍԻ ԵՆԹԱՐԿՎԱԾ ՄԱՐԴ ԴՈԴՈՇ»" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "" #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Գործողություն" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "" #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "" #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "" #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "" #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "" #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "" #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "" #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "" #: ui/about.cpp:74 msgid "All the translators" msgstr "" #: library/library.cpp:84 msgid "All tracks" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "" #: internet/spotifyblobdownloader.cpp:60 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:61 msgid "An error occurred loading the iTunes database" msgstr "" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:78 msgid "And:" msgstr "" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "" #: ui/about.cpp:65 msgid "Authors" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "" #: core/database.cpp:734 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "" #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "" #: core/song.cpp:339 msgid "CDDA" msgstr "" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "" #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "" #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "" #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "" #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "" #: ui/equalizer.cpp:115 msgid "Classical" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: internet/lastfmsettingspage.cpp:110 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 "" #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "" #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:116 msgid "Club" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "" #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "" #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "" #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "" #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "" #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "" #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "" #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "" #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:64 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: transcoder/transcoder.cpp:432 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "" #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "" #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "" #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "" #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "" #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "" #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "" #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "" #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "" #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "" #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:63 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "" #: core/song.cpp:328 msgid "Flac" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:43 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "" #: core/database.cpp:673 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "" #: internet/lastfmservice.cpp:437 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:154 msgid "Last.fm password" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "" #: ui/equalizer.cpp:123 msgid "Live" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "" #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "" #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "" #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "" #: core/song.cpp:330 msgid "MPC" msgstr "" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "" #: library/library.cpp:74 msgid "Most played" msgstr "" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "" #: library/library.cpp:67 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:80 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "" #: core/utilities.cpp:147 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:366 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "" #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "" #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "" #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "" #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "" #: core/organise.cpp:65 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:124 msgid "Party" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "" #: widgets/osd.cpp:156 msgid "Paused" msgstr "" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "" #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "" #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" 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:206 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "" #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "" #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:460 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "" #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "" #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 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 "" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "" #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "" #: core/song.cpp:341 msgid "Stream" msgstr "" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "" #: ui/about.cpp:70 msgid "Thanks to" msgstr "" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "" #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:56 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:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:174 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:151 msgid "Third level" msgstr "" #: internet/jamendoservice.cpp:171 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "" #: core/song.cpp:338 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "" #: devices/giolister.cpp:161 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "" #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "" #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "" #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "" clementine-1.2.0+dfsg/src/translations/ia.po000066400000000000000000003614221223327513400210270ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Emilio Sepúlveda , 2011 # Emilio Sepúlveda, 2012 # FIRST AUTHOR , 2011 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:08+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Interlingua (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr " dies" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " secundas" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 dies" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 dies retro" #: podcasts/gpoddersync.cpp:79 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "" #: playlist/playlistmanager.cpp:413 #, qt-format msgid "%1 selected of" msgstr "" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, qt-format msgid "%L1 other listeners" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "" #: transcoder/transcodedialog.cpp:192 #, c-format msgid "%n remaining" msgstr "" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "&Custom" msgstr "" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "&Adjuta" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "" #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "&Musica" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "Instrumen&tos" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "" #: core/utilities.cpp:108 msgid "1 day" msgstr "" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "" #: library/library.cpp:60 msgid "50 random tracks" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "" #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:78 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:153 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "A-Z" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "" #: core/song.cpp:336 msgid "AIFF" msgstr "" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "" #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "" #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "" #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "" #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "" #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "" #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "" #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "" #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "" #: ui/about.cpp:74 msgid "All the translators" msgstr "" #: library/library.cpp:84 msgid "All tracks" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "" #: internet/spotifyblobdownloader.cpp:60 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:61 msgid "An error occurred loading the iTunes database" msgstr "" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:78 msgid "And:" msgstr "" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "" #: ui/about.cpp:65 msgid "Authors" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "" #: core/database.cpp:734 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "" #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "" #: core/song.cpp:339 msgid "CDDA" msgstr "" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "" #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "" #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "" #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "" #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "" #: ui/equalizer.cpp:115 msgid "Classical" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: internet/lastfmsettingspage.cpp:110 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 "" #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "" #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:116 msgid "Club" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "" #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "" #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "" #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "" #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "" #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "" #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "" #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "" #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:64 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: transcoder/transcoder.cpp:432 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "" #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "" #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "" #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "" #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "" #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "" #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "" #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "" #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "" #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "" #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:63 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "" #: core/song.cpp:328 msgid "Flac" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:43 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "" #: core/database.cpp:673 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "" #: internet/lastfmservice.cpp:437 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:154 msgid "Last.fm password" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "" #: ui/equalizer.cpp:123 msgid "Live" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "" #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "" #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "" #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "" #: core/song.cpp:330 msgid "MPC" msgstr "" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "" #: library/library.cpp:74 msgid "Most played" msgstr "" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "" #: library/library.cpp:67 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:80 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "" #: core/utilities.cpp:147 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:366 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "" #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "" #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "" #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "" #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "" #: core/organise.cpp:65 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:124 msgid "Party" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "" #: widgets/osd.cpp:156 msgid "Paused" msgstr "" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "" #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "" #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "Preferentias" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "Preferentias..." #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" 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:206 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "" #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "" #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:460 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "" #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "" #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "Information de canto" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 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 "" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "" #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "" #: core/song.cpp:341 msgid "Stream" msgstr "" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "" #: ui/about.cpp:70 msgid "Thanks to" msgstr "" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "" #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:56 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:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:174 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:151 msgid "Third level" msgstr "" #: internet/jamendoservice.cpp:171 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "" #: core/song.cpp:338 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "" #: devices/giolister.cpp:161 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Incognite" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Error Incognite" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "De-subscriber" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "Actualisar lista de reproduction de Grooveshark" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "Actualisar omne podcasts" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "Actualisar le bibliotheca quando initia Clementine" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "Actualisar iste podcast" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "Actualisante" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "Usage" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "Usar authentication" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "Usate" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "Interfacie de usator" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Nomine de usator" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "Varie artistas" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "" #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "" #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "" #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "" clementine-1.2.0+dfsg/src/translations/id.po000066400000000000000000004565201223327513400210360ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Andre Mata Ludji <>, 2012 # Nurissalam Nurissalam , 2013 # FIRST AUTHOR , 2011 # chocolateshirt , 2013 # nix.Lilium , 2012 # operamaniac , 2013 # tjung , 2012-2013 # tjung , 2013 # tjung , 2013 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-09-15 11:48+0000\n" "Last-Translator: tjung \n" "Language-Team: Indonesian (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr " hari" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " pt" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " detik" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " lagu" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 album" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 hari" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 hari yang lalu" #: podcasts/gpoddersync.cpp:79 #, qt-format msgid "%1 on %2" msgstr "%1 pada %2" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 daftar main (%2)" #: playlist/playlistmanager.cpp:413 #, qt-format msgid "%1 selected of" msgstr "%1 terpilih dari" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 lagu" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 lagu" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 songs found" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 lagu ditemukan (menunjukkan %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 lagu" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 telah ditransfer" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1 modul Wiimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, qt-format msgid "%L1 other listeners" msgstr "%L1 pendengar lainnya" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 total dimainkan" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "%filename%" msgstr "nama %berkas" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n gagal" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n telah selesai" #: transcoder/transcodedialog.cpp:192 #, c-format msgid "%n remaining" msgstr "%n yang tersisa" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&Luruskan teks" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&Tengah" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "&Custom" msgstr "&Pengaturan" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "&Ekstra" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "&Bantuan" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "&Sembunyikan %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "&Sembunyikan..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Kiri" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "&Musik" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Tidak Ada" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "&Daftar Main" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Keluar" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "Mode &perulangan" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Kanan" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "Mode peng&acakan" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "&Tarik kolom agar pas dengan jendela" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "&Peralatan" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(berbeda diantara berbagai lagu)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "...dan semua kontributor Amarok" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "0px" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 Hari" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 lagu" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "127.0.0.1" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "40%" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 lagu acak" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "Tingkatkan ke Premium sekarang" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "Buat akun baru atau reset kata sandi" #: ../bin/src/ui_librarysettingspage.h:195 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 dicek, Clementine akan mencoba untuk menyimpan data rating anda dan statistik lainya hanya dalam sebuah database terpisah dan tidak akan merubah berkas anda.

Jika dicek, Clementine akan menyimpan statistik di database dan langsung keberkas setiap berkas-berkas itu berubah.

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

" #: ../bin/src/ui_librarysettingspage.h:199 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:199 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 "

Tanda dimulai dengan %, sebagai contoh: %artis %album %judul

\n\n

Apabila anda mengelilingi bagian dari teks yang mengandung tanda kurung kurawal, maka bagian tersebut akan tersembunyi bila tanda tersebut kosong.

" #: internet/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "Akun Grooveshark Anywhere diperlukan" #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "Akun Premium Spotify diperlukan." #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "Klien hanya dapat melakukan koneksi jika kode yang dimasukkan benar." #: smartplaylists/wizard.cpp:78 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 main pintar adalah daftar dinamis yang diambil dari pustaka lagu anda. Ada beberapa jenis daftar lagu pintar yang menawarkan cara yang berbeda untuk memilih lagu" #: smartplaylists/querywizardplugin.cpp:153 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Lagu akan dimasukkan ke dalam daftar jika lagu memenuhi kondisi berikut." #: smartplaylists/searchterm.cpp:297 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "KEMENANGAN UNTUK SANG HYPNOTOAD" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "Batal" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "Tentang %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "Tentang Clementine..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "Tentang Qt..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Detail akun" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "Rincian akun (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Aksi" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Wiiremote aktif/tidak aktif" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "Tambah Podcast" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Tambah stream" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "Tambah garis baru jika didukung oleh tipe notifikasi" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "Tambah aksi" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Tambah stream lainnya..." #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Tambah direktori..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "Tambah berkas" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "Tambahkan berkas ke transcoder" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "Tambahkan berkas(-berkas) ke transcoder" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Tambah berkas..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Tambah berkas untuk ditranskode" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Tambah folder" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Tambah folder..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Tambah folder baru..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "Tambah podcast" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "Tambah podcast..." #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Tambah kata pencarian" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "Tambah tag album pada lagu" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "Tambah tag albumartist pada lagu" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "Tambah tag artis pada lagu" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "Tambahkan skor otomatis pada lagu" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "Tambah tag komposer pada lagu" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "Tambah tag disc pada lagu" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "Tambah nama berkas lagu" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "Tambah tag genre pada lagu" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "Tambahkan tag pengelompokan pada lagu" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "Tambah tag panjang lagu" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "Tambahkan tag penyanyi lagu" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "Tambah nilai jumlah main pada lagu" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "tambahkan rating pada lagu" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "Tambah nilai jumlah lewat pada lagu" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "Tambah tag judul pada lagu" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "Tambah label trek lagu" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "Tambah tag tahun pada lagu" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Tambah stream..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "Tambah ke favorit Grooveshark" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "Tambah ke daftar main Grooveshark" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "Tambah ke daftar main lainnya" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Tambah ke daftar main" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "Tambah ke antrian" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Tambah aksi wiimotedev" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Tambah..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Ditambah bulan ini" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Ditambah minggu ini" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Ditambah tahun ini" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Ditambah hari ini" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Ditambah pada tiga bulan terakhir" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "Menambah lagu ke Musik Saya" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "Menambah lagu ke favorit" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Pengelompokkan lanjut..." #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "Setelah " #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "Setelah menyalin..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Album (kenyaringan ideal untuk semua trek)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Album penyanyi" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "Sampul album" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Info album di jamendo.com..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Album dengan sampul" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Album tanpa sampul" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Semua Berkas (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "Kemenangan untuk Sang Hypnotoad!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Semua album" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Semua artis" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "Semua berkas (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Semua playlist (%1)" #: ui/about.cpp:74 msgid "All the translators" msgstr "Semua translator" #: library/library.cpp:84 msgid "All tracks" msgstr "Semua lagu" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "Izinkan klien mengunduh musik dari komputer ini." #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "Izinkan unduhan" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "Biarkan pengkodean sampingan/pertengahan" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "Bersama dengan original" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Selalu sembunyikan jendela utama" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Selalu tunjukkan jendela utama" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "Selalu mulai mainkan" #: internet/spotifyblobdownloader.cpp:60 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "Plugin tambahan dibutukan untuk menggunakan Spotify di Clementine. Apakah anda ingin mendownload dang menginstallnya sekarang?" #: devices/gpodloader.cpp:61 msgid "An error occurred loading the iTunes database" msgstr "Kesalahan terjadi saat memuat database iTunes" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Kesalahan terjadi saat menulis metadata ke '%1'" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "Telah terjadi error tak spesifik" #: ui/about.cpp:78 msgid "And:" msgstr "Dan:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "Marah" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Tampilan" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Tempel file/URL ke playlist" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "Tambah ke playlist sementara" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "Tambah ke playlist" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "Terapkan kompresi untuk mencegah clipping" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Anda yakin untuk menghapus preset \"%1\"?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "Hapus playlist ini?" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "Apakah anda ingin mengatur ulang statistik lagu?" #: library/librarysettingspage.cpp:152 msgid "" "Are you sure you want to write song's statistics into song's file for all " "the songs of your library?" msgstr "Apa anda yakin ingin menuliskan statistik lagu kedalam berkas lagu untuk semua lagu di perpustakan anda?" #: playlist/playlist.cpp:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Artis" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Info Artis" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "Radio Artis" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "Label artis" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "Inisial Artis" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Format audio" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Otentifikasi gagal" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "Penulis" #: ui/about.cpp:65 msgid "Authors" msgstr "Penulis" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Otomatis" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Update Otomatis" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "Buka sebuah kategori secara otomatis di pustaka" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "Tersedia" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "Bitrate rata-rata" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "Ukuran rata-rata gambar" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "Podcast BBC" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "Stream latar belakang" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Warna latar belakang" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "Gambar latar belakang" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Keburaman Latar Belakang" #: core/database.cpp:734 msgid "Backing up database" msgstr "Buat cadangan database" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "Seimbang" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Larangan" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "Penganalisa batang" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Biru Dasar" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "tipe audio dasar" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Perilaku" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "Terbaik" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "Biografi dari %1" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Bit rate" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "Bitrate" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "Penganalisa blok" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "Tipe Blok" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "Jumlah blur" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "Badan" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "Penganalisa dentuman" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Menelusuri..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "Durasi Buffer" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "Menyangga..." #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "Tapi sumber -sumber ini telah mati:" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Tombol" #: core/song.cpp:339 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "Dukungan lembar CUE" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "Batal" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Ganti cover" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Ganti ukuran huruf..." #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "Ubah mode ulang" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Ubah shortcut..." #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "Ubah mode pengacakan" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Ganti bahasa" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "Mengganti pemutaran mono akan berlaku saat lagu berikut dimainkan" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "Perbarui episode baru" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Cek pembaruan..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "Pilih nama untuk playlist pintar" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Pilih otomatis" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Pilih warna..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "Pilih huruf..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Pilih dari daftar" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Pilih bagaiman playlist diurutkan dan berapa banyak lagu di dalamnya." #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "Pilih direktori unduhan podcast" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Pilih situs yang digunakan Clementine saat mencari lirik." #: ui/equalizer.cpp:115 msgid "Classical" msgstr "Klasik" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "Pembersihan" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Bersih" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Bersihkan playlist" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Error Clementine" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Clementine Orange" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Visualisasi Clementine" #: ../bin/src/ui_deviceproperties.h:376 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine dapat secara otomatis mengubah format yang anda copy ke perangkat supaya dapat diputar." #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine dapat memutar musik yang Anda unggah ke Box" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine dapat memutar musik yang Anda unggah ke Dropbox" #: ../bin/src/ui_googledrivesettingspage.h:104 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_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "Clementine dapat memutar musik yang Anda unggah ke Ubuntu One" #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "Clementine dapat menunjukkan pesan ketika ubah trak." #: ../bin/src/ui_podcastsettingspage.h:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine dapat menyinkronkan daftar langganan Anda dengan komputer lain dan aplikasi podcast. Buat akun." #: visualisations/projectmvisualisation.cpp:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine tidak dapat memuat semua visualisasi projectM. Periksa apakah Anda telah menginstal Clementine dengan benar." #: internet/lastfmsettingspage.cpp:110 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 "Clementine tidak bisa mendapatkan status berlangganan Anda karena ada masalah dengan koneksi Anda. Lagu yang diputar akan dicache dan dikirim lagi nanti ke Last.fm." #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Penampil gambar Clementine" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "Clementine tidak dapat menemukan hasil untuk file ini" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "Clementine akan mencari musik di:" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Klik di sini untuk menambahkan musik" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "Klik untuk beralih antara waktu tersisa dan total waktu" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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 browser web. Anda harus kembali ke Clementine setelah Anda masuk." #: widgets/didyoumean.cpp:37 msgid "Close" msgstr "Tutup" #: playlist/playlisttabbar.cpp:54 msgid "Close playlist" msgstr "Tutup daftar lagu" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "Tutup visualisasi" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "Menutup jendela ini akan membatalkan semua download." #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "Menutup jendela ini akan menghentikan pencarian semua sampul album." #: ui/equalizer.cpp:116 msgid "Club" msgstr "Klub" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Colors" msgstr "Warna-warna" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Daftar koma terpisah dari kelas: tingkat, tingkat ini adalah 0-3" #: playlist/playlist.cpp:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Komentar" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "Isi tag secara otomatis" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "Isi tag secara otomatis..." #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Pengarang" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "Konfigurasi %1..." #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "Konfigurasi Grooveshark..." #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Konfigurasi Last.fm..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "Konfigurasi Magnature" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Konfigurasi Jalan Pintas" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "Konfigurasi Spotify" #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "Konfigurasi Subsonic..." #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "Konfigurasi pencarian global..." #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "Konfigurasi Pustaka" #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "Konfigurasi podcast..." #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "Konfigurasi..." #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "Sambungkan Remote Wii menggunakan aksi aktif/non-aktif" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "Hubungkan perangkat" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "Menghubungkan ke Spotify" #: internet/subsonicsettingspage.cpp:107 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/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Koneksi melewati batas waktu, periksa URL server. Contoh: http://localhost:4040/" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "Konsol" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "Bitrate konstan" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "Konversi semua musik" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "Konversi semua musik yang tidak dapat dimainkan oleh perangkat itu." #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "Salin ke papan klip" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Salin ke perangkat..." #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Salin ke Pustaka ..." #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "Hak cipta" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Tidak dapat melakukan koneksi ke Subsonic, cek URL server. Contoh:\nhttp://localhost:4040/" #: transcoder/transcoder.cpp:64 #, 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 pengaya GStreamer yang telah terinstal" #: transcoder/transcoder.cpp:432 #, 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 Anda memiliki pengaya GStreamer terinstal dengan benar" #: transcoder/transcoder.cpp:426 #, 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 Anda memiliki pengaya GStreamer terinstal dengan benar" #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "Tidak dapat memuat stasiun radio last.fm" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "Tidak dapat membuka berkas keluaran %1" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Sampul Manajer" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "Sampul dari gambar tertanam" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Sampul dimuat secara otomatis dari %1" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "Sampul tidak diset secara manual" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "Sampul tidak diatur" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "Sampul diatur dari %1" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "Sampul mulai dari %1" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "Buat daftar lagu baru Grooveshark" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "Pudaran-suara ketika mengubah trek secara otomatis" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "Pudaran-suara ketika mengubah trek secara manual" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "Ubahsuaian" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "Ubahsuaian" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "Ubahsuaian pengaturan pesan" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "Ubahsuaian radio" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Ubahsuaian..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "Jalur Dbus" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Dansa" #: core/database.cpp:688 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 database terdeteksi. Harap baca https://code.google.com/p/clementine-player/wiki/DatabaseCorruption untuk instruksi bagaimana cara untuk mendapatkan kembali database Anda" #: playlist/playlist.cpp:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Tanggal dibuat" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Tanggal dimodifikasi" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "Hari" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "De&fault" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "Kurangi volume 4%" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "Kurangi volume persen" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Kurangi volume" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "Gambar latar belakang standar" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "Standar" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "Penundaan antar visualisasi" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "Hapus" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "Hapus daftar lagu Grooveshark" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "Hapus data yang sudah diunduh" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Hapus file" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Hapus dari perangkat..." #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Hapus dari disk..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "Hapus episode yang sudah diputar" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "Hapus pengaturan sebelumnya" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "Hapus daftar lagu pintar" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "Hapus file asli" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Menghapus file" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "Batalkan antrian trek terpilih" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "Batalkan antrian trek" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Tujuan" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Detail..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Perangkat" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Properti perangkat" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Nama perangkat" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Properti perangkat..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Perangkat-perangkat" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Maksud Anda" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "Diimpor Secara Digital" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "Kata sandi Diimpor Secara Digital" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "nama pengguna Diimpor Secara Digital" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "Hubungan internet langsung" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Direktori" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "Nonaktifkan durasi" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "Nonaktifkan generasi moodbar" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Nonaktifkan " #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Piringan" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "Transmisi diskontinu" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "Opsi tampilan" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Tampilkan pada layar-tampilan" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "Lakukan scan ulang pustaka keseluruhan" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "Jangan ubah jenis musik apa pun" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "Jangan tulis timpa" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Jangan ulang" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "Jangan menunjukkan berbagai artis" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "Jangan acak" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "Jangan berhenti" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "Donasi" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Kilk ganda untuk buka" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "Klik ganda lagu akan ..." #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "Memuat %n episode" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "Unduh direktori" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "Unduh episode ke" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "Unduh keanggotaan" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "Unduh episode baru secara otomatis" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "Antri unduh" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "Unduh Android app" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Unduh album ini" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Unduh album ini..." #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "Unduh episode ini" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "Unduh..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "Memuat (%1%)..." #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "Unduh direktori Icecast" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "Mengunduh katalok Jamendo" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "Unduh katalog Magnatune" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "Unduh pengaya Spotify" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "Unduh metadata" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "Seret untuk memposisikan ulang" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "Dropbox" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "Mode dinamik berjalan" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "Campuran random dinamik" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "Sunting daftar lagu pintar..." #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Sunting label \" %1\"..." #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "Sunting label..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "Sunting label-label" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Sunting informasi trek" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "Sunting informasi trek..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Sunting informasi trek..." #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Sunting..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "Aktifkan dukungan Remote Wii" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "Aktifkan ekualiser" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "Aktifkan jalan pintas hanya ketika Clementine difokuskan" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Aktifkasi sumber di bawah ini untuk memasukkan mereka dalam hasil pencarian. Hasil akan ditampilkan dalam urutan ini." #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "Aktifkan/Nonaktifkan Last.fm scrobbling" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "Kompleksitas pengkodean" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "Pengkodean kualitas mesin" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "Mode pengkodean" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "Masukkan URL" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "Masukkan URL untuk mengunduh sampul dari Internet:" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "Masukkan nama berkas untuk eksport sampul (tanpa ekstensi):" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "Masukkan nama baru untuk daftar lagu ini" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Masukkan artis atau label untuk memulai mendengarkan radio Last.fm." #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Masukkan pencarian di atas untuk mencari di komputer atau di internet" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Masukkan pencarian istilah di bawah ini untuk mencari podcast di Toko iTunes" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Masukkan pencarian istilah di bawah ini untuk mencari podcast di gpodder.net" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "Masukkan pencarian istilah di sini" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "Masukkan URL aliran radio internet:" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "Masukkan nama folder" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "Masukan IP ini kedalam Aplikasi untuk mengkoneksikan Clementine." #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "Semua koleksi" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Kesalahan" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Kesalahan koneksi perangkat MTP" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "Kesalahan saat menyalin lagu" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "Kesalahan saat menghapus lagu" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "Kesalahan pengunduhan pengaya Spotify" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "Kesalahan pemuatan %1" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Kesalahan pemuatan daftar lagu di.fm" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "Proses kesalahan %1: %2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "Kesalahan ketika pemuatan CD audio" #: library/library.cpp:63 msgid "Ever played" msgstr "Pernah dimainkan" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "Setiap 10 menit" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "Setiap 12 jam" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "Setiap 2 jam" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "Setiap 20 menit" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "Setiap 30 menit" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "Setiap 6 jam" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "Setiap jam" #: ../bin/src/ui_playbacksettingspage.h:303 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:208 msgid "Existing covers" msgstr "Sampul yang sudah tersedia" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "Perluas" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "Kadaluarsa pada %1" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "Eksport Sampul" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "Eksport sampul" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "Eksport unduhan sampul" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "Eksport selesai" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "Pudar ketika menghentikan trek" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "Memudar" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "Durasi memudar" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "Gagal mengambil direktori" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "Gagal mengambil podcast" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "Gagal memuat podcast" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "Gagal mengurai XML untuk penyuap RSS ini" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "Cepat" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "Favorit" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "Trek kesukaan" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "Pengambilkan Sampul yang Hilang" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "Pengambilkan secara otomatis" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "Pengambilan telah selesai" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "Ambil pustaka Subsonic" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Kesalahan pengambilan sampul " #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "Ekstensi file" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "Format file" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Nama file" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "Nama berkas (tanpa jalur)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Ukuran file" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Tipe file" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Nama file" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "File" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "Transcode berkas" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "Cari lagu di perpustakaan Anda yang sesuai dengan kriteria yang Anda tentukan." #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "Sidik jari lagu" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "Selesai" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "Tingkat pertama" #: core/song.cpp:328 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Ukuran huruf" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Karena alasan lisensi, dukungan plugin Spotify dibuat terpisah." #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "Paksa pengkodean mono" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "Lupakan perangkat" #: devices/deviceview.cpp:311 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 menghapusnya dari daftar ini dan Clementine harus pemindaian ulang semua lagu lagi lain kali Anda menghubungkannya." #: ../bin/src/ui_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Formulir" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "Format" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Laju bingkai" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "Laju bingkai per penyangga" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Teman" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "Beku" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Bass Penuh" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "Bass + Treble Penuh" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "Treble Penuh" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "GStreamer audio engine" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "Umum" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Pengaturan umum" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Genre" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "Dapatkan URL untuk bagikan daftar lagu Grooveshark ini" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "Dapatkan URL untuk bagikan lagu Grooveshark ini" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "Mendapatkan lagu populer Grooveshark" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "Mendapatkan saluran" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "Mendapatkan aliran" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "Berikan nama:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "Jalankan" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "Buka tab daftar lagu berikutnya" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "Buka tab daftar lagu sebelumnya" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "Punya %1 mencakup dari %2 ( %3 gagal)" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "Pengabuan lagu yang sudah tidak ada dari daftar lagu" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "Kesalahan saat login Grooveshark" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "URL daftar lagu Grooveshark" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "Radio Grooveshark" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "URL lagu Grooveshark" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "Kelompokan Pustaka berdasarkan..." #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "Kelompokkan" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "Kelompokkan menurut Album" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "Kelompokkan menurut Artis" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "Kelompokkan menurut Artis/Album" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "Kelompokkan menurut Artis/Tahun - Album" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "Kelompokkan menurut Genre/Album" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "Kelompokkan menurut Genre/Artis/Album" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "Pengelompokan" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "Halaman HTML tidak memiliki penyuap RSS apa pun" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "HTTP 3xx status kode diterima tanpa URL, verifikasi konfigurasi server." #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "proxy HTTP" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "Bahagia" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "Informasi perangkat keras" #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "Informasi hardware hanya tersedia ketika perangkat terhubung." #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "Tinggi" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "Tinggi (%1 fps)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "Tinggi (1024x1024)" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "Tidk bisa menemukan host, periksa kembali URL server. Contoh: http://localhost:4040/" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "Jam" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "Saya tidak memiliki akun Magnatune" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Ikon" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "Ikon di atas" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "Mengidentifikasi lagu" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 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 ada salin mungkin tidak bekerja." #: ../bin/src/ui_addpodcastbyurl.h:77 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:204 msgid "Ignore \"The\" in artist names" msgstr "Abaikan \"The\" dalam nama artis" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "Dalam %1 hari" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "Dalam %1 minggu" #: ../bin/src/ui_wizardfinishpage.h:86 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/spotifyservice.cpp:360 msgid "Inbox" msgstr "Kotak masuk" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "Sertakan sampul album dalam pemberitahuan" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "Libatkan semua lagu" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Versi protokol Subsonic REST tak kompatibel. Klien harus diperbarui." #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Versi protokol Subsonic REST tak kompatibel. Server harus diperbarui." #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "Naikkan volume menjadi 4%" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "Naikkan volume persen" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Naikkan volume" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "Mengindeks %1" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "Informasi" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "sisipkan" #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Terinstall" #: core/database.cpp:673 msgid "Integrity check" msgstr "Cek kesatuan" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "penyedia layanan internet" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "Kunci API tidak sah" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Format tidak sah" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "Metode tidak sah" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "Parameter tidak sah" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "Sumber daya khusus tidak sah" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "Layanan tidak sah" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "Sesi kunci tidak sah" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "Nama pengguna dan/atau kata sandi tidak sah" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "Trek Jamendo yang Paling Sering Didengar" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "Trek Jamendo Terpopuler" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "Trek Jamendo Terpopuler Bulanan" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "Trek Jamendo Terpopuler Mingguan" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "database Jamendo" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "Lompat ke trek yang sedang didengarkan sekarang" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Jaga tombol selama %1 detik..." #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Jaga tombol selama %1 detik..." #: ../bin/src/ui_behavioursettingspage.h:193 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:193 msgid "Keep the original files" msgstr "Simpan berkas-berkas asli" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "Anak kucing" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Bahasa" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "Laptop/Headphone" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Balai Besar" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "Sampul album besar" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "Bilah samping besar" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "Terakhir dimainkan" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "Ubahsuaian Last.fm Radio: %1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Pustaka Last.fm - %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "Radio Campuran Last.fm - %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Radio Tetangga Last.fm - %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Stasiun Radio Last.fm - %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Penyanyi Serupa Last.fm ke %1" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Label Radio Last.fm: %1" #: internet/lastfmservice.cpp:437 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm sekarang sedang sibuk, cobalah beberapa saat kemudian" #: ../bin/src/ui_lastfmsettingspage.h:154 msgid "Last.fm password" msgstr "Kata sandi Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "Jumlah putaran Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Label-label Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Username Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Wiki Last.fm" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "Trek paling tidak disukai" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "Kosongkan untuk standarnya. Contoh: \"/dev/dsp\", \"front\", dll." #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "Kiri" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Durasi" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Pustaka" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "Pengelompokan pustaka lanjutan" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "Pemberitahuan pemindaian ulang Pustaka" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "Pencarian pustaka" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Batas" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "Mendengarkan lagu di Grooveshark berdasarkan jenis lagu yang Anda dengar sebelumnya" #: ui/equalizer.cpp:123 msgid "Live" msgstr "Langsung" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Memuat" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "Memuat sampul dari URL" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "Memuat sampul dari URL..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "Muat sampul dari cakram" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "Memuat sampul dari media penyimpan..." #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "Memuat daftar lagu" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "Memuat daftar lagu..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Pemuatan radio Last.fm" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Pemuatan perangkat MTP" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "Pemuatan database iPod" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "Pemuatan daftar lagu pintar" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "Pemuatan lagu-lagu" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "Pemuatan aliran" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "Pemuatan trek" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "Pemuatan info trek" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "Pemuatan..." #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "Memuat berkas-berkas/URLs, menggantikan daftar lagu yang sekarang" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Masuk" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "Gagal masuk" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "Profil prediksi jangka panjang (LTP)" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "Suka" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Rendah (%1 fps)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "Rendah(256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "Profil kompleksitas rendah (LC)" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "Lirik" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "Lirik dari %1" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Unduh Magnatune" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Unduh Magnatune telah selesai" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "Profil utama (MAIN)" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "Buatlah begitu!" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "Buat daftar lagu tersedia offline" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "Tanggapan cacat" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "Konfigurasi proxy manual" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "Secara manual" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "Produsen" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "Tandai sebagai sudah mendengar" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "Tandai sebagai baru" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "Cocokkan setiap pencarian istilah (AND)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "Cocokkan satu atau lebih pencarian istilah (OR)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "Laju bit maksimum" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "Menengah (%1 fps)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "Menengah (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "Tipe keanggotaan" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "Laju bit minimum" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "Kehilangan pengaturan projectM" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "Model" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "Monitor perubahan pustaka" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "Pemutaran mono" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "Bulan" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "Mood" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "Gaya moodbar" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "Moodbars" #: library/library.cpp:74 msgid "Most played" msgstr "Paling sering diputar" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "Titik pasang" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "Titik pasang" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "Pindah ke bawah" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "Pindah ke pustaka..." #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "Pindah ke atas" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "Musik" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Pustaka Musik" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "Bisu" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "Pustaka Last.fm Saya" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "Radio Campuran Last.fm Saya" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "Lingkungan Last.fm Saya" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "Rekomendasi Radio Last.fm Saya" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "Radio Campuran Saya" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "Musik Ku" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "Lingkungan Saya" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "Stasiun Radio Saya" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "Rekomendasi Saya" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Nama" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "Pilihan penamaan" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "Narrow band (NB)" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "Tetangga" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "Jaringan" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "Proxy Jaringan" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "Remote Jaringan" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "Tidak Pernah" #: library/library.cpp:67 msgid "Never played" msgstr "Tidak pernah dimainkan" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "Jangan pernah putar" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "Folder baru" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "Playlist baru" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "Daftar lagu pintar baru..." #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "Lagu-lagu baru" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "Trek baru akan ditambah secara otomatis." #: library/library.cpp:80 msgid "Newest tracks" msgstr "Trek terbaru" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "Berikut" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Trek berikutnya" #: core/utilities.cpp:147 msgid "Next week" msgstr "Minggu depan" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "Tidak ada penganalisa" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "Tidak ada gambar latar belakang" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "Tidak ada sampul untuk diekspor" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "Tanpa blok panjang" #: playlist/playlistcontainer.cpp:366 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 daftar lagu keseluruhan." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "Tidak ada blok pendek" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "Tidak ada" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "Tak satu pun dari lagu-lagu yang dipilih cocok untuk disalin ke perangkat" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "Normal" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "Tipe blok normal" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "Tidak tersedia saat menggunakan daftar putar dinamis" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "Tidak terhubung" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "Konten tidak cukup" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "Penggemar tidak cukup" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "Anggota tidak cukup" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "Tetangga tidak cukup" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Tidak terinstall" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "Belum masuk" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "Tidak terpasang - klik dua kali untuk memasang" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "Tipe notifikasi" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Notifikasi" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "sekarang diputar" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "Pratinjau OSD" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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 jankauan ip:\n10.x.x.x\n172.16.0.0 - 172.31.255.255\n192.168.x.x" #: ../bin/src/ui_networkremotesettingspage.h:187 msgid "Only allow connections from the local network" msgstr "Hanya diperbolehkan koneksi dari jaringan lokal" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Hanya tunjukkan yang pertama" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "Opacity" msgstr "Opasitas" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "Buka %1 di browser" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "Buka &audio CD..." #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "Buka berkas OPML" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "Buka berkas OPML..." #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "Buka perangkat" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "Buka berkas..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "Buka di Google Drive" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "Buka daftar lagu baru" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Buka..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "Proses gagal" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "Optimasi untuk laju bit" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "Optimasi untuk kualitas" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "Pilihan" #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "Mengatur Berkas" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "Mengatur Berkas..." #: core/organise.cpp:65 msgid "Organising files" msgstr "Mengorganisir berkas" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "Label asli" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Pilihan lainnya" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "Keluaran" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "Perangkat output" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "Pilihan keluaran" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "Pengaya keluaran" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "Tulis ulang semua" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "Timpa file yang sudah ada" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "Hanya tulis ulang yang lebih kecil" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "Pemilik" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "Menguraikan katalog Jamendo" #: ui/equalizer.cpp:124 msgid "Party" msgstr "Pesta" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "Kata sandi" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Jeda" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "Menjeda pemutaran" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Jeda" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "Penyanyi" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "Piksel" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "Bilah samping polos" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Putar" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "Putar artis atau Label" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "Putar artis radio..." #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "Jumlah putar" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "Putar ubahsuaian radio..." #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "Putar jika berhenti, jeda jika sedang putar" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "Putar jika sudah tidak ada yang harus diputar" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "Putar label radio..." #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "Putar trek ke dalam daftar lagu" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "Putar/Jeda" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Pemutaran" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Pilihan pemutar" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "Daftar lagu" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "Daftar lagu selesai" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "Pilihan daftar lagu" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "Tipe daftar lagu" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "Daftar lagu" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "Silakan tutup browser Anda dan kembali ke Clementine." #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "Status plugin:" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "Podcast" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Pop" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "Lagu populer" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "Lagu populer bulan ini" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "Lagu populer bulan ini" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "Durasi popup" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "Gerbang" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "Pre-amp" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "Preferensi" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "Preferensi..." #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "Lebih disukai nama berkas album (dipisahkan koma)" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "Lebih disukai format audio" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "Laju bit pilihan" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "Lebih disukai format" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "Tipe audio premium" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "Pengaturan" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "Tekan kombinasi tombol untuk menggunakan" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "Tekan tombol" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Tekan kombinasi tombol untuk menggunakan %1..." #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "Pilihan Pretty OSD" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "Pratinjau" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "Sebelumnya" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "Trek sebelumnya" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Cetak versi informasi" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "Profil" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "Perkembangan" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 msgid "Push Wiiremote button" msgstr "Tekan tombol Wii Remote" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "Tempatkan lagu dalam posisi acak" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "Kualitas" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "Query perangkat" #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "Manajer antrian" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "Antri trek terpilih" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "Antri trek" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "Radio (samakan kenyaringan untuk semua trek)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "Radio-radio" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "Hujan" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "Visualisasi acak" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "Nilai lagu saat ini 0 bintang" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "Nilai lagu saat ini 1 bintang" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "Nilai lagu saat ini 2 bintang" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "Nilai lagu saat ini 3 bintang" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "Nilai lagu saat ini 4 bintang" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "Nilai lagu saat ini 5 bintang" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "Penilaian" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "Benar-benar membatalkan?" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "Segarkan" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "Segarkan katalog" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "Segarkan saluran" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "Segarkan daftar teman" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "Segarkan daftar stasiun" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "Segarkan aliran" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Reggae" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "Ingat ayunan Wii remote" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "Ingat dari waktu terakhir" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Hapus" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "Hilangkan tindakan" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "Buang duplikasi daftar lagu" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "Hapus folder" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "Buang dari Musik Ku" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "Buang dari favorit" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "Hapus dari playlist" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "Menghapus daftar putar" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "Buang daftar lagu" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "Buang lagu dari Musik Ku" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "Buang lagu dari favorit" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "Ubah nama daftar lagu \"%1\"" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "Ubah nama daftar lagu Grooveshark" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "Ganti nama playlist" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "Ubah nama daftar lagu..." #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "Memberi nomor baru trek dalam urutan ini ..." #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Ulangi" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "Ulangi album" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "Ulangi daftar lagu" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "Ulang trek" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Ganti playlist sementara" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "Ganti playlist" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "Menggantikan spasi dengan garis bawah" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "Penguatan Putar Ulang" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "Mode Penguatan Ulang" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "Mengisi kembali" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "Memerlukan kode otentikasi" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "Set Ulang" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" msgstr "Set ulang jumlah putaran" #: 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:206 msgid "Restrict to ASCII characters" msgstr "Batasi ke karakter ASCII" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "Lanjutkan pemutaran saat memulai Clementine" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "Ambil lagu Grooveshark Musik Ku " #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "Mengambil lagu favorit Grooveshark" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "Mengambil daftar lagu Grooveshark" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "Kembali ke Clementine" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "Kanan" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "Jalankan" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "Proxy SOCKS" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "Aman untuk melepas perangkat" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "Aman untuk melepas perangkat setelah menyalin" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "Laju sampel" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "Laju sampel" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "Simpan berkas .mood ke dalam pustaka musik Anda" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "Simpan sampul album" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "Simpan sampul ke media penyimpan..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "Simpan gambar" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "Simpan playlist" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "Simpan playlist..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "Simpan pratinjau" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "Simpan rating dalam berkas tag bila memungkinkan" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "Simpan statistik dalam berkas tag bila memungkinkan" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "Simpan aliran ini di tab Internet" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "Menyimpan statistik lagu kedalam berkas lagu" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "Menyimpan trek" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "Profil Laju Sampel Terukur (LST)" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "Skala ukuran" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "Nilai" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "Trek Scrobble yang saya dengar" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "Cari" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "Cari stasiun Icecast" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "Cari Jamendo" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Cari Magnatune" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "Pencarian Subsonic" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "Cari sampul album untuk..." #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "Cari apapun" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "Pencarian gpodder.net" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "Pencarian iTunes" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "Mode pencarian" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "Cari pilihan" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "Hasil pencarian" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "Cari istilah" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "Mencari di Grooveshark" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "Tingkat kedua" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "Mencari mundur" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "Mencari maju" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "Carilah trek yang sedang diputar dengan jumlah relatif" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "Carilah lagu yang sedang diputar ke posisi absolut" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "Pilih Semua" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "Pilih Tidak Ada" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "Pilih warna latar belakang:" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "Pilih gambar latar belakang" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "Pilih pencocokan yang terbaik" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "Pilih warna latar depan:" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "Pilih visualisasi" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "Pilih visualisasi..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "Nomor seri" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "Server URL" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "Detil-detil server" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "Layanan offline" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Atur %1 to \"%2\"..." #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "Atur volume ke persen" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "Atur nilai untuk semua trek terpilih..." #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "Pengaturan" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Jalan pintas" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "Jalan pintas untuk %1" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Jalan pintas untuk %1 yang sudah ada" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Tunjukkan" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "Tunjukkan OSD" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "Tampilkan animasi bersinar di trek saat ini" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "Tampilkan moodbar dalam trek bar kemajuan" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "Tampilkan notifikasi desktop yang asli" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Tampilkan notifikasi ketika saya mengubah mode ulang/acak" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "Tampilkan notifikasi ketika saya mengubah volume" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "Tampilkan popup dari system tray" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "Tampilkan OSD cantik" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "Tampilkan di atas status bar" #: ui/mainwindow.cpp:460 msgid "Show all songs" msgstr "Tunjukkan semua lagu" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Tunjukkan semua lagu" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show cover art in library" msgstr "Tampilkan sampul di pustaka" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "Tampilkan pembagi" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "Tampilkan ukuran penuh" #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "Tampilkan di browser berkas" #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "Tampilkan berbagai artis" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "Tunjukkan moodbar" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "Tampilkan hanya yang duplikat" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "Tampilkan hanya yang tak berlabel" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "Tunjukkan saran pencarian" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "Tampilkan tombol \"cinta\" dan \"larangan\"" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "Tampilkan tombol scrobble pada jendela utama" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "Tampilkan ikon tray" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "Tampilkan sumber yang diaktifkan dan dinonaktifkan" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "Tampilkan/Sembunyikan" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Acak" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "Acak album" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "Acak Semua" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "Acak daftar lagu" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "Acak trek dalam album ini" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "Sign in" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "Keluar" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "Masuk" #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "Artis serupa" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "Ukuran" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "Ukuran:" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "Lewati daftar lagu mundur" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "Lewati hitungan" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "Lewati daftar laju maju" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "Sampul album kecil" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "Bilah samping kecil" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "Daftar lagu pintar" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "Daftar lagu pintar" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "Informasi Lagu" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "Info lagu" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "Sonogram" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "Maaf" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "Urut berdasarkan genre (abjad)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "Urut berdasarkan genre (popularitas)" #: ../bin/src/ui_icecastfilterwidget.h:77 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" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "Sumber" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "Sumber" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "Spotify masuk error" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "Plugin Spotify" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "Plugin Spotify tidak terinstal" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "Standar" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "Berbintang" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "Mulai putar daftar lagu terkini" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "Mulai transcoding" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 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" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "Memulai %1" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "Memulai..." #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "Stasiun-stasiun" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Berhenti" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "Berhenti setelah" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "Berhenti setelah trek ini" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Hentikan pemutaran" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "Hentikan putaran setelah trek yang ini" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "Berhenti" #: core/song.cpp:341 msgid "Stream" msgstr "Stream" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "Streaming dari server Subsonic memerlukan lisensi server yang sah setelah 30 hari masa uji coba." #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "Stream keanggotaan" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "Daftar lagu langganan" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "Pelanggan" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "Sukses!" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "Berhasil tertulis %1" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "Label yang disarankan" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "Ringkasan" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "Super tinggi (%1 fps)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "Super tinggi (2048x2048)" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "Format yang didukung" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "Sinkronisasi statistik ke berkas sekarang" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "Sinkronisasi inbox Spotify" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "Sinkronisasi daftar lagu Spotify" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "Sinkronisasi trek Spotify berbintang" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "Warna sistem" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "Tab di atas" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Label" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "Pengambil label" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "Label radio" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "Target laju bit" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Tekno" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "Pilihan teks" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Terima kasih kepada" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Perintah \"%1\" tidak dapat dimulai" #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "Sampul album dari lagu yang sedang dimainkan" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "Direktori %1 tidak sah" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "Daftar lagu '%1' kosong atau tidak dapat dimuat" #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "Situs yang Anda minta bukan gambar!" #: internet/subsonicsettingspage.cpp:98 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 sudah berakhir. Silakan donasi untuk mendapatkan kunci lisensi. Kunjungi subsonic.org untuk lebih detil." #: ui/mainwindow.cpp:2083 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 diperbarui memerlukan pemindaian ulang penuh pada pustaka karena fitur-fitur baru yang tercantum di bawah ini:" #: library/libraryview.cpp:529 msgid "There are other songs in this album" msgstr "Ada lagu lainnya dalam album ini" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "Ada masalah komunikasi dengan gpodder.net" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Ada masalah pengambilan metadata dari Magnatune" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Ada masalah dalam respon penguraian dari Toko iTunes" #: ui/organiseerrordialog.cpp:56 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:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Berkas-berkas berikut akan dihapus dari perangkat, Anda yakin ingin melanjutkan?" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "Berkas-berkas ini akan terhapus secara permanen, Anda yakin ingin melanjutkan?" #: ../bin/src/ui_librarysettingspage.h:187 msgid "These folders will be scanned for music to make up your library" msgstr "Folder berikut akan dipindai untuk musik untuk membuat perpustakaan Anda" #: ../bin/src/ui_transcodersettingspage.h:174 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 \"Transcode Music\", dan ketika mengkonversi musik sebelum menyalin ke perangkat." #: ../bin/src/ui_groupbydialog.h:151 msgid "Third level" msgstr "Tingkat ketiga" #: internet/jamendoservice.cpp:171 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 database yang bisa menjadi sebesar 150 MB. \nApakah Anda ingin melanjutkan?" #: internet/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "Album ini tidak tersedia dalam format yang diminta" #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Perangkat ini harus terhubung dan dibuka sebelum Clementine dapat melihat format file yang mendukung." #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "Perangkat ini mendukung format file berikut:" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Perangkat ini tidak akan bekerja dengan baik" #: devices/devicemanager.cpp:567 msgid "" "This is an MTP device, but you compiled Clementine without libmtp support." msgstr "Ini adalah perangkat MTP, tetapi Anda mengkompilasi 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 mengkompilasi Clementine tanpa dukungan libgpod." #: devices/devicemanager.cpp:324 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 telah menghubungkan perangkat ini. Clementine sekarang akan memindai perangkat untuk mencari file musik - ini mungkin memakan waktu." #: playlist/playlisttabbar.cpp:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Pilihan ini dapat diubah di pengaturan \"Sifat\"" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "Stream ini hanya untuk pelanggan berbayar" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "Tipe perangkat ini tidak didukung: %1" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "Batas Waktu" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Judul" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "Untuk memulai radio Grooveshark, Anda harus terlebih dahulu mendengarkan beberapa lagu Grooveshark lainnya" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "Hari Ini" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "Aktifkan Pretty OSD" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Aktifkan layar penuh" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "Alihkan status antrian" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "Alihkan scrobbling" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Alihkan visibilitas tampilan layar cantik" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "Besok" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "Terlalu banyak pengalihan" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "Trek puncak" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "Total album:" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "Jumlah byte yang ditransfer" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "Total permintaan jaringan yang dibuat" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Trek" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "Transcode Musik" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "Transcode Log" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "Transcoding" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Transcoding berkas %1 menggunakan thread %2" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "Pilihan transcoding" #: core/song.cpp:338 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "Turbin" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "Matikan" #: devices/giolister.cpp:161 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "URL(s)" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "Password Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "Username Ubuntu One" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "Lebar pita ultra (UWB)" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Tidak dapat mengunduh %1 (%2)" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Tidak diketahui" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "Tipe-isi tidak diketahui" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Kesalahan tidak diketahui" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "Batalkan setingan sampul" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "Berhenti berlangganan" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "Konser mendatang" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "Perbarui daftar lagu Grooveshark" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "Perbarui semua podcast" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "Perbarui perubahan folder pustaka " #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "Perbarui pustaka ketika memulai Clementine" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "Perbarui podcast ini" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "Memperbaharui" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Perbarui %1" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "Perbarui %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Perbarui pustaka" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "Penggunaan" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "Gunakan label Album Artis ketika tersedia" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "Gunakan tombol pintas Gnome" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "Gunakan metadata penguatan putar ulang jika tersedia" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "Gunakan SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "Gunakan Remote Wii" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "Gunakan kumpulan warna rekaan" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "Gunakan notifikasi ubahsuaian pesan" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "Gunakan remot kontrol jaringan" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "Gunakan otentikasi" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "Gunakan mesin manajemen laju bit" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "Gunakan mode dinamis" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "Gunakan notifikasi untuk melaporkan status Remote Wii" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "Gunakan pembentuk bising temporal" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "Gunakan standar sistem" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "Gunakan kumpulan warna standar sistem" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "Gunakan pengaturan sistem proxy" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "Gunakan normalisasi volume" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "Bekas" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "Pengguna %1 tidak memiliki akun Grooveshark dimana pun" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "Antarmuka" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Nama pengguna" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "Menggunakan menu untuk menambah lagu akan..." #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "Variabel laju bit" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "Berbagai artis" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "Versi %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "Tampilan" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "Mode visualisasi" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "Visualisasi" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "Pengaturan Visualisasi" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "Deteksi aktivitas suara" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "Volume %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "Peringatkan saya ketika menutup tab playlist" #: core/song.cpp:337 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "Situs web" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "Mingguan" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "Saat Clementine dimulai" #: ../bin/src/ui_librarysettingspage.h:204 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 akan mencari file gambar yang berisi salah satu dari kata-kata berikut ketika mencari sampul album. \nJika tidak ada yang cocok maka akan menggunakan gambar terbesar dalam direktori." #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "Saat daftar kosong..." #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "Kenapa tidak coba..." #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "Pita Lebar (WB)" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "Remote Wii %1: aktif" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "Remote Wii %1: terkoneksi" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Remote Wii %1: baterai kritis (%2%)" #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii Remote %1: non-aktif" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Remote Wii %1: terputus" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Remote Wii %1: baterai lemah (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "Windows Media audio" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "Tanpa sampul:" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Apakah Anda ingin memindahkan lagu lainnya dalam album ini seperti Beragam Artis?" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "Apakah Anda ingin menjalankan pemindaian ulang penuh sekarang?" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "Tulis semua statistik lagu kedalam berkas lagu" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "Nama pengguna dan kata sandi salah." #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "Tahun" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "Tahun - Album" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "Tahun" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "Kemarin" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "Anda akan mendownload album-album berikut" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "Anda akan membuang daftar lagu %1 dari favorit, Anda yakin?" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "Anda belum mendaftar masuk." #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "Anda mendaftar masuk sebagai %1." #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "Anda sudah terdaftar." #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "Anda dapat mengubah cara pengaturan lagu di perpustakaan." #: internet/digitallyimportedsettingspage.cpp:46 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 aliran berkualitas tinggi tanpa iklan." #: internet/magnatunesettingspage.cpp:53 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. Pembelian keanggotaan menghapus pesan pada akhir setiap lagu." #: ../bin/src/ui_backgroundstreamssettingspage.h:57 msgid "You can listen to background streams at the same time as other music." msgstr "Anda dapat mendengarkan aliran latar belakang pada saat yang sama sebagai musik lainnya." #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "Anda dapat scrobble lagu secara gratis, tetapi hanya pelanggan berbayar bisa streaming Last.fm radio dari Clementine." #: ../bin/src/ui_wiimotesettingspage.h:184 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 Remote Wii sebagai remote control untuk Clementine. Lihat halaman pada wiki Clementineuntuk informasi lebih lanjut.\n" #: internet/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "Anda tidak memiliki akun Grooveshark dimana pun." #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Anda tidak memiliki akun Spotify Premium" #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "Anda tidak memiliki langganan yang aktif" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Anda sudah keluar dari Spotify, harap masukkan kembali kata sandi Anda di dialog pengaturan." #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Anda sudah keluar dari Spotify, harap masukkan kembali kata sandi Anda." #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "Anda suka trek ini" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "Anda perlu untuk memulai Sistem Preferensi dan menyalakan \"Aktifkasi akses untuk perangkat bantu\" untuk menggunakan cara pintas global di Clementine." #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "Anda perlu memulai ulang Clementine jika mengubah bahasa." #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "Anda tidak akan dapat memutar stasiun radio Last.fm karena Anda bukan pelanggan Last.fm." #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "Alamat IP anda:" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Identitas Last.fm Anda tidak benar" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "Identitas Magnatune Anda tidak benar" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "Pustaka Anda kosong!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "Aliran radio Anda" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "Scrobble Anda: %1" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Sistem Anda kehilangan dukungan OpenGL, visualisasi tidak tersedia." #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "Username atau passwor anda salah." #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Nol" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "tambahkan %n lagu" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "setelah" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "yang lalu" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "dan" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "otomatis" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "sebelum" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "di antara" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "pertama terbesar" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "mengandung" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "dimatikan" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "disc %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "tidak mengandung" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "berakhir dengan" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "sama" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "gpodder.net" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "Direktori gpodder.net" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "lebih besar dari" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "yang terakhir" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "kurang dari" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "pertama terpanjang" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "pindah %n lagu" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "pertama terbaru" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "tidak sama" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "bukan yang terakhir" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "tidak pada" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "pertama tertua" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "pada" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "Pilihan" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "atau pindai kode QR!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "tekan enter" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "hapus %n lagu" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "pertama terpendek" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "Acak lagu" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "pertama terkecil" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "Urutkan lagu" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "dimulai dengan" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "berhenti" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "trek %1" clementine-1.2.0+dfsg/src/translations/is.po000066400000000000000000003653241223327513400210560ustar00rootroot00000000000000# 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" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:07+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Icelandic (http://www.transifex.com/projects/p/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 != 1);\n" #: playlist/playlistlistview.cpp:39 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:246 msgid " days" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " pt" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " sekúndur" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " lög" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 plötur" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 dagar" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 dögum síðan" #: podcasts/gpoddersync.cpp:79 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 lagalistar (%2)" #: playlist/playlistmanager.cpp:413 #, qt-format msgid "%1 selected of" msgstr "%1 valið af" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 lag" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 lög" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 lög fundin" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 lög fundin (sýni %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 lög" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimodedev eining" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, qt-format msgid "%L1 other listeners" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n misheppnaðist" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n lokið" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "&Sérsnið" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "&Hjálp" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "&Fela %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "&Fela" #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Vinstri" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Ekkert" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Hætta" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Hægri" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "&Teygja á dálkum til að koma glugga fyrir" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(breytilegt yfir mörg lög)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "...og allir Amarok stuðningsaðilar" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 dagur" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 lag" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 slembin lög" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "" #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:78 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:153 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:297 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "Um %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "Um Clementine" #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "Um Qt..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Nánar um notanda" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Virkt/óvirkt Wiiremote" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Bæta við straumi" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "Bæta við aðgerð" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Bæta við öðrum straumi" #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Bæta við möppu..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Bæta við skrá..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Bæta við skrá til að millikóða" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Bæta við möppu" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Bæta við möppu..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Bæta við nýrri möppu..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Bæta við leitarorði" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Bæta við straumi..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Bæta við lagalista" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "Bæta við biðröð" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Bæta við wiimotedev ferli" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Bæta við..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Bætt við í þessum mánuði" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Bætt við í þessari viku" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Bætt við á þessu ári" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Bætt við í dag" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Bætt við innan síðustu þriggja mánaða" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Þróuð flokkun" #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "Eftir afritun..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Plata" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Plata (kjörstyrkur hljóðs fyrir öll lög)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Listamenn á plötu" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Plötuupplýsingar á jamendo.com" #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Plötur með plötuumslagi" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Plötur án plötuumslaga" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Allar skrár (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Allar plötur" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Allir listamenn" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "Allar skrár (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Allir lagalistar (%1)" #: ui/about.cpp:74 msgid "All the translators" msgstr "Allir þýðendur" #: library/library.cpp:84 msgid "All tracks" msgstr "Öll lög" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "Samhliða upprunalegum" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Alltaf að fela aðalglugga" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Alltaf að sýna aðalglugga" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "Alltaf hefja spilun" #: internet/spotifyblobdownloader.cpp:60 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:61 msgid "An error occurred loading the iTunes database" msgstr "Villa kom upp við hleðslu iTunes gagnagrunns" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Villa kom upp við skrifun lýsigagna á %1" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:78 msgid "And:" msgstr "Og:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Útlit" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Bætar við skrám/URL í lagalista" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "Bæta við núverandi lagalista" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "Bæta við lagalistann" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Ertu viss um að þú viljir eyða \"%1\" forstillingunni?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Flytjandi" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Upplýsingar um höfund" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Auðkenning mistókst" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "" #: ui/about.cpp:65 msgid "Authors" msgstr "Höfundar" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Sjálfvirk uppfærsla" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "Tiltækt" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "Straumar í bakgrunni" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Bakgrunnslitur" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Gegnsæi bakgrunns" #: core/database.cpp:734 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Bannað" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "" #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "" #: core/song.cpp:339 msgid "CDDA" msgstr "" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "" #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "" #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "" #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "" #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "" #: ui/equalizer.cpp:115 msgid "Classical" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: internet/lastfmsettingspage.cpp:110 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 "" #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "" #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:116 msgid "Club" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "" #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "" #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "" #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "" #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "" #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "" #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "" #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "" #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:64 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: transcoder/transcoder.cpp:432 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "" #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "" #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:194 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:1363 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Áfangastaður" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "" #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "" #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Meintirðu" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Ekki endurtaka" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "Ekki hætta!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Tvíklikka til að opna" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "Tvíklikka á lag mun..." #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "Niðurhalsskrá" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Niðurhala þessari plötu" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Niðurhala þessari plötu..." #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "Niðurhala..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "Niðurhala Spotify viðbót" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "Dragðu til að endurstaðsetja" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "" #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Breyta upplýsingum um lag" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "Breyta upplýsingum um lag..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Breyta upplýsingum um lög..." #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Breyta..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Villa" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "Villa við afritun laga" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "Villa við eyðingu laga" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "Villa kom upp við niðurhal á Spotify viðbót" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:63 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "Hratt" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "Uppáhalds lög" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Skráarnafn" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Skráarstærð" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Tegund skráar" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Gögn" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "Lokið" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "" #: core/song.cpp:328 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Leturstærð" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:43 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "" #: core/database.cpp:673 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "" #: internet/lastfmservice.cpp:437 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:154 msgid "Last.fm password" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "" #: ui/equalizer.cpp:123 msgid "Live" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "" #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "" #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "" #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "" #: core/song.cpp:330 msgid "MPC" msgstr "" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "" #: library/library.cpp:74 msgid "Most played" msgstr "" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "" #: library/library.cpp:67 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:80 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "" #: core/utilities.cpp:147 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:366 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "" #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "" #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "" #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "" #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "" #: core/organise.cpp:65 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:124 msgid "Party" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "" #: widgets/osd.cpp:156 msgid "Paused" msgstr "" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "" #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "" #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" 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:206 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "" #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "" #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:460 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "" #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "" #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 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 "" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "" #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "" #: core/song.cpp:341 msgid "Stream" msgstr "" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "" #: ui/about.cpp:70 msgid "Thanks to" msgstr "" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "" #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:56 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:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:174 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:151 msgid "Third level" msgstr "" #: internet/jamendoservice.cpp:171 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "" #: core/song.cpp:338 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "" #: devices/giolister.cpp:161 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "" #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "" #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "" #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "" clementine-1.2.0+dfsg/src/translations/it.po000066400000000000000000004672371223327513400210650ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # arnaudbienner , 2011 # davidsansome , 2010 # Vincenzo Reale , 2011, 2012 # Vincenzo Reale , 2010 # Vincenzo Reale , 2012-2013 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-11 07:09+0000\n" "Last-Translator: Vincenzo Reale \n" "Language-Team: Italian (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr "giorni" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " punti" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " secondi" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " brani" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 album" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 giorni" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 giorni fa" #: podcasts/gpoddersync.cpp:79 #, 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:413 #, qt-format msgid "%1 selected of" msgstr "%1 selezionate di" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 brano" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 brani" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 brani trovati" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 brani trovati (mostrati %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 tracce" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 trasferiti" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: modulo Wiimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n non riusciti" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n completati" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "&Personalizzata" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "&Extra" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "Aiuto" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "Nascon&di %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "Nascon&di..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "A &sinistra" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "&Musica" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Nessuna" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "Scale&tta" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Esci" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "Modalità di &ripetizione" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "A dest&ra" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "Modalità di me&scolamento" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "Allunga le colonne per adattarle alla fines&tra" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "S&trumenti" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(differente tra diversi brani)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "...e tutti i collaboratori di Amarok" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "0px" #: core/utilities.cpp:108 msgid "1 day" msgstr "un giorno" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "una traccia" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "127.0.0.1" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "MP3 128k" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "40%" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 tracce casuali" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "Aggiorna subito a Premium" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "Crea un nuovo account o ripristina la tua password" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "È richiesto un account Grooveshark Anywhere." #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "È richiesto un account Premium di Spotify" #: ../bin/src/ui_networkremotesettingspage.h:189 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:78 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:153 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:297 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "128k AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "GLORIA ALL'IPNOROSPO" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "Interrompi" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "Informazioni su %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "Informazioni su Clementine..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "Informazioni su Qt..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Dettagli dell'account" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "Dettagli dell'account (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Azione" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Attiva/disattiva Wiiremote" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "Aggiungi podcast" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Aggiungi flusso" #: ../bin/src/ui_notificationssettingspage.h:425 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:193 msgid "Add action" msgstr "Aggiungi azione" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Aggiungi un altro flusso..." #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Aggiungi cartella..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "Aggiungi file" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "Aggiungi file al transcodificatore" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "Aggiungi file al transcodificatore" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Aggiungi file..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Aggiungi file da transcodificare" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Aggiungi cartella" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Aggiungi cartella..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Aggiungi nuova cartella..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "Aggiungi podcast" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "Aggiungi podcast..." #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Aggiungi termine di ricerca" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "Aggiungi il tag album al brano" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "Aggiungi il tag albumartista al brano" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "Aggiungi il tag artista al brano" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "Aggiungi punteggio automatico del brano" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "Aggiungi il tag compositore al brano" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "Aggiungi il tag disco al brano" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "Aggiungi il nome file del brano" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "Aggiungi il tag genere al brano" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "Aggiungi tag del gruppo del brano" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "Aggiungi il tag durata al brano" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "Aggiungi tag del musicista del brano" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "Aggiungi il tag contatore di riproduzione al brano" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "Aggiungi valutazione del brano" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "Aggiungi contatore salti al brano" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "Aggiungi il tag titolo al brano" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "Aggiungi il tag traccia al brano" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "Aggiungi il tag anno al brano" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Aggiungi flusso..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "Aggiungi ai preferiti di Grooveshark" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "Aggiungi alle scalette di Grooveshark" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "Aggiungi a un'altra scaletta" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Aggiungi alla scaletta" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "Aggiungi alla coda" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Aggiungi azione wiimotedev" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Aggiungi..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Aggiunti questo mese" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Aggiunti questa settimana" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Aggiunti quest'anno" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Aggiunti oggi" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Aggiunti negli ultimi tre mesi" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "Aggiunta brani alla mia musica" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "Aggiungere brani ai preferiti" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Raggruppamento avanzato..." #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "Dopo " #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "Dopo la copia..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Album (volume ideale per tutte le tracce)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Artista dell'album" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "Copertina dell'album" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Informazioni album su jamendo.com..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Album con copertina" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Album senza copertina" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Tutti i file (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "Gloria, gloria all'ipnorospo!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Tutti gli album" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Tutti gli artisti" #: ui/albumcoverchoicecontroller.cpp:47 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:74 msgid "All the translators" msgstr "Tutti i traduttori" #: library/library.cpp:84 msgid "All tracks" msgstr "Tutte le tracce" #: ../bin/src/ui_networkremotesettingspage.h:194 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:196 msgid "Allow downloads" msgstr "Consenti gli scaricamenti" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "Consenti codifica mid/side" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "Insieme agli originali" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Nascondi sempre la finestra principale" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Mostra sempre la finestra principale" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "Inizia sempre la riproduzione" #: internet/spotifyblobdownloader.cpp:60 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:61 msgid "An error occurred loading the iTunes database" msgstr "Si è verificato un errore durante la il caricamento del database di iTunes" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Si è verificato un errore durante la scrittura dei metadati su '%1'" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "Si è verificato un errore non specificato." #: ui/about.cpp:78 msgid "And:" msgstr "E:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "Arrabbiato" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Aspetto" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Aggiungi file/URL alla scaletta" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "Aggiungi alla scaletta attuale" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "Aggiungi alla scaletta" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "Applica la compressione per evitare il fruscio" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Sei sicuro di voler eliminare la preimpostazione \"%1\"?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "Sei sicuro di voler eliminare questa scaletta?" #: ui/edittagdialog.cpp:769 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:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Artista" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Info artista" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "Radio dell'artista" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "Tag Artista" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "Iniziale dell'artista" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Formato audio" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Autenticazione non riuscita" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "Autore" #: ui/about.cpp:65 msgid "Authors" msgstr "Autori" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Automatica" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Aggiornamento automatico" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "Apri automaticamente categorie singole nell'albero della raccolta" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "Disponibile" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "Bitrate medio" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "Dimensione immagine media" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "Podcast BBC" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "Flussi sullo sfondo" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Colore di sfondo" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "Immagine di sfondo" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Opacità dello sfondo" #: core/database.cpp:734 msgid "Backing up database" msgstr "Copia di sicurezza del database" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "Bilanciamento" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Vieta" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "Analizzatore a barre" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Blu di base" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "Tipo audio Base" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Comportamento" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "Migliore" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "Biografia da %1" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Bitrate" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "Bitrate" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "Analizzatore a blocchi" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "Tipo di blocco" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "Sfocatura" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "Corpo" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "Analizzatore Boom" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Sfoglia..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "Durata del buffer" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "Riempimento buffer in corso" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "Queste fonti sono disabilitate:" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Pulsanti" #: core/song.cpp:339 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "Supporto CUE sheet" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "Annulla" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Cambia copertina" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Cambia dimensione dei caratteri..." #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "Cambia la modalità di ripetizione" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Cambia la scorciatoia..." #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "Cambia la modalità di mescolamento" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Cambia la lingua" #: ../bin/src/ui_playbacksettingspage.h:330 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:228 msgid "Check for new episodes" msgstr "Verifica la presenza di nuove puntate" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Controlla aggiornamenti..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "Scegli un nome per la scaletta veloce" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Scegli automaticamente" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Scegli colore..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "Scegli carattere..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Scegli dall'elenco" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Scegli l'ordinamento della scaletta e quanti brani conterrà." #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "Scegli la cartella di destinazione dei podcast" #: ../bin/src/ui_songinfosettingspage.h:188 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:115 msgid "Classical" msgstr "Classica" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "Svuota" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Svuota" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Svuota la scaletta" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Errore di Clementine" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Arancione clementino" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Visualizzazioni di Clementine" #: ../bin/src/ui_deviceproperties.h:376 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_boxsettingspage.h:104 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:104 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:104 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_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "Clementine può riprodurre la musica che hai caricato su Ubuntu One" #: ../bin/src/ui_notificationssettingspage.h:431 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:250 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:128 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." #: internet/lastfmsettingspage.cpp:110 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 "Clementine non è in grado di scaricare lo stato di sottoscrizione a causa di problemi di connessione. Le tracce riprodotte saranno memorizzate in cache e inviate successivamente a Last.fm." #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Visualizzatore immagini di Clementine" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "Clementine non ha trovato risultati per questo file" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "Clementine troverà la musica in:" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Fai clic qui per aggiungere della musica" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "Clic per passare dal tempo rimanente al tempo totale" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "Chiudi la scaletta" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "Chiudi la visualizzazione" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "La chiusura di questa finestra annullerà lo scaricamento." #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "La chiusura di questa finestra fermerà la ricerca delle copertine." #: ui/equalizer.cpp:116 msgid "Club" msgstr "Club" #: ../bin/src/ui_appearancesettingspage.h:272 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:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Commento" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "Completa automaticamente i tag" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "Completa automaticamente i tag..." #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Compositore" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "Configura %1..." #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "Configura Grooveshark..." #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Configura Last.fm..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "Configura Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Configura scorciatoie" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "Configura Spotify..." #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "Configura Subsonic..." #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "Configura la ricerca globale..." #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "Configura raccolta..." #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "Configura podcast..." #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "Configura..." #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "Connetti i Wii Remote utilizzando l'azione attiva/disattiva" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "Connetti dispositivo" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "Connessione a Spotify in corso" #: internet/subsonicsettingspage.cpp:107 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/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Connessione scaduta, controlla l'URL del server. Esempio: http://localhost:4040/" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "Console" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "Bitrate costante" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "Converti tutta la musica" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "Converti qualsiasi musica che il dispositivo non può riprodurre" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "Copia negli appunti" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Copia su dispositivo..." #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Copia nella raccolta..." #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "Copyright" #: internet/subsonicsettingspage.cpp:81 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:64 #, 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" #: transcoder/transcoder.cpp:432 #, 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:426 #, 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/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "Impossibile caricare la stazione radio di last.fm" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "Impossibile aprire il file di uscita %1" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Gestore delle copertine" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "Copertina da immagine integrata" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Copertina caricata automaticamente da %1" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "Copertina rimossa manualmente" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "Copertina non impostata" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "Copertina impostata da %1" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "Copertine da %1" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "Creare una nuova scaletta di Grooveshark" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "Dissolvenza incrociata al cambio automatico di traccia" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "Dissolvenza incrociata al cambio manuale di traccia" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Maiusc+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Maiusc+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "Ctrl+Maiusc+T" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "Personalizzato" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "Immagine personalizzata:" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "Impostazioni messaggio personalizzato" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "Radio personalizzata" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Personalizzato..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "Percorso DBus" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Dance" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Data di modifica" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Data di creazione" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "Giorni" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "Prede&finita" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "Riduci il volume del 4%" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "Riduci il volume del percento" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Riduci il volume" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "Immagine di sfondo predefinita" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "Valori predefiniti" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "Ritardo tra le visualizzazioni" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "Elimina" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "Elimina scaletta di Grooveshark" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "Elimina i dati scaricati" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Elimina i file" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Elimina da dispositivo..." #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Elimina dal disco..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "Elimina le puntate scaricate" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "Elimina la preimpostazione" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "Elimina la scaletta veloce" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "Elimina i file originali" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Eliminazione dei file" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "Rimuovi le tracce selezionate dalla coda" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "Rimuovi tracce dalla coda" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Destinazione" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Dettagli..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Dispositivo" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Proprietà del dispositivo" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Nome del dispositivo" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Proprietà del dispositivo..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Dispositivi" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Forse cercavi" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "Password di Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "Nome utente di Digitally Imported" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "Connessione diretta a Internet" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Cartella" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "Disabilita la durata" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "Disabilita la creazione della barra dell'atmosfera" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Disabilitata" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Disco" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "Trasmissione discontinua" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 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:715 msgid "Do a full library rescan" msgstr "Esegui una nuova scansione completa della raccolta" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "Non convertire qualsiasi musica" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "Non sovrascrivere" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Non ripetere" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "Non mostrare in artisti vari" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "Non mescolare" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "Non fermare!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "Donazione" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Doppio clic per aprire" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "Al doppio clic su un brano..." #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "Scarica %n puntate" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "Cartella degli scaricamenti" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "Scarica le puntate in " #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "Scaricamento" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "Scarica automaticamente le nuove puntate" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "Scaricamento accodato" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "Scarica l'applicazione per Android" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Scarica questo album" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Scarica questo album..." #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "Scarica questa puntata" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "Scarica..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "Scaricamento in corso (%1%)..." #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "Scaricamento directory Icecast in corso" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "Scaricamento catalogo Jamendo in corso" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "Scaricamento catalogo Magnatune" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "Scarica il plugin di Spotify" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "Scaricamento metadati in corso" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "Trascina per riposizionare" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "Dropbox" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "La modalità dinamica è attiva" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "Misto casuale dinamico" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "Modifica la scaletta veloce..." #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Modifica tag \"%1\"..." #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "Modifica tag..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "Modifica i tag" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Modifica informazioni della traccia" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "Modifica informazioni sulla traccia..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Modifica le informazioni sulle tracce..." #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Modifica..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "Abilita il supporto del Wii Remote" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "Abilita equalizzatore" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "Abilita le scorciatoie solo quando Clementine è in primo piano" #: ../bin/src/ui_globalsearchsettingspage.h:147 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:62 msgid "Enable/disable Last.fm scrobbling" msgstr "Abilita/Disabilita lo scrobble di Last.fm" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "Complessità della codifica" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "Qualità del motore di codifica" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "Modalità di codifica" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "Inserisci un URL" #: ../bin/src/ui_coverfromurldialog.h:103 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:205 msgid "Enter a filename for exported covers (no extension):" msgstr "Digita un nome file per le copertine esportate (nessuna estensione):" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "Inserisci un nuovo nome per questa scaletta" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Inserisci un artista o un tag per iniziare l'ascolto di una radio Last.fm." #: ../bin/src/ui_globalsearchview.h:209 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:77 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:77 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:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "Inserisci qui i termini di ricerca" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "Inserisci l'URL di flusso radio in Internet:" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "Digita il nome della cartella" #: ../bin/src/ui_networkremotesettingspage.h:198 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:87 msgid "Entire collection" msgstr "Collezione completa" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Errore" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Errore in fase di collegamento del dispositivo MTP" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "Errore durante la copia dei brani" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "Errore durante l'eliminazione dei brani" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "Errore di scaricamento del plugin di Spotify" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "Errore durante il caricamento di %1" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Errore durante il caricamento della scaletta di.fm" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "Errore durante l'elaborazione di %1: %2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "Errore nel caricamento del CD audio" #: library/library.cpp:63 msgid "Ever played" msgstr "Mai riprodotte" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "Ogni 10 minuti" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "Ogni 12 ore" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "Ogni 2 ore" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "Ogni 20 minuti" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "Ogni 30 minuti" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "Ogni 6 ore" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "Ogni ora" #: ../bin/src/ui_playbacksettingspage.h:303 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:208 msgid "Existing covers" msgstr "Copertine esistenti" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "Espandi" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "Scade il %1" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "Esporta copertine" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "Esporta le copertine" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "Esporta le copertine scaricate" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "Esporta le copertine integrate" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "Esporta completate" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "Esportate %1 copertine di %2 (%3 saltate)" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 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:300 msgid "Fade out when stopping a track" msgstr "Dissolvenza all'interruzione di una traccia" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "Dissolvenza" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "Durata della dissolvenza" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "Recupero della cartella non riuscito" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "Recupero del podcast non riuscito" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "Caricamento del podcast non riuscito" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "Analisi XML non riuscita per questa fonte RSS" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "Veloce" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "Preferiti" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "Tracce preferite" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "Scarica copertine mancanti" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "Scarica automaticamente" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "Scaricamento completato" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "Scaricamento della libreria di Subsonic" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Errore di scaricamento della copertina" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "Estensione file" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "Formati dei file" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Nome file" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "Nome file (senza percorso)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Dimensione file" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Tipo file" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Nome file" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "File" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "File da transcodificare" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "Trova i brani nella tua raccolta che corrispondono ai criteri specificati." #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "Creazione impronta del brano" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "Fine" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "Primo livello" #: core/song.cpp:328 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Dimensione del carattere" #: ../bin/src/ui_spotifysettingspage.h:213 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:204 msgid "Force mono encoding" msgstr "Forza codifica mono" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "Elimina dispositivo" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Modulo" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "Formato" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Velocità fotogrammi" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "Struttura per buffer" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Amici" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "Gelido" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Bassi al massimo" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "Bassi e alti al massimo" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "Alti al massimo" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "Motore audio GStreamer" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "Generale" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Impostazioni generali" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Genere" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "Ottieni un URL per condividere questa scaletta di Grooveshark" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "Ottieni un URL per condividere questo brano di Grooveshark" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "Ottenere i brani più ascoltati di Grooveshark" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "Recupero dei canali" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "Recupero flussi" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "Dagli un nome:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "Vai" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "Vai alla scheda della scaletta successiva" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "Vai alla scheda della scaletta precedente" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, 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:206 msgid "Grey out non existent songs in my playlists" msgstr "Colora di grigio i brani della scaletta non esistenti" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "Errore di accesso a Grooveshark" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "URL della scaletta di Grooveshark" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "Radio di Grooveshark" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "URL del brano di Grooveshark" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "Raggruppa raccolta per..." #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "Raggruppa per" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "Raggruppa per album" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "Raggruppa per artista" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "Raggruppa per artista/album" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "Raggruppa per artista/anno - album" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "Raggruppa per genere/album" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "Raggruppa per genere/artista/album" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "Gruppo" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "La pagina HTML non contiene alcuna fonte RSS" #: internet/subsonicsettingspage.cpp:135 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:163 msgid "HTTP proxy" msgstr "Proxy HTTP" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "Felice" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "Informazioni hardware" #: ../bin/src/ui_deviceproperties.h:372 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:202 msgid "High" msgstr "Alto" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "Alto (%1 fps)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "Alta (1024x1024)" #: internet/subsonicsettingspage.cpp:112 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:310 msgid "Hours" msgstr "Ore" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "Ipnorospo" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "Non ho un account Magnatune" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Icona" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "Icone in alto" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "Identificazione del brano in corso" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 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:77 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:204 msgid "Ignore \"The\" in artist names" msgstr "Ignora \"The\" nei nomi degli artisti" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Immagini (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "Tra %1 giorni" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "Tra %1 settimane" #: ../bin/src/ui_wizardfinishpage.h:86 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/spotifyservice.cpp:360 msgid "Inbox" msgstr "In arrivo" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "Includi copertina nella notifica" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "Includi tutti i brani" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Versione del protocollo REST di Subsonic incompatibile. Aggiornare il client." #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Versione del protocollo REST di Subsonic incompatibile. Aggiornare il server." #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Configurazione incompleta, assicurati che tutti i campi siano popolati." #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "Aumenta il volume del 4%" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "Aumenta il volume del percento" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Aumenta il volume" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "Indicizzazione di %1 in corso..." #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "Informazioni" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "Inserisci..." #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Installati" #: core/database.cpp:673 msgid "Integrity check" msgstr "Controllo d'integrità" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "Fornitori Internet" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "Chiave API non valida" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Formato non valido" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "Metodo non valido" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "Parametri non validi" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "Risorsa specificata non valida" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "Servizio non valido" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "Chiave di sessione non valida" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "Nome utente e/o password non valida" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "Tracce più ascoltate di Jamendo" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "Tracce preferite di Jamendo" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "Tracce preferite del mese di Jamendo" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "Tracce preferite della settimana di Jamendo" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "Database di Jamendo" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "Salta alla traccia in riproduzione" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Trattieni i pulsanti per %1 secondo..." #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Trattieni i pulsanti per %1 secondi..." #: ../bin/src/ui_behavioursettingspage.h:193 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:193 msgid "Keep the original files" msgstr "Mantieni i file originali" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "Gattini" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Lingua" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "Portatile/Cuffie" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Sala grande" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "Copertina grande" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "Pannello laterale grande" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "Ultima riproduzione" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "Radio personalizzata di Last.fm: %1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Raccolta di Last.fm - %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "Radio mista di Last.fm - %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Radio dei vicini di Last.fm - %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Stazione radio di Last.fm - %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Artisti simili a %1 di Last.fm" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Radio del tag di Last.fm: %1" #: internet/lastfmservice.cpp:437 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:154 msgid "Last.fm password" msgstr "Password di Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "Contatore riproduzioni di Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Etichette di Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Nome utente di Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Wiki di Last.fm" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "Tracce meno apprezzate" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "Lascia vuoto il campo per il valore predefinito. Esempi: \"/dev/dsp\", \"front\", ecc." #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "Sinistra" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Durata" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Raccolta" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "Raggruppamento avanzato della raccolta" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "Notifica nuova scansione della raccolta" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "Cerca nella raccolta" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Limiti" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "Ascolta brani di Grooveshark in base a quello che hai ascoltato in precedenza" #: ui/equalizer.cpp:123 msgid "Live" msgstr "Live" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Carica" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "Carica copertina da URL" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "Carica copertina da URL..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "Carica copertina dal disco" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "Carica copertina da disco..." #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "Carica la scaletta" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "Carica la scaletta..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Caricamento radio Last.fm" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Caricamento del dispositivo MTP" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "Caricamento database dell'iPod" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "Caricamento scaletta veloce" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "Caricamento brani in corso" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "Caricamento flusso" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "Caricamento delle tracce" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "Caricamento informazioni della traccia" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "Caricamento in corso..." #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "Carica file/URL, sostituendo la scaletta attuale" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Accedi" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "Accesso non riuscito" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "Profilo con predizione di lungo termine (LTP)" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "Mi piace" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Basso (%1 fps)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "Bassa (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "Profilo a bassa complessità (LC)" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "Testi" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "Testi da %1" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Scaricamento di Magnatune" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Scaricamento di Magnatune completato" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "Profilo principale (MAIN)" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "Procedi" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "Rendi la scaletta disponibile non in linea" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "Risposta non corretta" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "Configurazione manuale del proxy" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "Manualmente" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "Produttore" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "Marca come ascoltata" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "Marca come nuova" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "Verifica ogni termine di ricerca (AND)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "Verifica uno o più termini di ricerca (OR)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "Bitrate massimo" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "Medio (%1 fps)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "Media (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "Tipo d'iscrizione" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "Bitrate minimo" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "Preimpostazioni projectM mancanti" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "Modello" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "Controlla i cambiamenti alla raccolta" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "Riproduzione mono" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "Mesi" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "Atmosfera" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "Stile della barra dell'atmosfera" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "Barre dell'atmosfera" #: library/library.cpp:74 msgid "Most played" msgstr "Più riprodotti" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "Punto di mount" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "Punti di mount" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "Sposta in basso" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "Sposta nella raccolta..." #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "Sposta in alto" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "Musica" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Raccolta musicale" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "Silenzia" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "La mia libreria di Last.fm" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "La mia radio mista di Last.fm" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "I miei vicini di Last.fm" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "La mia radio consigliata di Last.fm" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "La mia radio mista" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "La mia musica" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "I miei vicini" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "La mia stazione radio" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "I miei consigli" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Nome" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "Opzioni di assegnazione dei nomi" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "Banda stretta (NB)" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "Vicini" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "Rete" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "Proxy di rete" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "Telecomando di rete" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "Mai" #: library/library.cpp:67 msgid "Never played" msgstr "Mai riprodotte" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "Non iniziare mai la riproduzione" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "Nuova cartella" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "Nuova scaletta" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "Nuova scaletta veloce..." #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "Nuovi brani" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "Le nuove tracce saranno aggiunte automaticamente." #: library/library.cpp:80 msgid "Newest tracks" msgstr "Tracce più recenti" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "Successivo" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Traccia successiva" #: core/utilities.cpp:147 msgid "Next week" msgstr "Settimana prossima" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "Nessun analizzatore" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "Nessuna immagine di sfondo" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "Nessuna copertina da esportare." #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "Nessun blocco lungo" #: playlist/playlistcontainer.cpp:366 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:145 msgid "No short blocks" msgstr "Nessun blocco corto" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "Nessuna" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 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:155 msgid "Normal" msgstr "Normale" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "Tipo di blocco normale" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "Non disponibile mentre si utilizza una scaletta dinamica" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "Non connesso" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "Contenuti non sufficienti" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "Non ci sono abbastanza ammiratori" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "Membri non sufficienti" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "Vicini non sufficienti" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Non installati" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "Accesso non effettuato" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "Non montato - doppio clic per montare" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "Tipo di notifica" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Notifiche" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "In riproduzione" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "Anteprima OSD" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "Opacità" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "Apri %1 nel browser" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "Apri CD &audio..." #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "Apri file OPML" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "Apri file OPML..." #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "Apri dispositivo" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "Apri file..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "Apri in Google Drive" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "Apri in nuova scaletta" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Apri..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "Operazione non riuscita" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "Ottimizza per bitrate" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "Ottimizza per qualità" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "Opzioni..." #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "Organizza file" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "Organizza file..." #: core/organise.cpp:65 msgid "Organising files" msgstr "Organizzazione file" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "Tag originali" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Altre opzioni" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "Uscita" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "Dispositivo di uscita" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "Opzioni di uscita" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "Plugin di uscita" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "Sovrascrivi tutte" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "Sovrascrivi i file esistenti" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "Sovrascrivi solo le più piccole" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "Proprietario" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "Analisi del catalogo di Jamendo" #: ui/equalizer.cpp:124 msgid "Party" msgstr "Festa" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "Password" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Pausa" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "Sospendi riproduzione" #: widgets/osd.cpp:156 msgid "Paused" msgstr "In pausa" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "Musicista" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "Pixel" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "Barra laterale semplice" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Riproduci" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "Riproduci artista o tag" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "Riproduci radio dell'artista..." #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "Contatore di riproduzione" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "Riproduci radio personalizzata..." #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "Riproduci se fermata, sospendi se in riproduzione" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "Riproduci se non c'è altro in riproduzione" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "Riproduci radio del tag..." #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "Riproduci la traccia numero della scaletta" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "Riproduci/Pausa" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Riproduzione" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Opzioni del lettore" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "Scaletta" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "Scaletta terminata" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "Opzioni della scaletta" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "Tipo di scaletta" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "Scalette" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "Chiudi il browser e ritorna a Clementine." #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "Stato del plugin:" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "Podcast" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Pop" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "Brani popolari" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "I brani più ascoltati del mese" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "I brani più ascoltati oggi" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "Durata del fumetto" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "Porta" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "Preamplificazione" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "Preferenze" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "Preferenze..." #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "Nomi dei file di copertina preferiti (separati da virgola)" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "Formato audio preferito" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "Bitrate preferito" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "Formato preferito" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "Tipo di audio Premium" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "Preimpostazione:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "Premi una combinazione da utilizzare per" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "Premi un tasto" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Premi una combinazione di tasto da utilizzare per %1..." #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "Opzioni OSD gradevole" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "Anteprima" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "Precedente" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 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:131 msgid "Profile" msgstr "Profilo" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "Avanzamento" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 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:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "Qualità" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "Interrogazione dispositivo..." #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "Gestore della coda" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "Accoda le tracce selezionate" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "Accoda la traccia" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "Radio (volume uguale per tutte le tracce)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "Radio" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "Pioggia" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "Visualizzazione casuale" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "Valuta il brano corrente con 0 stelle" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "Valuta il brano corrente con 1 stella" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "Valuta il brano corrente con 2 stelle" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "Valuta il brano corrente con 3 stelle" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "Valuta il brano corrente con 4 stelle" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "Valuta il brano corrente con 5 stelle" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "Valutazione" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "Vuoi davvero annullare?" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "Limite di redirezioni superato, verifica la configurazione del server." #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "Aggiorna" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "Aggiorna catalogo" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "Aggiorna i canali" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "Aggiorna l'elenco degli amici" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "Aggiorna l'elenco delle stazioni" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "Aggiorna i flussi" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Reggae" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "Ricorda il movimento del Wii remote" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "Ricorda l'ultima sessione" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Rimuovi" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "Rimuovi azione" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "Rimuovi duplicati dalla scaletta" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "Rimuovi cartella" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "Rimuovi dalla mia musica" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "Rimuovi dai preferiti" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "Rimuovi dalla scaletta" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "Rimuovi la scaletta" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "Rimuovi scalette" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "Rimozione brani dalla mia musica" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "Rimozione brani dai preferiti" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "Rinomina la scaletta \"%1\"" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "Rinomina scaletta di Grooveshark" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "Rinomina la scaletta" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "Rinomina la scaletta..." #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "Ricorda l'ordine delle tracce..." #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Ripeti" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "Ripeti album" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "Ripeti scaletta" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "Ripeti traccia" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Sostituisci la scaletta attuale" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "Sostituisci la scaletta" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "Sostituisci gli spazi con trattini bassi" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "Guadagno di riproduzione" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "Modalità guadagno di riproduzione" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "Ripopolamento" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "Richiedi il codice di autenticazione" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "Azzera" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" msgstr "Azzera i contatori" #: 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:206 msgid "Restrict to ASCII characters" msgstr "Limita ai caratteri ASCII" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "Riprendi la riproduzione all'avvio" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "Recupero brani dalla mia musica di Grooveshark" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "Recuperare i brani preferiti di Grooveshark" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "Recuperare le scalette di Grooveshark" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "Torna a Clementine" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "Destra" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "Esegui" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "Proxy SOCKS" #: internet/subsonicsettingspage.cpp:122 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:202 msgid "Safely remove device" msgstr "Rimuovi il dispositivo in sicurezza" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "Rimuovi il dispositivo in sicurezza al termine della copia" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "Campionamento" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "Campionamento" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "Salva i file .mood nella raccolta" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "Salva la copertina dell'album" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "Salva la copertina su disco..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "Salva l'immagine" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "Salva la scaletta" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "Salva la scaletta..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "Salva la preimpostazione" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "Salva le valutazioni nei tag dei file quando è possibile" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "Salva le statistiche nei tag dei file quando è possibile" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "Salva questo flusso nella scheda Internet" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "Salvare le statistiche dei brani nei file" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "Salvataggio tracce in corso" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "Profilo con campionamento scalabile (SSR)" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "Riscala le dimensioni" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "Punteggio" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "Scrobbling delle tracce ascoltate" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "Cerca" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "Cerca le stazioni Icecast" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "Cerca in Jamendo" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Cerca in Magnatune" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "Cerca su Subsonic" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "Cerca copertine degli album..." #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "Cerca qualsiasi cosa" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "Cerca in gpodder.net" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "Cerca in iTunes" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "Modalità di ricerca" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "Opzioni di ricerca" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "Cerca risultati" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "Termini di ricerca" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "Cercare su Grooveshark" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "Secondo livello" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "Scorri indietro" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "Scorri in avanti" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "Sposta la traccia in riproduzione di una quantità relativa" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "Sposta la traccia in riproduzione su una posizione assoluta" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "Seleziona tutto" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "Selezione nulla" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "Seleziona il colore di sfondo:" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "Seleziona l'immagine di sfondo" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "Seleziona le migliori corrispondenze possibili" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "Seleziona il colore di primo piano:" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "Seleziona visualizzazioni" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "Seleziona visualizzazioni..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "Numero seriale" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "URL del server" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "Dettagli del server" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "Servizio non in linea" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Imposta %1 a \"%2\"..." #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "Imposta il volume al percento" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "Imposta valore per tutte le tracce selezionate..." #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "Impostazioni" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Scorciatoia" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "Scorciatoia per %1" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "La scorciatoia per %1 esiste già" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Mostra" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "Mostra OSD" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "Mostra un'animazione luminosa sulla traccia corrente" #: ../bin/src/ui_appearancesettingspage.h:293 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:434 msgid "Show a native desktop notification" msgstr "Mostra una notifica nativa del desktop" #: ../bin/src/ui_notificationssettingspage.h:442 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:441 msgid "Show a notification when I change the volume" msgstr "Mostra una notifica quando regolo il volume" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "Mostra un fumetto dal vassoio di sistema" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "Mostra un OSD gradevole" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "Mostra la barra di stato superiore" #: ui/mainwindow.cpp:460 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:209 msgid "Show cover art in library" msgstr "Mostra le copertine nella raccolta" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "Mostra separatori" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "Mostra a dimensioni originali..." #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "Mostra nel navigatore file..." #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "Mostra in artisti vari" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "Mostra la barra dell'atmosfera" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "Mostra solo i duplicati" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "Mostra solo i brani senza tag" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "Mostra i suggerimenti di ricerca" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "Mostra i pulsanti \"Mi piace\" e \"Vieta\"" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "Mostra il pulsante di scrobble nella finestra principale" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "Mostra icona nel vassoio" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "Mostra le fonti abilitate e disabilitate" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "Mostra/Nascondi" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Mescola" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "Mescola gli album" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "Mescola tutto" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "Mescola la scaletta" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "Mescola le tracce di questo album" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "Registrati" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "Disconnetti" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "Registrazione in corso..." #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "Artisti simili" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "Dimensioni" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "Dimensioni:" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "Salta indietro nella scaletta" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "Salta il conteggio" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "Salta in avanti nella scaletta" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "Copertine piccole" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "Pannello laterale piccolo" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "Scaletta veloce" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "Scalette veloci" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Leggere" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "Rock leggero" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "Informazioni brano" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "Info brano" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "Sonogramma" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "Spiacente" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "Ordina per genere (alfabetico)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "Ordina per genere (popolarità)" #: ../bin/src/ui_icecastfilterwidget.h:77 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" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "Fonte" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "Fonti" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "Errore di accesso a Spotify" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "Plugin di Spotify" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "Plugin di Spotify non installato" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "Standard" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "Preferiti" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "Avvia la scaletta attualmente in riproduzione" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "Avvia transcodifica" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 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:405 #, qt-format msgid "Starting %1" msgstr "Avvio di %1" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "Avvio in corso..." #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "Stazioni" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Ferma" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "Ferma dopo" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "Ferma dopo questa traccia" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Ferma riproduzione" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "Ferma la riproduzione dopo la traccia corrente" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "Fermato" #: core/song.cpp:341 msgid "Stream" msgstr "Flusso" #: internet/subsonicsettingspage.cpp:30 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:160 msgid "Streaming membership" msgstr "Trasmissione" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "Scalette sottoscritte" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "Sottoscrittori" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "Successo!" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "%1 scritto correttamente" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "Tag consigliati" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "Riepilogo" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "Molto alto (%1 fps)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "Molto alta (2048x2048)" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "Formati supportati" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "Sincronizza le statistiche nei file ora" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "Sincronizzazione inbox di Spotify" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "Sincronizzazione scaletta di Spotify" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "Sincronizzazione tracce preferite di Spotify" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "Colori di sistema" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "Schede in alto" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Tag" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "Strumento di recupero dei tag" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "Radio del tag" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "Bitrate finale" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "Opzioni testo" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Grazie a" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Il comando \"%1\" non può essere avviato." #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "La copertina dell'album del brano in riproduzione" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "La cartella %1 non è valida" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "La scaletta '%1' è vuota o non può essere caricata." #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "Il sito richiesto non è un'immagine!" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "Ci sono altri brani in questo album" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "Si è verificato un problema durante la comunicazione con gpodder.net" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Si è verificato un problema durante il recupero dei dati aggiuntivi da Magnatune" #: podcasts/itunessearchpage.cpp:76 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:56 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:389 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:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 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:187 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:174 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:151 msgid "Third level" msgstr "Terzo livello" #: internet/jamendoservice.cpp:171 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/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "L'album non è disponibile nel formato richiesto" #: ../bin/src/ui_deviceproperties.h:381 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:375 msgid "This device supports the following file formats:" msgstr "Questo dispositivo utilizza i seguenti formati file:" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Il dispositivo non funzionerà correttamente" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Questa opzione può essere modificata nelle preferenze di \"Comportamento\"" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "Questo flusso è riservato ai soli abbonati" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "Questi tipo di dispositivo non è supportato: %1" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "Tempo scaduto" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Titolo" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "Per avviare una radio di Grooveshark, devi prima ascoltare alcuni brani" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "Oggi" #: core/globalshortcuts.cpp:59 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:1369 msgid "Toggle queue status" msgstr "Cambia lo stato della coda" #: ../bin/src/ui_mainwindow.h:718 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:143 msgid "Tomorrow" msgstr "Domani" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "Troppe redirezioni" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "Tracce preferite" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "Album totali:" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "Totale byte trasferiti" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "Totale richieste di rete effettuate" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Traccia" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "Transcodifica musica" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "Log di transcodifica" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "Transcodifica" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Transcodifica di %1 file utilizzando %2 thread" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "Opzioni di transcodifica" #: core/song.cpp:338 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "Turbina" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "Spegni" #: devices/giolister.cpp:161 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "URL" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "Password di Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "Nome utente di Ubuntu One" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "Banda ultra larga (UWB)" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Impossibile scaricare %1 (%2)" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Sconosciuto" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "Tipo di contenuto sconosciuto" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Errore sconosciuto" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "Rimuovi copertina" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "Rimuovi sottoscrizione" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "Prossimi concerti" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "Aggiorna la scaletta di Grooveshark" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "Aggiorna tutti i podcast" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "Aggiorna le cartelle modificate della raccolta" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "Aggiorna la raccolta all'avvio di Clementine" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "Aggiorna questo podcast" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "Aggiornamento in corso" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Aggiornamento di %1" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "Aggiornamento %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Aggiornamento raccolta" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "Utilizzo" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "Usa il tag Artista dell'album se disponibile" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "Utilizza le scorciatoie di Gnome" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "Utilizza i metadati del guadagno di riproduzione se disponibili" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "Utilizza SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "Utilizza Wii Remote" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "Usa un insieme di colori personalizzato" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "Usa un messaggio personalizzato per le notifiche" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "Usa un telecomando in rete" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "Usa autenticazione" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "Usa il motore di gestione del bitrate" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "Usa la modalità dinamica" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "Utilizza le notifiche per segnalare lo stato del Wii Remote" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "Usa modellazione temporale del rumore" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "Usa i valori predefiniti di sistema" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "Usa i colori predefiniti di sistema" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "Utilizza le impostazioni di sistema del proxy" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "Usa la normalizzazione del volume" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "Utilizzato" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "L'utente %1 non ha un account di Grooveshark Anywhere" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "Interfaccia utente" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Nome utente" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "L'utilizzo del menu per aggiungere un brano..." #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "MP3 VBR" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "Bitrate variabile" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "Artisti vari" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "Versione %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "Visualizza" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "Modalità di visualizzazione" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "Visualizzazioni" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "Impostazioni di visualizzazione" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "Rilevazione attività vocale" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "Volume %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "Avvisami alla chiusura di una scheda della scaletta" #: core/song.cpp:337 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "Sito web" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "Settimane" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "All'avvio di Clementine" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "Quando l'elenco è vuoto..." #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "Perché non provi..." #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "Banda larga (WB)" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii Remote %1: attivato" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii Remote %1: connesso" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii Remote %1: livello batteria critico (%2%) " #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii Remote %1: disattivato" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii Remote %1: disconnesso" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Remote %1: livello batteria basso (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "Windows media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "Windows Media audio" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "Senza copertina:" #: library/libraryview.cpp:530 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:2088 msgid "Would you like to run a full rescan right now?" msgstr "Vuoi eseguire subito una nuova scansione completa?" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "Scrivi le statistiche dei brani nei file" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "Nome utente o password non validi." #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "Anno" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "Anno - Album" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "Anni" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "Ieri" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "Stai per scaricare i seguenti album" #: playlist/playlistlistcontainer.cpp:311 #, 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:177 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:172 msgid "You are not signed in." msgstr "Non sei registrato." #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "Sei registrato come %1." #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "Sei registrato." #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "Puoi modificare l'organizzazione dei brani nella raccolta." #: internet/digitallyimportedsettingspage.cpp:46 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/magnatunesettingspage.cpp:53 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:57 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" #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "Puoi inviare informazioni sulle tracce gratuitamente, ma solo gli abbonati a pagamento possono ascoltare le radio Last.fm da Clementine" #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "Non hai un account Grooveshark Anywhere." #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Non hai un account Premium Spotify." #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "Non hai una sottoscrizione attiva" #: internet/spotifyservice.cpp:170 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/spotifysettingspage.cpp:158 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:87 msgid "You love this track" msgstr "Ti piace questa traccia" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "Devi aprire le preferenze di sistema e attivare \"Abilita l'accesso per i dispositivi di assistenza\" per utilizzare le scorciatoie globali in Clementine." #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "Dovrai riavviare Clementine se cambi la lingua." #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "Non potrai riprodurre le stazioni radio Last.fm poiché non sei abbonato a Last.fm." #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "Il tuo indirizzo IP:" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Le credenziali Last.fm non sono corrette" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "Le credenziali fornite per Magnatune non erano corrette" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "La raccolta è vuota!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "I tuoi flussi radio" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "I tuoi scrobble: %1" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Supporto OpenGL mancante sul sistema, le visualizzazioni non sono disponibili." #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "Nome utente o password non corretta." #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Zero" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "aggiungi %n brani" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "dopo il" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "fa" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "e" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "automatica" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "prima del" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "compreso tra" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "prima i più grandi" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "contiene" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "disabilitata" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "disco %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "non contiene" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "finisce con" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "uguale a" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "gpodder.net" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "gpodder.net directory" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "maggiore di" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "negli ultimi" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "minore di" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "prima i più lunghi" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "sposta %n brani" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "prima i più recenti" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "diverso" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "non negli ultimi" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "non in" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "prima i più datati" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "il" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "opzioni" #: ../bin/src/ui_networkremotesettingspage.h:203 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:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "rimuovi %n brani" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "prima i più corti" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "mescola i brani" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "prima i più piccoli" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "ordina i brani" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "comincia con" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "ferma" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "traccia %1" clementine-1.2.0+dfsg/src/translations/ja.po000066400000000000000000004724301223327513400210320ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # davidsansome , 2010 # Masaki , 2013 # Masaki , 2011-2012 # Yoshihito YOSHINO , 2012-2013 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:08+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Japanese (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr " 日" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " ミリ秒" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " pt" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " 秒" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " 曲" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 枚のアルバム" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 日" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 日前" #: podcasts/gpoddersync.cpp:79 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 プレイリスト (%2)" #: playlist/playlistmanager.cpp:413 #, qt-format msgid "%1 selected of" msgstr "%1 個選択中" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 曲" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 曲" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 曲見つかりました" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 曲見つかりました (%2 曲を表示中)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 個のトラック" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 転送済み" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wii リモコンデバイスモジュール" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n 曲失敗しました" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n が完了しました" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "カスタム(&C)" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "おまけ(&E)" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "ヘルプ(&H)" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "%1 を非表示にする(&H)" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "非表示にする(&H)..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "左揃え(&L)" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "ミュージック(&M)" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "なし(&N)" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "プレイリスト(&P)" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "終了(&Q)" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "リピートモード(&R)" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "右揃え(&R)" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "シャッフルモード(&S)" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "列の幅をウィンドウに合わせる(&S)" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "ツール(&T)" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(複数の曲で一致しません)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "... および Amarok に貢献されたすべての方々" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "0px" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 日" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 トラック" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "127.0.0.1" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "" #: library/library.cpp:60 msgid "50 random tracks" msgstr "ランダムな 50 トラック" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "今すぐプレミアムへアップグレードする" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "Grooveshark Anywhere のアカウントが必要です。" #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "Spotify のプレミアムアカウントが必要です。" #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:78 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:153 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "曲がこれらの条件に一致する場合はこのプレイリストに含まれます。" #: smartplaylists/searchterm.cpp:297 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "ALL GLORY TO THE HYPNOTOAD" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "中止" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "%1 について" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "Clementine について..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "Qt について..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "アカウントの詳細" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "アカウントの詳細 (プレミアム)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "アクション" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Wii リモコンのアクティブ・非アクティブを切り替える" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "ポッドキャストの追加" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "ストリームを追加" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "改行を追加 (通知形式が対応している場合)" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "アクションの追加" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "別のストリームを追加..." #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "ディレクトリを追加..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "ファイルを追加" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "ファイルを追加..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "トランスコードするファイルの追加" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "フォルダーを追加" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "フォルダーを追加..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "新しいフォルダーを追加..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "ポッドキャストを追加" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "ポッドキャストを追加..." #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "検索条件を追加" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "曲のアルバムタグを追加" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "曲のアルバムアーティストタグを追加" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "曲のアーティストタグを追加" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "曲の作曲者タグを追加" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "曲のディスクタグを追加" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "曲のファイル名を追加" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "曲のジャンルタグを追加" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "曲の長さタグを追加" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "曲の再生回数を追加" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "曲のスキップ回数を追加" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "曲のタイトルタグを追加" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "曲のトラックタグを追加" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "曲の年タグを追加" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "ストリームを追加..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "Grooveshark のお気に入りに追加" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "Grooveshark のプレイリストに追加" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "別のプレイリストに追加" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "プレイリストに追加する" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "キューに追加する" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Wii リモコンデバイスのアクションの追加" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "追加..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "今月追加されたもの" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "今週追加されたもの" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "今年追加されたもの" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "今日追加されたもの" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "3 ヶ月以内に追加されたもの" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "曲をマイミュージックに追加中" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "曲をお気に入りに追加中" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "高度なグループ化..." #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "コピー後..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "アルバム" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "アルバム (すべてのトラックで最適な音量)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "アルバムアーティスト" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "アルバムカバー" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "jamendo.com のアルバム情報..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "カバー付きのアルバム" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "カバーなしのアルバム" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "すべてのファイル (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "All Glory to the Hypnotoad!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "すべてのアルバム" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "すべてのアーティスト" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "すべてのファイル (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "すべてのプレイリスト (%1)" #: ui/about.cpp:74 msgid "All the translators" msgstr "すべての翻訳者" #: library/library.cpp:84 msgid "All tracks" msgstr "すべてのトラック" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "M/S エンコードを許可" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "元と同じ" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "メインウィンドウを常に隠す" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "メインウィンドウを常に表示する" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "常に再生を開始する" #: internet/spotifyblobdownloader.cpp:60 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:61 msgid "An error occurred loading the iTunes database" msgstr "iTunes のデータベースを読み込み中にエラーが発生しました" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "メタデータを '%1' へ書き込み中にエラーが発生しました" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "原因不明のエラーが発生しました。" #: ui/about.cpp:78 msgid "And:" msgstr "そして:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "外観" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "ファイル・URL をプレイリストに追加する" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "現在のプレイリストに追加" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "プレイリストに追加" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "クリップ防止のために音量を制限する" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "プリセット \"%1\" を削除してもよろしいですか?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "本当にこのプレイリストを削除しますか?" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "この曲の統計をリセットしてもよろしいですか?" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "アーティスト" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "アーティストの情報" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "アーティストラジオ" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "アーティストタグ" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "アーティストの頭文字" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "オーディオ形式" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "認証に失敗しました" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "作者" #: ui/about.cpp:65 msgid "Authors" msgstr "作者" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "自動" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "自動更新中" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "下位カテゴリが 1 つしかないときは、ライブラリツリーを自動で開く" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "空き" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "平均ビットレート" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "平均画像サイズ" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "BBC ポッドキャスト" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "バックグラウンドストリーム" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "背景色" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "背景画像" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "背景の不透明度" #: core/database.cpp:734 msgid "Backing up database" msgstr "データベースをバックアップ中" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "はじき出す" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "バー表示" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "標準のブルー" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "基本のオーディオの種類" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "動作" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "良" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "%1 からのバイオグラフィ" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "ビットレート" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "ビットレート" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "ブロック表示" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "ブロックタイプ" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "本文" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "ブームアナライザー" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "参照..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "バッファ中" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "ただし次のソースは無効になっています:" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "ボタン" #: core/song.cpp:339 msgid "CDDA" msgstr "オーディオ CD" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "CUE シートのサポート" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "キャンセル" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "カバーアートの変更" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "フォントサイズの変更..." #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "リピートモードの変更" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "ショートカットの変更..." #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "シャッフルモードの変更" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "言語の変更" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "モノラル再生の設定変更は次に再生する曲から反映されます" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "新しいエピソードのチェック" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "更新のチェック..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "スマートプレイリストの名前を選択してください" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "自動的に選択する" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "色の選択..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "フォントの選択..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "一覧から選択する" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "プレイリストの並び順と、プレイリスト内に何曲含めるかを選択してください。" #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "ポッドキャストのダウンロードディレクトリを選択してください" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "歌詞の検索時に Clementine が使用する Web サイトを選択してください。" #: ui/equalizer.cpp:115 msgid "Classical" msgstr "クラシック" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "整理" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "クリア" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "プレイリストをクリア" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Clementine のエラー" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Clementine オレンジ" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Clementine ビジュアライゼーション" #: ../bin/src/ui_deviceproperties.h:376 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine はこのデバイスへコピーする際、このデバイスで再生可能な形式に自動で変換できます。" #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine は Dropbox にアップロードしたミュージックを再生できます" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine は Google Drive にアップロードしたミュージックを再生できます" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "Clementine は Ubuntu One にアップロードしたミュージックを再生できます" #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "Clementine はトラックの変更時にメッセージを表示できます。" #: ../bin/src/ui_podcastsettingspage.h:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine は購読リストを他のコンピューターやポッドキャストアプリケーションと同期できます。 アカウントを作成する。" #: visualisations/projectmvisualisation.cpp:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine は projectM のビジュアライゼーションを読み込めませんでした。Clementine が正しくインストールされているか確認してください。" #: internet/lastfmsettingspage.cpp:110 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 "接続に問題があるため、あなたの購読情報を取得できませんでした。再生したトラックはキャッシュされ、後で Last.fm に送信されます。" #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Clementine 画像ビューアー" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "このファイルの検索結果を見つけられませんでした。" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "Clementine は次にあるミュージックを検索します:" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "ミュージックを追加するにはここをクリックします" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "ここをクリックすると、残り時間と合計時間の表示を切り替えます" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "プレイリストを閉じる" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "ビジュアライゼーションを閉じる" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "このウィンドウを閉じるとダウンロードをキャンセルします。" #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "このウィンドウを閉じるとアルバムカバーの検索を中止します。" #: ui/equalizer.cpp:116 msgid "Club" msgstr "クラブ" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Colors" msgstr "色" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "コンマ区切りの クラス:レベル のリスト、レベルは 0-3" #: playlist/playlist.cpp:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "コメント" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "タグの自動補完" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "タグを自動補完..." #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "作曲者" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "%1 の設定..." #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "Grooveshark の設定..." #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Last.fm の設定..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "Magnatune の設定..." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "ショートカットの設定" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "Spotify の設定..." #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "全体検索の設定..." #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "ライブラリの設定..." #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "ポッドキャストの設定..." #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "設定..." #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "アクティブ・非アクティブの切り替えアクションを使用して Wii リモコンを接続する" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "デバイスの接続" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "Spotify に接続中" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "コンソール" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "固定ビットレート" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "すべての曲を変換する" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "デバイスが再生できないすべての曲を変換する" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "クリップボードにコピー" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "デバイスへコピー..." #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "ライブラリへコピー..." #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "著作権" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:64 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "GStreamer 要素 \"%1\" を作成できませんでした。必要な GStreamer プラグインがすべてインストールされていることを確認してください" #: transcoder/transcoder.cpp:432 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "%1 のミュクサーを見つけることができませんでした。正しい GStreamer プラグインがインストールされていることをチェックしてください" #: transcoder/transcoder.cpp:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "%1 のエンコーダーを見つけることができませんでした。正しい GStreamer プラグインがインストールされていることをチェックしてください" #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "last.fm ラジオ局を読み込めませんでした" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "出力ファイル %1 を開けませんでした" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "カバーマネージャー" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "埋め込み画像からのカバーアート" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "%1 から自動的に読み込まれたカバーアート" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "カバーアートは手動で未設定にされています" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "カバーアートが設定されていません" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "%1 からのカバーアートセット" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "%1 からのカバー" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "新規 Grooveshark プレイリストの作成" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "トラックが自動で変更するときにクロスフェードする" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "トラックを手動で変更したときにクロスフェードする" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "カスタム" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "カスタム画像:" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "カスタムメッセージの設定" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "カスタムラジオ" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "カスタム..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "DBus のパス" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Dance" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "作成日時" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "更新日時" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "日" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "既定(&F)" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "音量を 4% 下げます" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "音量を下げる" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "既定の背景画像" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "既定" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "ビジュアライゼーションの間の遅延" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "削除" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "Grooveshark プレイリストの削除" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "ダウンロード済みデータを削除" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "ファイルの削除" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "デバイスから削除..." #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "ディスクから削除..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "再生したエピソードの削除" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "プリセットの削除" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "スマートプレイリストを削除" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "元のファイルを削除する" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "ファイルの削除中" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "選択されたトラックをキューから削除する" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "トラックをキューから削除" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "フォルダー" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "詳細..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "デバイス" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "デバイスのプロパティ" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "デバイス名" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "デバイスのプロパティ..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "デバイス" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "もしかして" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "Digitally Imported のパスワード" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "Digitally Imported のユーザー名" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "インターネットに直接接続する" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "ディレクトリ" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "長さを無効にする" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "ムードバーの生成をやめる" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "無効" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "ディスク" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "画面のオプション" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "OSD を表示する" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "ライブラリ全体を再スキャン" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "すべてのミュージックを変換しない" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "リピートしない" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "さまざまなアーティストに表示しない" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "シャッフルしない" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "中止しないでください!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "ダブルクリックで開く" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "曲をダブルクリックした際の動作..." #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "%n 個のエピソードをダウンロード" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "ダウンロードディレクトリ" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "エピソードのダウンロード先" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "メンバーシップのダウンロード" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "新しいエピソードを自動的にダウンロードする" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "ダウンロードがキューに追加されました" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "このアルバムのダウンロード" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "このアルバムをダウンロード..." #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "このエピソードをダウンロード" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "ダウンロード..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "ダウンロード中 (%1%)..." #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "Icecast ディレクトリをダウンロード中" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "Jamendo カタログをダウンロード中" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "Magnatune カタログをダウンロード中" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "Spotify のプラグインをダウンロード中" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "メタデータをダウンロード中" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "位置を変更するにはドラッグします" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "Dropbox" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "ダイナミックモードはオンです" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "ダイナミックランダムミックス" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "スマートプレイリストの編集..." #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "タグ \"%1\" の編集..." #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "タグの編集..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "タグの編集" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "トラック情報の編集" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "トラック情報の編集..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "トラック情報の編集..." #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "編集..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "Wii リモコンサポートを有効にする" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "イコライザーを有効にする" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "Clementine にフォーカスがあるときのみショートカットを有効にする" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "下のソースを有効にすると検索結果に含まれます。結果はこの並び順で表示されます。" #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "Last.fm の scrobbling を有効・無効にする" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "エンコーディングエンジンの品質" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "エンコーディングモード" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "URL を入力" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "インターネットからカバーアートをダウンロードする URL を入力してください:" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "このプレイリストの名前を入力してください" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Last.fm ラジオの聴取を開始するにはアーティストタグを入力してください。" #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "コンピューター上およびインターネット上のミュージックを検索するには、上に検索条件を入力してください" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "iTunes Store のポッドキャストを検索するには、下に検索条件を入力してください" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "gpodder.net 上のポッドキャストを検索するには、下に検索条件を入力してください" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "ここに検索条件を入力してください" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "インターネットラジオストリームの URL を入力してください:" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "フォルダ名を入力してください" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "コレクション全体" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "エラー" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "MTP デバイスの接続エラー" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "曲のコピーエラー" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "曲の削除エラー" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "Spotify プラグインのダウンロードエラー" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "%1 の読み込みエラー" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "di.fm プレイリストの読み込みエラー" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "%1 の処理エラー: %2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "音楽 CD を読み込み中にエラーが発生しました" #: library/library.cpp:63 msgid "Ever played" msgstr "再生したことがある" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "10 分おき" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "12 時間おき" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "2 時間おき" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "20 分おき" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "30 分おき" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "6 時間おき" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "1 時間おき" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "同じアルバムもしくはキューシートのトラック同士の場合は除外する" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "広げる" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "トラックの停止時にフェードアウトする" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "フェード" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "フェードの長さ" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "ディレクトリの取得に失敗しました" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "ポッドキャストの取得に失敗しました" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "ポッドキャストの読み込みに失敗しました" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "この RSS フィードの XML の分析に失敗しました" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "速" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "お気に入り" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "お気に入りのトラック" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "足りないカバーの取得" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "自動的に取得する" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "取得完了" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "カバーの取得エラー" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "ファイル拡張子" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "ファイル形式" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "ファイル名" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "ファイル名 (パスなし)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "ファイルサイズ" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "ファイルの種類" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "ファイル名" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "ファイル" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "トランスコードするファイル" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "指定する条件に一致するライブラリから曲を検索します。" #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "曲の特徴を検出しています" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "完了" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "第 1 階層" #: core/song.cpp:328 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "フォントサイズ" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "ライセンス上の理由で Spotify サポートは別プラグインになっています。" #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "モノラルエンコーディングを強制する" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "デバイスを忘れる" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "フォーム" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "形式" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "フレームレート" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "友だち" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Full Bass" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "Full Bass + Treble" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "Full Treble" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "GStreamer オーディオエンジン" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "全般" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "全般設定" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "ジャンル" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "Grooveshark で人気の曲を取得中" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "チャンネルの取得中" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "ストリームの取得中" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "名前を入力してください:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "進む" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "次のプレイリストタブへ" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "前のプレイリストタブへ" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "%2 個中 %1 個のカバーを取得しました (%3 個失敗しました)" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "プレイリスト上の存在しない曲をグレーで表示する" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "Grooveshark ログインエラー" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "Grooveshark プレイリストの URL" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "Grooveshark ラジオ" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "Grooveshark の曲の URL" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "ライブラリのグループ化..." #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "グループ化" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "アルバムでグループ化" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "アーティストでグループ化" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "アーティスト/アルバムでグループ化" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "アーティスト/年 - アルバムでグループ化" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "ジャンル/アルバムでグループ化" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "ジャンル/アーティスト/アルバムでグループ化" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "HTML ページに RSS フィードが含まれていませんでした" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "HTTP プロキシ" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "ハードウェアの情報" #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "ハードウェアの情報はデバイス接続中のみ利用できます。" #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "高" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "高 (%1 fps)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "高 (1024x1024)" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "時間" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "Magnatune アカウントがありません" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "アイコン" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "アイコンを上に配置" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "曲の識別中" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "続行すると、このデバイスは低速で動作しコピーされた曲は動作しなくなる可能性があります。" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "ポッドキャストの URL がある場合は、下に入力して進むを押してください。" #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "アーティスト名の \"The\" を無視する" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "画像 (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "%1 日以内" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "%1 週以内" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "通知にアルバムアートを含める" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "すべての曲を含む" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "音量を 4% 上げます" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "音量を上げる" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "%1 のインデックスを作成しています。" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "情報" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "挿入..." #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "インストール済み" #: core/database.cpp:673 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "インターネット" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "インターネットプロバイダ" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "不正な API キーです" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "不正な形式です" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "不正なメソッドです" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "不正なパラメーターです" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "不正なリソースが指定されました" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "不正なサービスです" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "不正なセッションキーです" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "ユーザー名またはパスワードが違います" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "Jamendo の最も聴かれているトラック" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "Jamendo のトップトラック" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "Jamendo の今月のトップトラック" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "Jamendo の今週のトップトラック" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "Jamendo のデータベース" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "現在再生中のトラックへジャンプ" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "ボタンを %1 秒長押し..." #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "ボタンを %1 秒長押し..." #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "ウィンドウを閉じたときバックグラウンドで起動し続ける" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "元のファイルを保持する" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "Kittens" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "言語" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "ノートパソコン・ヘッドフォン" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Large Hall" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "大きいアルバムカバー" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "大きいサイドバー" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "最終再生" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "Last.fm カスタムラジオ: %1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Last.fm ライブラリ - %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "Last.fm ミックスラジオ - %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Last.fm ご近所さんのラジオ - %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Last.fm ラジオ局 - %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Last.fm %1 にテイストの似たアーティスト" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Last.fm タグラジオ: %1" #: internet/lastfmservice.cpp:437 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm は現在混雑しています。数分後にやり直してください" #: ../bin/src/ui_lastfmsettingspage.h:154 msgid "Last.fm password" msgstr "Last.fm のパスワード" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "Last.fm の再生回数" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Last.fm タグ" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Last.fm のユーザー名" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Last.fm wiki" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "嫌いなトラック" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "既定にするには空のままにします。例: \"/dev/dsp\"、\"front\"、など" #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "長さ" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "ライブラリ" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "ライブラリの高度なグループ化" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "ライブラリ検索" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "制限" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "以前聴いた曲をもとに Grooveshark の曲を聴きます" #: ui/equalizer.cpp:123 msgid "Live" msgstr "Live" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "読み込み" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "URL からカバーの読み込み" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "URL からカバーの読み込み..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "ディスクからカバーの読み込み" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "ディスクからカバーの読み込み..." #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "プレイリストの読み込み" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "プレイリストの読み込み..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Last.fm ラジオの読み込み中" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "MTP デバイスの読み込み中" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "iPod データベースの読み込み中" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "スマートプレイリストの読み込み中" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "曲の読み込み中" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "ストリームの読み込み中" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "トラックの読み込み中" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "トラック情報の読み込み中" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "読み込んでいます..." #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "ファイル・URL を読み込んで、現在のプレイリストを置き換えます" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "ログイン" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "Love" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "低 (%1 fps)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "低 (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "歌詞" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "%1 からの歌詞" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Magnatune ダウンロード" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Magnatune ダウンロードが完了しました" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "不正な応答です" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "プロキシの手動構成" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "手動" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "製造元" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "すべての検索条件に一致する (AND)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "1 つ以上の検索条件に一致する (OR)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "最高ビットレート" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "中 (%1 fps)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "中 (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "メンバーシップの種類" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "最低ビットレート" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "projectM プリセットがありません" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "モデル" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "ライブラリの変更を監視する" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "モノラル再生" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "ヶ月" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "ムード" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "ムードバーの形式" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "ムードバー" #: library/library.cpp:74 msgid "Most played" msgstr "最も再生している" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "マウントポイント" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "マウントポイント" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "下へ移動" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "ライブラリへ移動..." #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "上へ移動" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "ミュージック" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "ミュージックライブラリ" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "ミュート" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "マイ Last.fm ライブラリ" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "マイ Last.fm ミックスラジオ" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "マイ Last.fm のご近所さん" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "マイ Last.fm のおすすめラジオ" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "マイミックスラジオ" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "マイミュージック" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "ご近所さん" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "ラジオ局" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "おすすめ" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "名前" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "名前のオプション" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "ご近所さんたち" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "ネットワーク" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "ネットワークプロキシ" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "なし" #: library/library.cpp:67 msgid "Never played" msgstr "再生したことがない" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "再生を開始しない" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "新しいフォルダー" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "新しいプレイリスト" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "新しいスマートプレイリスト..." #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "新しい曲" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "新しいトラックは自動的に追加されます。" #: library/library.cpp:80 msgid "Newest tracks" msgstr "最新のトラック" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "次へ" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "次のトラック" #: core/utilities.cpp:147 msgid "Next week" msgstr "次週" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "アナライザーがありません" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "背景画像なし" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:366 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "見つかりません。再びプレイリスト全体を表示するには検索ボックスをクリアします。" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "なし" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "デバイスへのコピーに適切な曲が選択されていません" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "ダイナミック プレイリストの使用中は利用できません" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "接続されていません" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "内容が足りません" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "ファンが足りません" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "メンバーが足りません" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "ご近所さんが足りません" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "未インストール" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "ログインしていません" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "マウントされていません - マウントするにはダブルクリックします" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "通知の種類" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "通知" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "再生中" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "OSD のプレビュー" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "%1 をブラウザーで開く" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "オーディオ CD を開く(&A)..." #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "OPML ファイルを開く" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "OPML ファイルを開く..." #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "デバイスを開く" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "ファイルを開く..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "Google Drive で開く" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "新しいプレイリストで開く" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "開く..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "操作が失敗しました" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "ビットレートを最適化" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "品質を最適化" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "オプション..." #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "ファイルの整理" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "ファイルの整理..." #: core/organise.cpp:65 msgid "Organising files" msgstr "ファイルの整理中" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "元のタグ" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "その他のオプション" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "出力のオプション" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "既存のファイルを上書きする" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "所有者" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "Jamendo カタログの分析中" #: ui/equalizer.cpp:124 msgid "Party" msgstr "Party" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "パスワード" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "一時停止" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "再生を一時停止します" #: widgets/osd.cpp:156 msgid "Paused" msgstr "一時停止中" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "プレーンサイドバー" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "再生" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "アーティストまたはタグの再生" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "アーティストラジオの再生..." #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "再生回数" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "カスタムラジオの再生..." #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "停止中は再生し、再生中は一時停止します" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "再生中の曲がない場合は再生する" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "タグラジオの再生..." #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "プレイリストの 番目のトラックを再生する" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "再生・一時停止" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "再生" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "プレーヤーのオプション" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "プレイリスト" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "プレイリストが完了しました" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "プレイリストのオプション" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "プレイリストの種類" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "プレイリスト" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "ブラウザーを閉じて Clementine に戻ってください。" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "プラグインの状態:" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "ポッドキャスト" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Pop" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "人気の曲" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "今月人気の曲" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "今日人気の曲" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "ポップアップの長さ" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "ポート" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "プリアンプ" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "環境設定" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "環境設定..." #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "優先するアルバムアートのファイル名 (コンマ区切り)" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "優先するオーディオ形式" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "優先するビットレート" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "優先する形式" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "プレミアムのオーディオの種類" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "プリセット:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "使用するボタンの組み合わせを押してください:" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "キーを押してください" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "%1 に使用するキーの組み合わせを押してください..." #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "Pretty OSD のオプション" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "プレビュー" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "前へ" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "前のトラック" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "バージョン情報を出力" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "プロファイル" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "進行状況" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 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:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "品質" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "デバイスを照会しています..." #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "キューマネージャー" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "選択されたトラックをキューに追加" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "トラックをキューに追加" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "ラジオ (すべてのトラックで均一の音量)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "ラジオ" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "Rain" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "ランダムなビジュアライゼーション" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "現在の曲を星 0 つと評価します" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "現在の曲を星 1 つと評価します" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "現在の曲を星 2 つと評価します" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "現在の曲を星 3 つと評価します" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "現在の曲を星 4 つと評価します" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "現在の曲を星 5 つと評価します" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "評価" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "本当に取り消しますか?" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "更新" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "カタログの更新" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "チャンネルの更新" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "友だち一覧の更新" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "局の一覧の更新" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "ストリームの更新" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Reggae" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "Wii リモコンのスイングを記憶する" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "最後から記憶する" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "削除" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "アクションの削除" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "重複するものをプレイリストから削除" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "フォルダーの削除" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "マイミュージックから削除する" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "お気に入りから削除する" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "プレイリストから削除" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "マイミュージックから曲を削除しています" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "お気に入りから曲を削除しています" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "\"%1\" プレイリストの名前を変更" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "Grooveshark のプレイリストの名前を変更" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "プレイリストの名前の変更" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "プレイリストの名前の変更..." #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "この順序でトラック番号を振る..." #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "リピート" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "アルバムをリピート" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "プレイリストをリピート" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "トラックをリピート" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "現在のプレイリストを置き換える" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "プレイリストを置き換える" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "スペースをアンダースコアに置換する" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "リプレイゲイン" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "再装着" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "リセット" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" 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:206 msgid "Restrict to ASCII characters" msgstr "ASCII 文字に限定する" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "Grooveshark のマイミュージックの曲を取得中" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "Grooveshark のお気に入りの曲を取得中" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "Grooveshark のプレイリストを取得中" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "Clementine に戻る" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "ロック" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "実行" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "SOCKS プロキシ" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "デバイスを安全に取り外す" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "コピー後にデバイスを安全に取り外す" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "サンプルレート" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "サンプルレート" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "カバーアートの保存" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "カバーをディスクに保存..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "画像の保存" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "プレイリストの保存" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "プレイリストの保存..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "プリセットの保存" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "このストリームを [インターネット] タブに保存する" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "トラックの保存中" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "スコア" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "聴取するトラックを Scrobble する" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "検索" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "Icecast 局の検索" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "Jamendo の検索" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Magnatune の検索" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "アルバムカバーの検索..." #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "gpodder.net を検索" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "iTunes を検索" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "検索モード" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "検索オプション" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "検索結果" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "検索条件" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "Grooveshark を検索中" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "第 2 階層" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "後方へシーク" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "前方へシーク" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "現在再生中のトラックを相対値でシークする" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "現在再生中のトラックの絶対的な位置へシークする" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "すべて選択" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "選択しない" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "背景色の選択:" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "背景画像の選択" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "前景色の選択:" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "ビジュアライゼーションの選択" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "ビジュアライゼーションの選択..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "シリアル番号" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "サービスがオフラインです" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "%1 を \"%2\" に設定します..." #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "音量を パーセントへ設定しました" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "すべての選択されたトラックの音量を設定しました..." #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "ショートカット" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "%1 のショートカット" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "%1 のショートカットは既に存在します" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "表示" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "OSD の表示" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "現在のトラックを光らせるアニメーションを表示する" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "ネイティブのデスクトップ通知を表示する" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "リピート・シャッフルモードの変更時に通知を表示する" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "音量の変更時に通知を表示する" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "システムトレイからポップアップを表示する" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "Pretty OSD を表示する" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "ステータスバーの上に表示" #: ui/mainwindow.cpp:460 msgid "Show all songs" msgstr "すべての曲を表示" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "すべての曲を表示" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show cover art in library" msgstr "ライブラリにカバーアートを表示" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "区切りを表示する" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "原寸表示..." #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "ファイルブラウザーで表示..." #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "さまざまなアーティストに表示" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "重複するものだけ表示" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "タグのないものだけ表示" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "検索のおすすめを表示する" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "\"Love\" および \"はじき出す\" ボタンを表示する" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "scrobble ボタンをメインウィンドウに表示する" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "トレイアイコンを表示する" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "有効および無効になっているソースを表示" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "表示・非表示の切り替え" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "シャッフル" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "アルバムをシャッフル" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "すべてシャッフル" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "プレイリストのシャッフル" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "このアルバムのトラックをシャッフル" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "サインイン" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "サインアウト" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "サインインしています..." #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "テイストの似たアーティスト" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "プレイリストで後ろにスキップ" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "スキップ回数" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "プレイリストで前にスキップ" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "小さいアルバムカバー" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "小さいサイドバー" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "スマートプレイリスト" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "スマートプレイリスト" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "曲の情報" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "曲の情報" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "Sonogram" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "申し訳ありません" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "ジャンルで整列 (アルファベット順)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "ジャンルで整列 (人気順)" #: ../bin/src/ui_icecastfilterwidget.h:77 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 "並べ替え中" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "ソース" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "ソース" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "Spotify ログインエラー" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "Spotify プラグイン" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "Spotify プラグインはインストールされていません" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "標準" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "現在再生中のプレイリストを開始する" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "トランスコードの開始" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "この検索結果のリストを補完するには、上の検索ボックスに何か入力してください。" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "%1 の開始中" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "開始しています..." #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "局" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "停止" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "次で停止" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "このトラックで停止" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "再生の停止" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "現在のトラックで停止" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "停止しました" #: core/song.cpp:341 msgid "Stream" msgstr "ストリーム" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "ストリーミングのメンバーシップ" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "成功!" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "%1 の書き込みに成功しました" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "要約" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "最高 (%1 fps)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "最高 (2048x2048)" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "サポートされている形式" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "タブを上に配置" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "タグ" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "タグ取得ツール" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "タグラジオ" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "目標ビットレート" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "テクノ" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "文字のオプション" #: ui/about.cpp:70 msgid "Thanks to" msgstr "謝辞" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "コマンド \"%1\" は開始できませんでした。" #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "再生中の曲のアルバムカバー" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "ディレクトリ %1 は不正です" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "プレイリスト '%1' は空であるか読み込めませんでした。" #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "指定されたサイトは画像ではありません!" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "gpodder.net との通信に問題がありました" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Magnatune からのメタデータ取得に問題がありました" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "iTunes Store からの応答の分析に問題がありました" #: ui/organiseerrordialog.cpp:56 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:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "これらのファイルはデバイスから削除されます。続行してもよろしいですか?" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "These folders will be scanned for music to make up your library" msgstr "これらのフォルダーはライブラリを作成するためにスキャンされます" #: ../bin/src/ui_transcodersettingspage.h:174 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:151 msgid "Third level" msgstr "第 3 階層" #: internet/jamendoservice.cpp:171 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/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "このアルバムは要求されたフォーマットでは利用できません" #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Clementine がこのデバイスのサポートするファイル形式を認識する前にデバイスが接続されて開かれている必要があります。" #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "このデバイスは次のファイル形式をサポートしています:" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "このデバイスは適切に動作しません" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "このストリームは有料会員専用です" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "この種類のデバイスはサポートされていません: %1" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "タイムアウト" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "タイトル" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "Grooveshark のラジオを開始するには、まず始めに他の Grooveshark の曲をいくつか聴くとよいでしょう" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "今日" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "Pretty OSD の切り替え" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "全画面表示の切り替え" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "キュー状態の切り替え" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "scrobbling の切り替え" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "pretty OSD 表示の切り替え" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "明日" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "リダイレクトが多すぎます" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "合計転送バイト数" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "合計ネットワーク要求回数" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "トラック" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "ミュージックのトランスコード" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "トランスコーダーのログ" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "トランスコード" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "%2 個のスレッドを使用して %1 個のファイルをトランスコードしています" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "トランスコードのオプション" #: core/song.cpp:338 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "Turbine" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "オフにする" #: devices/giolister.cpp:161 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "URL" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "%1 をダウンロードできません (%2)" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "不明" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "不明なコンテンツタイプ" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "不明なエラー" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "カバーを未設定にする" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "購読解除" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "Grooveshark のプレイリストを更新" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "すべてのポッドキャストを更新" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "変更されたライブラリフォルダーを更新" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "Clementine の起動時にライブラリを更新する" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "このポッドキャストを更新" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "更新" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "%1 の更新中" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "更新しています %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "ライブラリの更新中" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "使用量" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "利用可能ならアルバムアーティストタグを使用する" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "Gnome のショートカットキーを使用する" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "利用可能ならリプレイゲインのメタデータを使用する" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "Wii リモコンの使用" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "カスタム色設定を使用する" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "通知にカスタムメッセージを使用する" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "認証を使用する" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "ビットレート管理エンジンを使用する" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "ダイナミックモードを使用する" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "Wii リモコンの状態の報告に通知を使用する" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "システム既定を使用する" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "システム既定の色設定を使用する" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "システムのプロキシ設定を使用する" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "音量の正規化を使用する" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "使用中" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "ユーザー %1 には Grooveshark Anywhere のアカウントがありません。" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "ユーザーインターフェース" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "ユーザー名" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "メニューから曲を追加した場合..." #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "可変ビットレート" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "さまざまなアーティスト" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "バージョン %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "表示" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "ビジュアライゼーションモード" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "ビジュアライゼーション" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "ビジュアライゼーションの設定" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "音量 %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "ウェブサイト" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "週" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "Clementine の起動時" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "リストが空のとき..." #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "おすすめの検索..." #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii リモコン %1: アクティブになりました" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii リモコン %1: 接続されました" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii リモコン %1: バッテリーがありません (%2%) " #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii リモコン %1: 非アクティブになりました" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii リモコン %1: 切断されました" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii リモコン %1: バッテリーが少なくなりました (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "Wii リモコンデバイス" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "Windows Media オーディオ" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "このアルバムにある他の曲も さまざまなアーティスト に移動しますか?" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "全体の再スキャンを今すぐ実行しますか?" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "年" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "年 - アルバム" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "年" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "昨日" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "次のアルバムをダウンロードしようとしています" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "サインインしていません。" #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "%1 でサインインしています。" #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "サインインしています。" #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "ライブラリの曲を整理する方法を変更できます。" #: internet/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "アカウントがなくても無料で聴くことができますが、プレミアムメンバーは広告なしでより高音質で聴くことができます。" #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "バックグラウンドストリームを別のミュージックとして同時に聴くことができます。" #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "トラックは無料で Scrobble できますが、有料会員になると Clementine から Last.fm ラジオを配信できます。" #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "Grooveshark Anywhere のアカウントがありません。" #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Spotify のプレミアムアカウントがありません。" #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Spotify からログアウトしました。設定ダイアログでパスワードを再入力してください。" #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Spotify からログアウトしました。パスワードを再入力してください。" #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "このトラックは Love されています" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "Clementine でグローバルショートカットを使用するには [システム環境設定] を起動して \"補助装置にアクセスできるようにする\" をオンにする必要があります。" #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "言語を変更するには Clementine の再起動が必要です。" #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Last.fm の認証情報が間違っています" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "Magnatune の認証情報が間違っています" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "ライブラリは空です!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "ラジオストリーム" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "Scrobble 回数: %1" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "システムが OpenGL をサポートしていないため、ビジュアライゼーションを利用できません。" #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "ユーザー名またはパスワードが間違っています。" #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Zero" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "%n 曲の追加" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "が次の値より後" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "前" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "と" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "自動" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "が次の値より前" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "が次の値の間" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "大きい順" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "が次を含む" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "無効" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "ディスク %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "が次を含まない" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "が次で終わる" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "が次に一致する" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "gpodder.net" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "gpodder.net ディレクトリ" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "が次より大きい" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "が次より小さい" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "長い順" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "%n 曲の移動" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "新しい順" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "が次と異なる" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "が次の値でない" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "古い順" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "が次の値" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "オプション" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "enter を押してください" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "%n 曲の削除" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "短い順" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "曲のシャッフル" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "小さい順" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "曲の並び替え" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "が次で始まる" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "停止" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "トラック %1" clementine-1.2.0+dfsg/src/translations/ka.po000066400000000000000000004020171223327513400210250ustar00rootroot00000000000000# 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-2013 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-16 19:57+0000\n" "Last-Translator: George Machitidze \n" "Language-Team: Georgian (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " კბწმ" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " მწმ" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " წამი" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " სიმღერა" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 ალბომი" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 დღე" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 დღის წინ" #: podcasts/gpoddersync.cpp:79 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 რეპერტუარი (%2)" #: playlist/playlistmanager.cpp:413 #, qt-format msgid "%1 selected of" msgstr "არჩეულია %1 სიმღერა" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1-დან" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1-დან" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "ნაპოვნია %1 სიმღერა" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "ნაპოვნია %1 სიმღერა (ნაჩვენებია %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 ჩანაწერი" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimotedev მოდული" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, qt-format msgid "%L1 other listeners" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "დამა&ტებითი" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "&დახმარება" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "&დამალვა %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "" #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "მარ&ცხენა" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "&მუსიკა" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "&ხელსაწყოები" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 დღე" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "%n ჩანაწერი" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 შემთხვევითი ჩანაწერი" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "" #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "Spotify-ის Premium ანგარიში აუცილებელია." #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:78 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:153 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "%1-ის შესახებ" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "Clementine-ის შესახებ..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "Qt-ის შესახებ..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "ანგარიშის დეტალები" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "მოქმედება" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Wiiremote-ის აქტივაცია/დეაქტივაცია" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "პოდკასტის დამატება" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "ნაკადის დამატება" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "მოქმედების დამატება" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "სხვა ნაკადის დამატება..." #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "დირექტორიის დამატება..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "ფაილის დამატება..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "გადასაკოდირებელი ფაილების დამატება" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "დასტის დამატება" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "დასტის დამატება..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "ახალი დასტის დამატება..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "პოდკასტის დამატება" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "პოდკასტის დამატება..." #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "ნაკადის დამატება..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "სხვა რეპერტუარში დამატება" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "რეპერტუარში დამატება" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "რიგში დამატება" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "დამატება..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "დაემატა ამ თვეში" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "დაემატა ემ კვირაში" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "დაემატა ამ წელს" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "დაემატა დღეს" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "დაემატა სამი თვის მანძილზე" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "კოპირების შემდეგ..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "ალბომი" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "ალბომი (იდეალური ხმის სიმაღლე ყველა ჩანაწერისთვის)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "ალბომის შემსრულებელი" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "ინფორმაცია ალბობის შესახებ jamendo.com-ზე..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "ალბომები ყდებით" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "ალბომები ყდების გარეშე" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "ყველა ფაილი (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "ყველა ალბომი" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "ყველა შემსრულებელი" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "ყველა ფაილი (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "ყველა რეპერტუარი (%1)" #: ui/about.cpp:74 msgid "All the translators" msgstr "ყველა თარჯიმანი" #: library/library.cpp:84 msgid "All tracks" msgstr "ყველა ჩანაწერი" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "მთავარი ფანჯრის ყოველთვის დამალვა" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "მთავარი ფანჯრის ყოველთვის ჩვენება" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "ყოველთვის დაიწყე დაკვრა" #: internet/spotifyblobdownloader.cpp:60 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:61 msgid "An error occurred loading the iTunes database" msgstr "" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:78 msgid "And:" msgstr "და:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "იერსახე" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "შემსრულებელი" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "შემსრულებლის ინფო" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "შემსრულებლის რადიო" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "შემსრულებლის ჭდეები" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "შემსრულებლის ინიციალი" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "აუდიოფორმატი" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "ავტენრიფიკაცი ვერ მოხერხდა" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "" #: ui/about.cpp:65 msgid "Authors" msgstr "ავტორები" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "ავტომატური" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "ავტომატურად განახლება" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "ხელმისაწვდომი" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "საშუალო ბიტური სიჩქარე" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "BBC-ის პოდკასტები" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "ფონური ნაკადები" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "ფონის ფერი" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "ფონის გაუმჭვირვალობა" #: core/database.cpp:734 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "ქცევა" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "საუკეთესო" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "ბიტური სიჩქარე" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "ბიტური სიჩქარე" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "ბლოკის ტიპი" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "ნუსხა..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "ღილაკები" #: core/song.cpp:339 msgid "CDDA" msgstr "" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "CUE sheet-ის მხარდაჭერა" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "გაუქმება" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "ალბომის ყდის შეცვლა" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "შრიფტის ზომის შეცვლა..." #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "გამეორების რეჯიმის შეცვლა" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "მალმხმობის შეცვლა..." #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "შემთხვევითი რეჟიმის შეცვლა" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "ენის შეცვლა" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "განახლებებზე შემოწმება..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "ავტომატურად არჩევა" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "აირჩიეთ ფერი..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "აირჩიეთ შრიფტი..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "აირჩიეთ სიიდან" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "" #: ui/equalizer.cpp:115 msgid "Classical" msgstr "კლასიკური" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "გასუფთავება" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "რეპერტუარის გასუფთავება" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Clementine-ის შეცდომა" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Clementine-ის ფორთოხალი" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Clementine-ის ვიზუალიზაცია" #: ../bin/src/ui_deviceproperties.h:376 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: internet/lastfmsettingspage.cpp:110 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 "" #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "ვიზუალიზაციის დაკეტვა" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "" #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:116 msgid "Club" msgstr "კლუბი" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "კომენტარი" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "ჭდეების ავტომატური შევსება" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "ჭდეების ავტომატური შევსება..." #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "კომპოზიტორი" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "" #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "Grooveshark-ის გამართვა..." #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Last.fm-ის გამართვა..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "Magnatune-ის გამართვა..." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "მალმხმობების გამართვა" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "Spotify-ის გამართვა..." #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "ბიბლიოთეკის გამართვა..." #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "" #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "გამართვა..." #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "" #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:64 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: transcoder/transcoder.cpp:432 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "" #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "ცეკვა" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "შექმნის თარიღი" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "ცვლილების თარიღი" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "დღე" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "ხმის 4%-ით შემცირება" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "ხმის შემცირება" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "ნაგულისხმები" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "დაყოვნება ვიზუალიზაციებს შორის" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "ფაილების წაშლა" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "მოწყობილობიდან წაშლა..." #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "დისკიდან წაშლა..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "ორიგინალი ფაილების წაშლა" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "ფაილების წაშლა" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "დეტალები..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "მოწყობილობა" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "მოწყობილობის პარამეტრები" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "მოწყობილობის სახელი" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "მოწყობილობის პარამეტრები..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "მოწყობილობები" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "თქვენ გულისხმობდით" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "ციფრულად შემოტანილი" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "ციფრულად შემოტანილი პაროლი" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "პირდაპირი ინტერნეტკავშირი" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "დირექტორია" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "ხანგრძლივობის გათიშვა" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "გათიშული" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "დისკი" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "პარამეტრების ჩვენება" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "არ გაიმეორო" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "არ შეურიო" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "არ გაჩერდე!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "" #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "ამ ალბომის ჩამოტვირთვა" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "ამ ალბომის ჩამოტვირთვა..." #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "ჩამოტვირთვა..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "მეტამონაცემების ჩამოტვირთვა" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "ჭდის რედაქტირება..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "ჭდეების რედაქტირება" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "" #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "" #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "რედაქტირება..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "ეკვალაიზერის ჩართვა" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "კოდირების ძრავის ხარისხი" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "კოდირების რეჟიმი" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "მთელი კოლექცია" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "შეცდომა" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "შეცდომა სიმღერების კოპირებისას" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "შეცდომა სიმღერების წაშლისას" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:63 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "ფაილები" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "" #: core/song.cpp:328 msgid "Flac" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:43 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "" #: core/database.cpp:673 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "ინტერნეტი" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "" #: internet/lastfmservice.cpp:437 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:154 msgid "Last.fm password" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "ბიბლიოთეკა" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "" #: ui/equalizer.cpp:123 msgid "Live" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "" #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "" #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "" #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "შეყვარება" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "" #: core/song.cpp:330 msgid "MPC" msgstr "" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "" #: library/library.cpp:74 msgid "Most played" msgstr "" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "მუსიკა" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "გაჩუმება" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "" #: library/library.cpp:67 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:80 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "შემდეგი ჩანაწერი" #: core/utilities.cpp:147 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:366 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "&აუდიო CD-ის გახსნა..." #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "ფაილის გახსნა..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "" #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "" #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "ფაილების ორგანიზება" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "ფაილების ორგანიზება..." #: core/organise.cpp:65 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "არსებული ფაილების შეცვლა" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:124 msgid "Party" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "" #: widgets/osd.cpp:156 msgid "Paused" msgstr "" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "დაკვრა" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "" #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "" #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "რეპერტუარი" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "რეპერტუარი დასრულდა" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "წინა ჩანაწერი" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" 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:206 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "" #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "ძებნა" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "ძებნის რეჟიმი" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "" #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:460 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "" #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "" #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "ინფორმაცია სიმღერაზე" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "ინფორმაცია" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 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 "" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "" #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "გაჩერება" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "" #: core/song.cpp:341 msgid "Stream" msgstr "" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "" #: ui/about.cpp:70 msgid "Thanks to" msgstr "" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "" #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:56 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:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:174 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:151 msgid "Third level" msgstr "" #: internet/jamendoservice.cpp:171 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "" #: core/song.cpp:338 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "" #: devices/giolister.cpp:161 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "ყველა პოდკასტის განახლება" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "" #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "" #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "" #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "გაჩერერება" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "" clementine-1.2.0+dfsg/src/translations/kk.po000066400000000000000000003723161223327513400210470ustar00rootroot00000000000000# 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" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:08+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Kazakh (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr " күн" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " мсек" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " сек" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 күн" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "" #: podcasts/gpoddersync.cpp:79 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "" #: playlist/playlistmanager.cpp:413 #, qt-format msgid "%1 selected of" msgstr "" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, qt-format msgid "%L1 other listeners" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n сәтсіз" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n аяқталған" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "Таң&дауыңызша" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "&Көмек" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "%1 жасыру" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "Жа&сыру..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Сол жақ" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "Му&зыка" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Ешнәрсе" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Шығу" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Оң жақ" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "Са&ймандар" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 күн" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 трек" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "" #: library/library.cpp:60 msgid "50 random tracks" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "" #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:78 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:153 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "A-Z" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "%1 туралы" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "" #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "Qt туралы..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Әрекет" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "" #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "" #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "Файлды қосу" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Файлды қосу..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Буманы қосу" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Буманы қосу..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "" #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "" #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Қосу..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "Кейін" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "" #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Альбом" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Альбом әртісі" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "" #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Барлық файлдар (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "Барлық файлдар (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "" #: ui/about.cpp:74 msgid "All the translators" msgstr "" #: library/library.cpp:84 msgid "All tracks" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "" #: internet/spotifyblobdownloader.cpp:60 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:61 msgid "An error occurred loading the iTunes database" msgstr "" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:78 msgid "And:" msgstr "Және:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "Ашулы" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Сыртқы түрі" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Орындайтын" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Аутентификация сәтсіз" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "Авторы" #: ui/about.cpp:65 msgid "Authors" msgstr "Авторлары" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Авто" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "Қолжетерлік" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Фон түсі" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "Фон суреті" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "" #: core/database.cpp:734 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Мінез-құлығы" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Шолу..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Батырмалар" #: core/song.cpp:339 msgid "CDDA" msgstr "" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "Бас тарту" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Қарiп өлшемiн өзгерту..." #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "" #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "Жаңа эпизодтарға тексеру" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Жаңартуларға тексеру..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "Қаріпті таңдау..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "" #: ui/equalizer.cpp:115 msgid "Classical" msgstr "Классикалық" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Тазарту" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: internet/lastfmsettingspage.cpp:110 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 "" #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "" #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:116 msgid "Club" msgstr "Клубтық" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Colors" msgstr "Түстер" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Түсіндірме" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "" #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Композитор" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "%1 баптау..." #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "" #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "" #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "" #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "" #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "" #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "Баптау..." #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "Алмасу буферіне көшіру" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "" #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "Copyright" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:64 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: transcoder/transcoder.cpp:432 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "Таңдауыңызша" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Таңдауыңызша..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Билеу" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Жасалған күні" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Түзетілген күні" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "Күн" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "Ба&стапқы" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "Өшіру" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Файлдарды өшіру" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "" #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "Ойналған эпизодтарды өшіру" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Файлдарды өшіру" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Мақсаты" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Көбірек..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Құрылғы" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Құрылғы аты" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "" #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Құрылғылар" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "Тікелей интернет байланысы" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Бума" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Сөндірулі" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Диск" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "" #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "%n эпизодты жүктеп алу" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "" #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "Жүктеп алу..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "Жүктелуде (%1%)..." #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "" #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "" #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "" #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Түзету..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Қате" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:63 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "Жаю" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "Жылдам" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "Таңдамалы" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "Файл кеңейтілуі" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Файл аты" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Файл өлшемі" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Файл түрі" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Файл аты" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Файлдар" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "Аяқтау" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "Бiрiншi деңгей" #: core/song.cpp:328 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Қаріп өлшемі" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Форма" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "Пішімі" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Достар" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "Жалпы" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Жалпы баптаулары" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Жанры" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "Өту" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "Қалайша топтау" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "Бақытты" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "Жоғары" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "Сағат" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Таңбаша" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:43 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "Ақпарат" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "Кірістіру..." #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Орнатылған" #: core/database.cpp:673 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Интернет" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Пішімі қате" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Тіл" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "" #: internet/lastfmservice.cpp:437 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:154 msgid "Last.fm password" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Ұзындығы" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Жинақ" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "" #: ui/equalizer.cpp:123 msgid "Live" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Жүктеу" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "" #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "Ойнату тізімін жүктеу" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "Ойнату тізімін жүктеу..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "Жүктелуде..." #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Кіру" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "Қолмен" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "Шығарушы" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "Жаңа етіп белгілеу" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "Модель" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "Көңіл-күй" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "" #: library/library.cpp:74 msgid "Most played" msgstr "" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "Тіркеу нүктесі" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "Төмен жылжыту" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "Жоғары жылжыту" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "Музыка" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "Дыбысын басу" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Аты" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "Желі" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "Ешқашан" #: library/library.cpp:67 msgid "Never played" msgstr "Бұрын ойналмаған" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "Жаңа бума" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "Жаңа ойнату тізімі" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:80 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "Келесі" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "" #: core/utilities.cpp:147 msgid "Next week" msgstr "Келесі аптада" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:366 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "Жоқ" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "Қалыпты" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Хабарламалар" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Қазір ойналуда" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "Мөлдірсіздік" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "" #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "Файлды ашу..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Ашу..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "Әрекет сәтсіз" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "Опциялар..." #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "" #: core/organise.cpp:65 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Басқа опциялар" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "Иесі" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:124 msgid "Party" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "Пароль" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Аялдату" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "Ойнатуды аялдату" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Аялдатылған" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "Орындайтын" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Ойнату" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "" #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "" #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Ойнату үрдісі" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "Подкасттар" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Поп" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "Порт" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "Баптаулар" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "Баптаулар..." #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "Алдын-ала қарау" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "Алдыңғы" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "Профиль" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "Барысы" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "Сапасы" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "Рейтинг" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "Жаңарту" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Регги" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Өшіру" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "Буманы өшіру" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "Таңдамалылардан өшіру" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "\"%1\" ойнату тізімінің атын ауыстыру" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "Ойнату тізімінің атын ауыстыру" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "Ойнату тізімінің атын ауыстыру..." #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Қайталау" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "Тастау" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" 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:206 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Рок" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "Орындау" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "Дискреттеу жиілігі" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "Суретті сақтау" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "Ойнату тізімін сақтау" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "Ойнату тізімін сақтау..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "Баптауды сақтау" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "Нәтиже" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "Іздеу" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "Барлығын таңдау" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "Ештеңе таңдамау" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "Фон суретін таңдаңыз" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "" #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Жарлық" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Көрсету" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:460 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "" #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "" #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "Альбомдарды араластыру" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "Кіру" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "Шығу" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ска" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 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 "Сұрыптау" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "Қайнар көзі" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "Қайнар көздер" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "Қалыпты" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "%1 іске қосылу" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "Іске қосылу..." #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Тоқтату" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Ойнатуды тоқтату" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "Тоқтатылған" #: core/song.cpp:341 msgid "Stream" msgstr "Ағындық" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "Сәтті!" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "Ақпарат" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Тег" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Техно" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Алғыстар" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "" #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:56 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:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:174 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:151 msgid "Third level" msgstr "" #: internet/jamendoservice.cpp:171 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Аталуы" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "Бүгін" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Толық экранға өту/шығу" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "Ертең" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Трек" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "" #: core/song.cpp:338 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "Сөндіру" #: devices/giolister.cpp:161 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "URL(s)" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "%1 (%2) жүктеп алу мүмкін емес" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Белгісіз" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Белгісіз қате" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "Жазылудан бас тарту" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "Жаңартуда" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "%1 жаңарту" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "%1% жаңарту..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Жинақты жаңарту" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "Қолданылуы" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "Аутентификацияны қолдану" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "Жүйе негізгілерін қолдану" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "Қолдануда" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "Пайдаланушы интерфейсі" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Пайдаланушы аты" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "%1 нұсқасы" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "Түрі" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "%1% бөлімі" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "Веб сайт" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "Шығ. жылы" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "Кеше" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "" #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "" #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "" #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Нөл" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "кейін" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "бұрын" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "және" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "автоматты түрде" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "дейін" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "құрамында бар" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "сөндірулі" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "диск %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "gpodder.net" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "опциялар" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "" clementine-1.2.0+dfsg/src/translations/ko.po000066400000000000000000004512071223327513400210500ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # 며소 <>, 2012 # 사월 <>, 2012 # 현구 임 , 2012 # 현구 임 , 2012 # FIRST AUTHOR , 2011 # 현구 임 , 2012 # kladess , 2013 # Thomas Min , 2013 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:08+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Korean (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr "일" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " pt" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " 초" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " 노래" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1개 앨범" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1일" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1일 전" #: podcasts/gpoddersync.cpp:79 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 재생목록 (%2)" #: playlist/playlistmanager.cpp:413 #, qt-format msgid "%1 selected of" msgstr "다음 중 %1개 선택됨" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1개 노래" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1개 노래" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1개 노래 찾음" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1개 노래 찾음 (%2개 표시 중)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1개 트랙" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 이동함" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wii 리모컨 모듈" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n 실패함" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n 끝냄" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "사용자 정의(&C)" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "효과음(&E)" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "도움말(&H)" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "%1 숨김(&H)" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "숨기기(&H)..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "왼쪽(&L)" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "음악(&M)" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "없음(&N)" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "재생목록(&P)" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "종료(&Q)" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "반복 모드(&R)" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "오른쪽(&R)" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "셔플 모드(&S)" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "창 크기에 맞게 글자열 넓히기(&S)" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "도구(&T)" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(전반적으로 다양한 곡)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "...그리고 Amarok에 기여해 주신 모든 분들" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "0px" #: core/utilities.cpp:108 msgid "1 day" msgstr "1일" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1개 트랙" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "127.0.0.1" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "40%" #: library/library.cpp:60 msgid "50 random tracks" msgstr "무작위 50개 트랙" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "프리미엄으로 업그레이드하기" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "그루브샤크 Anywhere 계정이 필요합니다." #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "스포티피 프리미엄 계정이 필요합니다." #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:78 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:153 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "노래가 이러한 조건과 일치하면 재생 목록에 포함됩니다." #: smartplaylists/searchterm.cpp:297 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "HYPNOTOAD에 모든 영광을" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "중단" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "%1 정보" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "클레멘타인 정보" #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "Qt 정보" #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "계정 정보" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "계정 상세정보 (프리미엄)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "동작" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Wii 리모컨 사용/중지" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "팟케스트 추가" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "스트림 추가" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "알림 형식이 지원한다면 새로운 줄 추가" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "동작 추가" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "다른 스트림 추가..." #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "디렉토리 추가..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "파일 추가" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "파일 추가..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "변환할 파일 추가" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "폴더 추가" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "폴더 추가..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "새로운 폴더 추가..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "팟케스트 추가" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "팟케스트 추가..." #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "검색 조건 추가" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "앨범 태그 추가" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "앨범 가수 태그 추가" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "가수 태그 추가" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "자동 점수 추가" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "작곡가 태그 추가" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "음악 디스크 태그 추가" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "음악 파일명 추가" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "장르 태그 추가" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "음악 그룹화 태그 추가" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "노래 길이 태그 추가" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "음악 연주가 태그 추가" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "재생 횟수 추가" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "음악 등급 추가" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "무시 횟수 추가" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "제목 태그 추가" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "트랙 태그 추가" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "연도 태그 추가" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "스트림 추가..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "그루브샤크 즐겨찾기에 추가" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "그루브샤크 재생목록에 추가" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "다른 재생목록에 추가" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "재생목록에 추가" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "대기열에 추가" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Wii 리모컨 동작 추가" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "추가..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "이번 달에 추가됨" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "이번 주에 추가됨" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "올해 추가됨" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "오늘 추가됨" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "3개월 이내에 추가됨" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "내 음악에 음악 추가" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "즐겨찾기에 곡 추가" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "고급 그룹화..." #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "이후" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "복사 한 후...." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "앨범" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "앨범 (모든 트랙에 이상적인 음량)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "앨범 가수" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "앨범 표지" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "자멘도 앨범 정보..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "앨범 표지가 있는 앨범" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "앨범 표지가 없는 앨범" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "모든 파일 (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "Hypnotoad에 모든 영광을!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "모든 앨범" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "모든 음악가" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "모든 파일 (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "전체 재생목록 (%1)" #: ui/about.cpp:74 msgid "All the translators" msgstr "모든 번역가" #: library/library.cpp:84 msgid "All tracks" msgstr "모든 트랙" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "미드/사이드 인코딩 적용" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "원본과 함께" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "항상 메인 창 숨기기" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "항상 메인 창 표시함" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "항상 재생 시작" #: internet/spotifyblobdownloader.cpp:60 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "클레멘타인엔서 스포티피를 이용하시려면 추가 플러그인이 있어야 합니다. 지금 설치하시겠습니까?" #: devices/gpodloader.cpp:61 msgid "An error occurred loading the iTunes database" msgstr "iTunes 데이터베이스를 불러오는 중 오류 발생" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "'%1'에 메타데이터를 쓰던 중 오류 발생" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "지정되지 않은 에러가 발생" #: ui/about.cpp:78 msgid "And:" msgstr "그리고:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "화난" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "외형" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "재생목록에 파일/URL 추가" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "현재 재생목록에 추가" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "재생목록에 추가" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "클리핑 방지를 위한 압축 적용" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "\"%1\" 프리셋을 정말 지우시겠습니까?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "이 재생목록을 지우시겠습니까?" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "이 곡의 통계를 초기화하시겠습니까?" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "음악가" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "음악가 정보" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "음악가 라디오" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "음악가 태그" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "음악가 이니셜" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "오디오 형식" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "인증 실패" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "작성자" #: ui/about.cpp:65 msgid "Authors" msgstr "작성자" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "자동" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "자동 업데이트" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "라이브러리 트리에 자동으로 하나의 카테고리로 열기" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "이용 가능" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "평균 비트 전송률" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "평균 이미지 크기" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "BBC 팟케스트" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "백그라운드 스트림" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "배경 색상" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "배경 그림" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "배경 투명도" #: core/database.cpp:734 msgid "Backing up database" msgstr "데이터베이스 백업" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "밸런스" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "싫어요" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "막대" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "기본 파랑" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "기본 오디오 형식" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "행동" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "최고" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "%1의 바이오그래피" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "비트 전송률" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "비트 전송률" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "블록" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "블록 형식" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "블러 정도" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "붐" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "찾아보기..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "버퍼 시간" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "버퍼링" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "하지만 다음 출처는 사용할 수 없습니다:" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "버튼" #: core/song.cpp:339 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "큐 시트 지원" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "취소" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "커버 아트 바꾸기" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "글꼴 크기 바꾸기..." #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "반복 모드 " #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "단축키 바꾸기..." #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "셔플 모드 " #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "언어 변경" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "새로운 에피소드 확인" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "업데이트 확인..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "스마트 재생목록에 이름 추가" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "자동 선택" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "색상 선택..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "글꼴 선택..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "목록에서 선택" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "재생목록의 정렬 방식과 최대 곡수를 선택하세요." #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "팟케스트 다운로드 경로를 선택하세요" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "클레멘타인이 가사를 찾기위해 이용할 사이트를 선택하세요." #: ui/equalizer.cpp:115 msgid "Classical" msgstr "클래식" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "자동 정리" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "비우기" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "재생목록 비우기" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "클레멘타인" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "클레멘타인 오류" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "클레멘타인 오렌지" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "클레멘타인 시각화" #: ../bin/src/ui_deviceproperties.h:376 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "클레멘타인은 이 장치에서 복사한 곡을 재생 가능한 형식으로 자동 변환할 수 있습니다." #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "클레멘타인은 당신이 Box에 업로드한 음악을 재생할 수 있습니다." #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "클레멘타인은 당신이 드롭박스에 업로드한 음악을 재생할 수 있습니다." #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "클레멘타인은 당신이 구글 드라이브에 업로드한 음악을 재생할 수 있습니다." #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "클레멘타인은 당신이 우분투 원에 업로드한 음악을 재생할 수 있습니다." #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "클레멘타인은 트랙이 변할 때 메시지를 표시할 수 있습니다." #: ../bin/src/ui_podcastsettingspage.h:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "클레멘타인은 당신의 다른 컴퓨터와 팟케스트 어플리케이션과 당신의 구독 목록을 동기화 할 수 있습니다. 계정을 만드세요." #: visualisations/projectmvisualisation.cpp:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "클레멘타인은 프로젝트M 시각화를 불러올 수 없습니다. 클레멘타인이 제대로 설치되었는지 확인해 보세요." #: internet/lastfmsettingspage.cpp:110 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 "연결에 문제가 있어서 클레멘타인이 당신의 가입 정보를 가져올 수 없습니다. 재생중인 트랙은 캐시로 저장되고 나중에 Last.fm에 보낼 것입니다." #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "클레멘타인 이미지 뷰어" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "클레멘타인은 이 파일의 결과를 검색할 수 없습니다" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "클레멘타인이 음악을 찾을 수 있습니다." #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "음악을 추가하려면 여기를 클릭하세요" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "남은 시간과 전체 시간을 바꾸려면 클릭하세요" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "재생목록 닫기" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "시각화 닫기" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "이 창을 닫으면 다운로드가 취소됩니다." #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "이 창을 닫으면 앨범 표지 검색이 중지됩니다." #: ui/equalizer.cpp:116 msgid "Club" msgstr "클럽" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Colors" msgstr "색상" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "콤마로 클래스:단계의 목록을 나눔, 단계는 0-3" #: playlist/playlist.cpp:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "설명" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "자동으로 태그 저장" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "자동으로 태그 저장..." #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "작곡가" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "%1 설정..." #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "그루브샤크 설정..." #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Last.fm 설정..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "매그나튠 설정..." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "단축키 설정" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "스포티피 설정..." #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "서브소닉 설정" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "글로벌 검색 설정..." #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "라이브러리 설정..." #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "팟케스트 설정..." #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "설정..." #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "사용/중지 실행으로 Wii 리모컨 연결" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "장치 연결" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "스포티피에 연결 중" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "콘솔" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "순간 비트 전송률" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "모든 곡 변환" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "장치가 재생할 수 없는 곡 변환" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "클립보드로 복사" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "장치에 복사..." #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "라이브러리에 복사..." #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "저작권" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "서브소닉에 접속할 수 없습니다. 서버 URL을 확인 하세요. 예시:http://localhost:4040/" #: transcoder/transcoder.cpp:64 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "GStreamer 요소 \"%1\"를 찾을 수 없습니다 - 필요한 모든 GStreamer 플러그인이 설치되어 있는지 확인하세요" #: transcoder/transcoder.cpp:432 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "%1 먹서를 찾을 수 없습니다, GStreamer 플러그인이 올바르게 설치되어 있는지 확인하세요" #: transcoder/transcoder.cpp:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "%1 인코더를 찾을 수 없습니다, GStreamer 플러그인이 올바르게 설치되어 있는지 확인하세요" #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "last.fm 라디오 방송국을 불러올 수 없습니다" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "출력 파일 %1를 열 수 없습니다" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "커버 관리자" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "내장된 이미지로부터 커버 아트 사용" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "%1에서 자동으로 커버 아트를 불러옴" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "커버 아트를 수동으로 설정하지 않음" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "커버 아트를 설정하지 않음" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "%1에서 커버 아트를 설정함" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "%1에서 커버" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "새로운 그루브샤크 재생목록 만들기" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "트랙을 자동으로 바꿀 때 크로스-페이드" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "트랙을 직접 바꿀 때 크로스-페이드" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "사용자 정의" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "사용자 정의 이미지:" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "사용자 정의 메시지 설정" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "사용자 정의 라디오" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "사용자 정의..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "DBus 경로" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "댄스" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "생성한 날짜" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "수정한 날짜" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "일" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "기본값(&f)" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "4% 단위로 음량 줄이기" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "% 단위로 음량 줄이기" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "음량 줄이기" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "기본 배경 그림" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "기본값" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "시각화 사이의 시간 간격" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "삭제" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "그루브샤크 재생목록 지우기" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "다운로드된 데이터 삭제" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "파일 삭제" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "장치에서 삭제..." #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "디스크에서 삭제..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "재생된 에피소드 삭제" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "프리셋 삭제" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "스마트 재생목록 지우기" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "원본 파일 삭제" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "파일 삭제 중" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "선택한 트랙을 대기열에서 해제" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "트랙을 대기열에서 해제" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "대상" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "세부 내용..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "장치" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "장치 속성" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "장치 이름" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "장치 속성..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "장치" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "이것을 원하셨습니까" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "디지탈리 임포티드" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "디지탈리 임포티드 비밀번호" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "디지탈리 임포티드 사용자명" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "직접 인터넷 연결" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "디렉토리" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "분위기 막대 생성 " #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "사용 안함" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "디스크" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "불연속적인 전송" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "옵션 표시" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "OSD 표시" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "전체 라이브러리 다시 읽기" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "어떤 곡도 변환하지 않기" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "반복하지 않기" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "다양한 음악가에 표시하지 않기" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "섞지 않기" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "멈추지 마세요!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "기부" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "열려면 더블클릭하세요" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "노래를 더블클릭하면..." #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "에피소드 %n 다운로드" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "디렉토리 다운로드" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "에피스도 다운로드" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "멤버십 다운로드" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "자동으로 새로운 에피소드 다운로드" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "다운로드 대기열 추가됨" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "이 앨범 다운로드" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "이 앨범 다운로드..." #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "이 에피소드 다운로드" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "다운로드..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "다운로드 중 (%1%)..." #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "Icecast 디렉토리 다운로드 중" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "자멘도 카탈로그 다운로드 중" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "매그나튠 카탈로그 다운로드 중" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "스포티피 플러그인 다운로드 중" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "메타데이터 다운로드 중" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "재배치하려면 드래그하세요" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "드롭박스" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "다이나믹 모드가 켜졌습니다" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "다이나믹 랜덤 믹스" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "스마트 재생목록 편집..." #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "\"%1\" 태그 편집..." #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "태그 편집..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "태그 편집" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "트랙 정보 편집" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "트랙 정보 편집..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "트랙 정보 편집..." #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "편집..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "Wii 리모컨 모드 사용" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "이퀄라이저 사용" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "클레멘타인이 활성화 되었을 때에만 단축키 허용" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "검색 결과에 아래의 소스들을 포함시킵니다. 검색 결과는 다음의 순서대로 표시됩니다." #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "Last.fm 스크로블 켜기/끄기" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "인코딩 복잡도" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "인코딩 엔진 품질" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "인코딩 모드" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "URL 입력" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "인터넷에서 다운로드할 커버의 URL 주소를 입력하세요" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "새로운 재생목록 이름을 입력하세요" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Last.fm 라디오에서 듣고 싶은 음악가태그를 입력하세요." #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "당신의 컴퓨터와 인터넷에서 음악을 찾기위한 검색 조건을 입력하세요." #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "iTunes 스토어에서 팟케스트를 찾기 위한 검색 조건을 아래에 입력하세요." #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "gpodder.net에서 팟케스트를 찾기 위한 검색 조건을 아래에 입력하세요." #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "여기에 검색할 단어를 입력하세요" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "인터넷 라디오 스트림 URL 주소를 입력하세요" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "폴더의 이름 입력" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "클레멘타인에 연결하기 위한 앱에서 다음의 IP를 입력하세요." #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "전체 선택" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "오류" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "MTP 장치에 연결 오류" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "노래 복사 오류" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "노래 삭제 오류" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "스포티피 플러그인 다운로드 오류" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "%1 불러오기 오류" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "dl.fm 재생목록 불러오기 오류" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "%1: %2 처리 오류" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "오디오 CD 불러오기 오류" #: library/library.cpp:63 msgid "Ever played" msgstr "재생한 적 있음" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "매 10분" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "매 12시간" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "매 2시간" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "매 20분" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "매 30분" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "매 6시간" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "매 시간" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "같은 앨범이나 같은 큐 시트의 트랙 사이에선 제외" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "확장" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "만료 일자: " #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "커버 내보내기" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "커버 내보내기" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "다운로드된 커버 내보내기" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "내장된 커버 내보내기" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "내보내기 완료" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "일시정지시 페이드 아웃/ 다시시작시 페이드 인" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "트랙 정지 시 페이드 아웃" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "페이드 아웃" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "페이드 아웃 시간" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "팟케스트 가져오기 실패" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "팟케스트 열기 실패" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "RSS 피드를 위한 XML 파싱이 실패되었습니다." #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "빠른" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "좋아하는" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "좋아하는 트랙" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "누락된 커버 가져오기" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "자동으로 가져오기" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "가져오기 완료" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "서브소닉 라이브러리 가져오기" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "커버 가져오기 오류" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "파일 확장자" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "파일 " #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "파일 " #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "파일 이름 (경로 제외)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "파일 크기" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "파일 형태" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "파일 " #: ui/mainwindow.cpp:236 msgid "Files" msgstr "파일" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "변환할 파일들" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "라이브러리에서 지정한 기준과 일치하는 노래를 찾습니다." #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "노래 " #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "마침" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "첫 단계" #: core/song.cpp:328 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "글꼴 크기" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "강제 모노 인코딩" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "장치를 잃어버림" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "형식" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "형태" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "프레임레이트" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "프레임/" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "친구들" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "얼음" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "베이스 강화" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "베이스+고음 강화" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "고음 강화" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "G스트리머 오디오 엔진" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "일반 " #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "일반 " #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "장르" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "Grooveshark 재생목록을 공유하기 위한 URL 얻기" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr " Grooveshark 음악을 공유하기 위한 URL 얻기" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "그루브샤크에서 인기곡 가져오기" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "채널 " #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "스트림 " #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "이름 지정:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "Go" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "다음 재생목록 탭으로 가기" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "이전 재생목록 탭으로 가기" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "구글 드라이브" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "그루브샤크" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "그루브샤크 로그인 에러" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "Grooveshark 재생목록 URL" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "그루브샤크 라디오" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "그루브샤크 음악 URL" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "그룹 라이브러리..." #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "그룹" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "앨범에 의한 그룹" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "음악가에 의한 그룹" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "음악가/앨범에 의한 그룹" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "음악가/년도에 의한 그룹 - 앨범" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "장르/앨범에 의한 그룹" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "장르/음악가/앨범에 의한 그룹" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "그룹화" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "HTML 페이지가 어떠한 RSS 피드를 포함하지 않습니다." #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "HTTP " #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "행복" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "하드웨어 " #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "하드웨어 정보는 장치가 연결되어있는 동안에만 가능합니다." #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "높음" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "높음 (%1 fps)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "높음 (1024x1024)" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "시간" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "최면 두꺼비 대왕" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "매그나튠 계정을 가지고 있지 않습니다." #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "아이콘" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "상단에 아이콘" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "음악을 식별하는 " #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "팟케스트에 URL을 알고 있다면, 아래에 입력하고 버튼을 누르세요." #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "음악가 이름에서 \"The\" 제거" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "다이나믹 모드에서는 곡이 끝날 때마다 자동으로 재생목록에 곡이 추가됩니다." #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "알림에 앨범 아트 포함" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "모든 음악 포함" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "호환되지 않는 서브소닉 REST 프로토콜 버전입니다. 클라이언트를 업그레이드 해야만 합니다." #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "호환되지 않는 서브소닉 REST 프로토콜 버전입니다. 서버를 업그레이드 해야만 합니다." #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "4% 단위로 음량 올리기" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "% 단위로 음량 올리기" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "음량 올리기" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "색인 %1" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "정보" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "추가..." #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "설치 됨" #: core/database.cpp:673 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "인터넷" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "인터넷 " #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "잘못된 API " #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "잘못된 형식" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "잘못된 방법" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "잘못된 매개변수" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "잘못된 리소스가 지정되었습니다." #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "잘못된 서비스" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "잘못된 세션 키" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "잘못된 사용자명 또는(그리고) 비밀번호입니다." #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "자멘도" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "자멘도 가장 많이 들은 트랙" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "자멘도 최고의 트랙" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "자멘도 이 달의 최고 트랙" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "자멘도 금주의 최그 트랙" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "자멘도 데이터베이스" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "현재 재생 중인 트랙 건너뛰기" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "%1 초 동안 버튼 유지..." #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "%1 초 동안 버튼 유지..." #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "창을 닫을 때 백그라운드에서 계속 실행" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "원본 파일들 " #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "고양이" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Language" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "노트북/헤드폰" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "거대한 홀" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "큰 앨범 표지" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "큰 사이드바" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "마지막으로 재생됨" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "Last.fm 사용자 정의 라디오: %1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Last.fm 라이브러리 - %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "Last.fm 믹스 라디오 - %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Last.fm 이웃 라디오 - %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Last.fm 라디오 방송국 - %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Last.fm %1 와 유사한 음악가" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Last.fm 태그 라디오: %1" #: internet/lastfmservice.cpp:437 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm 이 현재 바쁩니다. 잠시 후 다시 시도해 주세요." #: ../bin/src/ui_lastfmsettingspage.h:154 msgid "Last.fm password" msgstr "Last.fm 비밀번호" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "Last.fm 재생 횟수" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Last.fm 태그" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Last.fm 사용자명" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Last.fm 위키" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "Last.fm 좋아하는 트랙" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "왼쪽" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "길이" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "라이브러리 " #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "향상된 그룹 " #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "라이브러리 재탐색 알림" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "라이브러리 " #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "제한" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "" #: ui/equalizer.cpp:123 msgid "Live" msgstr "라이브" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "열기" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "URL로 부터 커버 열기" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "URL로 부터 커버 열기..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "디스크로부터 커버 열기" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "디스크로부터 커버열기..." #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "재생목록 불러오기" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "재생목록 불러오기..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Last.fm 라디오 여는 중" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "MTP 장치 여는 중" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "iPod 데이터베이스 여는 중" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "스마트 재생목록 불러오기 중" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "음악 여는 중" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "스트림 여는 중" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "트랙 여는 중" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "트랙 정보 불러오는중" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "여는 중..." #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "현재 재생목록을 교체할 파일/URL 불러오기" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "로그인" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "로그인 실패" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "좋아요" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "낮음 (%1fps)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "낮음 (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "가사" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "%1 의 가사" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "매그나튠" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "매그나튠 다운로드" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "매그나튠 다운로드 완료됨" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "메인 프로필 (MAIN)" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "재생목록을 오프라인에서 재생 가능하도록 설정" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "수동 프록시 설정" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "수동적" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "제조회사" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "모든 검색조건 일치 (AND)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "하나 이상의 검색조건 일치 (OR)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "최고 비트 전송률" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "중간 (%1 fps)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "중간 (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "멤버쉽 유형" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "최저 비트 전송률" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "모형" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "라이브러리의 변화를 감지" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "모노 재생" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "개월" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "분위기" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "분위기 막대 " #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "분위기 막대" #: library/library.cpp:74 msgid "Most played" msgstr "자주 재생됨" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "마운트 지점" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "마운트 지점" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "아래로 이동" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "라이브러리로 이동..." #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "위로 이동" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "음악" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "음악 라이브러리" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "음소거" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "내 Last.fm 라이브러리" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "내 Last.fm 믹스 라디오" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "내 Last.fm 이웃들" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "내 Last.fm 추천 라디오" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "내 믹스 라디오" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "내 음악" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "내 이웃들" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "내 라디오 방송국" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "내 추천목록" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "이름" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "명명 옵션" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "협대역(NB)" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "이웃" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "네트워크" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "네트워크 프록시" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "네트워크 리모콘" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "" #: library/library.cpp:67 msgid "Never played" msgstr "재생한 적 없음" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "새 폴더" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "새로운 재생목록" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "새 스마트 재생목록" #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "새로운 음악" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "새로운 음악을 자동으로 추가함" #: library/library.cpp:80 msgid "Newest tracks" msgstr "새로운 트랙" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "다음" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "다음 트랙" #: core/utilities.cpp:147 msgid "Next week" msgstr "다음 주" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "없음" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "배경 그림 없음" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "내보낼수 있는 커버가 없습니다." #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:366 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "일치하는 결과를 찾을 수 없습니다. 검색창을 비우시면 전체 재생목록을 보실 수 있습니다." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "없음" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "일반" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "일반 블록 형식" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "다이나믹 재생목록을 사용 중일 때는 사용할 수 없습니다." #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "연결되지 않음" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "내용이 충분하지 않습니다." #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "팬이 충분하지 않습니다." #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "회원이 충분하지 않습니다." #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "이웃이 충분하지 않습니다." #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "설치되지 않음" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "로그인 되지 않음" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "마운트 되지 않음 - 마운트 하려면 더블클릭" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "알림 형태" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "알림" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "지금 재생중" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "OSD 미리보기" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "OGG Flac" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "투명도" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "브라우저에서 %1 열기" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "오디오 CD 열기(&a)..." #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "OPML 파일 열기" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "OPML 파일 열기" #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "장치 열기" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "파일 열기..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "구글 드라이브에서 열기" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "새로운 재생목록에서 열기" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "열기..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "작업이 실패됨" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "비트 전송률 최적화" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "음질 최적화" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "옵션..." #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "파일 정리" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "파일 정리..." #: core/organise.cpp:65 msgid "Organising files" msgstr "파일 정리 중..." #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "원본 태그" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "그 외 옵션" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "출력 장치" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "저장 옵션" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "출력 플러그인" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "모두 덮어쓰기" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "기존 파일들 " #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "소유자" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "자멘도 목록 구성 중" #: ui/equalizer.cpp:124 msgid "Party" msgstr "파티" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "비밀번호" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "일시중지" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "재생 일시중지" #: widgets/osd.cpp:156 msgid "Paused" msgstr "일시중지됨" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "연주가" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "픽셀" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "일반 사이드바" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "재생" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "음악가 또는 태그 재생" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "음악가 라디오 재생..." #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "재생 횟수" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "사용자 정의 라디오 재생..." #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "중지중일때 재생, 재생중일때 중지" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "이미 재생되는 곡이 없다면 재생" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "태그 라디오 재생..." #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "재생목록 번째의 곡 재생" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "재생/일시중지" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "재생" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "플레이어 옵션" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "재생목록" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "재생목록 끝남" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "재생목록 옵션" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "재생목록 종류" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "재생목록" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "브라우저를 닫고 클레멘타인으로 돌아오세요" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "플러그인 상태:" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "팟케스트" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "팝" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "인기곡" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "이번달의 인기곡" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "오늘의 인기곡" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "팝업 시간" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "포트" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "프리-엠프" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "환경설정" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "환경설정..." #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "선호하는 앨범 아트 파일명 (쉼표로 구분)" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "선호하는 오디오 형식" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "선호하는 비트 전송률" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "선호하는 형식" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "프리미엄 오디오 형식" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "프리셋:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "a키를 누르세요" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "예쁜 OSD 옵션" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "미리보기" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "이전" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "이전 트랙" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "출력 버전 정보" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "프로필" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "진행" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 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:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "음질" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "장치 질의..." #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "대기열 관리자" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "선택한 트랙을 큐에 추가" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "대기열 트랙" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "라디오 (모든 트랙을 같은 볼륨으로)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "라디오" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "빗소리" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "랜덤 시각화" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "현재 음악에 별점 0점 평가" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "현재 음악에 별점 1점 평가" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "현재 음악에 별점 2점 평가" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "현재 음악에 별점 3점 평가" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "현재 음악에 별점 4점 평가" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "현재 음악에 별점 5점 평가" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "등급" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "정말 취소 하시겠습니까?" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "새로고침" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "목록 새로고침" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "채널 새로고침" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "친구 목록 새로고침" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "방송국 목록 새로고침" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "스트림 새로고침" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "레게" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "Wii 리모콘 스윙 기억하기" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "마지막 기억" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "제거" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "제거 행동" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "재생목록에서 중복 제거" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "폴더 제거" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "내 음악에서 제거" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "즐겨찾기에서 제거" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "재생목록에서 제거" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "재생목록 제거" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "내 음악에서 음악 제거 중" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "즐겨찾기에서 곡 제거 중" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "재생목록 \"%1\" 이름 바꾸기" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "그루브샤크 재생목록 이름 바꾸기" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "재생목록 이름 바꾸기" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "재생목록 이름 바꾸기..." #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "반복" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "앨범 " #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "재생 목록 반복" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "한 곡 반복" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "현재 재생목록 교체" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "재생목록 교체" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "공백을 및줄로 대체" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "리플레이 게인" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "리플레이 게인 모드" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "초기화" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" 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:206 msgid "Restrict to ASCII characters" msgstr "ASCII 문자로 제한" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "Grooveshark 에서 내 음악을 받아오는 중" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "그루브샤크에서 인기곡을 받아오는 중" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "그루브샤크 재생목록을 받아오는 중" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "클레멘타인으로 되돌아가기" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "오른쪽" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "록" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "실행" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "SOCKS 프록시" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "안전하게 장치 제거" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "복사 후 안전하게 장치 제거" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "샘플 레이트" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "샘플 레이트" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "음악 라이브러리에 .mood 파일 저장" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "앨범 표지 저장" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "커버를 디스크에 저장..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "그림 저장" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "재생목록 저장" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "재생목록 저장..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "프리셋 저장" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "가능하면 파일 태그에 등급을 저장" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "가능하면 파일 태그에 통계를 저장" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "인터넷 탭에 이 스트림을 저장" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "Scalable sampling rate profile (SSR)" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "축척 크기" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "점수" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "검색" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "Icecast 방송국 검색" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "자멘도 검색" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Magnature 검색" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "서브소닉 검색" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "앨범 표지 검색..." #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "검색" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "gpodder.net 검색" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "iTunes 검색" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "모드 검색" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "옵션 검색" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "검색 결과" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "검색 조건" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "그루브샤크에서 검색" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "뒤로 탐색" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "앞으로 탐색" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "모두 선택" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "선택 없음" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "배경 색상 선택" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "배경 그림 선택" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "가장 유사한 일치 선택" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "전경 색상 선택" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "시각화 선택" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "시각화 선택..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "시리얼 넘버" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "서버 URL" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "서버 자세히" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "서비스 오프라인" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "음량을 퍼센트로 설정" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "모든 선택 트랙의 값을 설정..." #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "단축키" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "단축키: %1" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "%1위한 단축키가 이미 존재합니다." #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "보기" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "OSD 보기" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "현재 트랙에서 빛나는 애니메이션 보기" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "트랙 진행 막대에 분위기 막대 표시" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "네이트브 데스크탑 알림 보기" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "반복/섞기 모드 변경 시 알림 보기" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "볼륨 변경시 알림 보기" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "시스템 트레이에서 팝업 보기" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "예쁜 OSD 보기" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "상태 표시 줄 위에 보기" #: ui/mainwindow.cpp:460 msgid "Show all songs" msgstr "모든 음악 보기" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "모든 음악 보기" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show cover art in library" msgstr "라이브러리에서 커버아트 보기" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "분할 표시" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "전체화면 보기..." #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "파일 브라우져에서 보기..." #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "다양한 음악가에서 보기" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "분위기 막대 " #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "복사본만 보기" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "태그되지 않은 것만 보기" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "검색 제안 표시" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "\"좋아요\"와 \"싫어요\"버튼 보기" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "트레이 아이콘 보기" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "출처의 사용가능 여부 보기" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "보기/숨기기" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "섞기" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "앨범 섞기" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "전부 " #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "재생 목록 섞기" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "이 앨범에 있는 곡 섞기" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "로그인" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "로그아웃" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "로그인..." #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "유사한 음악가" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "크기" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "크기:" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "스카" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "재생목록에서 뒤로 넘기기" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "재생목록에서 앞으로 넘기기" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "작은 앨범 표지" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "작은 사이드바" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "스마트 재생목록" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "스마트 재생목록" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "소프트" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "소프트 록" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "음악 정보" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "음악 정보" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "소노그래프" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "죄송합니다" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "장르에 의한 정렬(철자순)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "장르에 의한 정렬(인기순)" #: ../bin/src/ui_icecastfilterwidget.h:77 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 "정렬" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "출처" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "출처" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "스포티피" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "스포티피 로그인 에러" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "스포티피 플러그인" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "스포티피 플러그인이 설치되지 않았습니다." #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "표준" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "볊점" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "변환 시작" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "%1 시작중" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "시작중..." #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "방송국" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "중지" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "이후 정지" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "이번 트랙 이후 정지" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "재생 " #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "중지됨" #: core/song.cpp:341 msgid "Stream" msgstr "스트림" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "스트리밍 멤버쉽" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "구독중인 재생목록" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "구독자" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "서브소닉" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "성공!" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "%1 작성 완료" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "제안된 태그" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "요약" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "아주 높음 (%1 fps)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "아주 높음 (2048x2048)" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "지원가능한 형식" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "지금 파일들의 통계들을 동기화" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "스포티피 재생목록 동기화중" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "시스템 색상" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "상단 탭" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "태그" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "태그 가져오기" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "태그 라디오" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "목표 비트 전송률" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "테크노" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "문자 옵션" #: ui/about.cpp:70 msgid "Thanks to" msgstr "감사합니다" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "재생 중인 음악의 앨범 표지" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "디렉터리 %1 이 유효하지 않습니다." #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "재생목록 '%1'이 비어있거나 재생이 불가능한 상태입니다." #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "요청하신 사이트는 이미지가 아닙니다!" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "이 앨범과 다른 음악" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "gpodder.net과 통신하는데 문제가 발생하였습니다." #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "매그나튠 으로부터 메타데이터를 가져오는데 문제가 발생했습니다" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "iTunes 스토어로부터 응답을 처리하는데 문제가 발생했습니다." #: ui/organiseerrordialog.cpp:56 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:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "파일들이 장치로 부터 삭제 될 것 입니다. 계속 진행 하시겠습니까?" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "These folders will be scanned for music to make up your library" msgstr "이 폴더들은 라이브러리를 생성하기 위하여 음악이 검색됩니다." #: ../bin/src/ui_transcodersettingspage.h:174 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:151 msgid "Third level" msgstr "" #: internet/jamendoservice.cpp:171 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/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "이 앨범은 요청된 형식이 아닙니다." #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "이 장치는 다음의 파일 형식을 지원합니다:" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "이 스트림은 유료 subscribers만 사용할 수 있습니다" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "타임아웃" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "제목" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "Grooveshark 라디오를 시청하시려면, 먼저 Grooveshark에서 몇 곡을 들으셔야 합니다." #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "오늘" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "예쁜 OSD 토글" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "전체화면 토글" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "대기열 상황 토글" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "내일" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "너무 많은 리다이렉트" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "상위 트랙" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "총 앨범수:" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "전송된 총 바이트" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "트랙" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "음악 변환" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "변환 기록" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "변환" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "%2개의 쓰레드를 이용하여 %1 파일을 변환 중" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "변환 옵션" #: core/song.cpp:338 msgid "TrueAudio" msgstr "트루오디오" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "터빈" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "끄기" #: devices/giolister.cpp:161 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "URL(들)" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "우분투 원" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "초광대역 (UWB)" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "알 수 없는" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "알 수 없는 content-type" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "알 수 없는 오류" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "커버 해제" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "구독 안함" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "다가오는 콘서트" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "그루브샤크 재생목록 업데이트" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "모든 팟케스트 업데이트" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "변경된 라이브러리 폴더 업데이트" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "클레멘타인이 시작될 때 라이브러리 업데이트" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "이 팟케스트 업데이트" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "업데이트 중" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "업데이트 중 %1" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "업데이트 중 %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "라이브러리 업데이트 중" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "사용" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "Gnome의 단축키를 사용합니다." #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "가능하면 리플레이 게인 메타데이터를 사용" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "Wii 리모컨 모드 사용" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "사용자 정의 색상 사용" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "알림을 위한 사용자 정의 메시지 설정" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "인증 사용" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "비트 전송률 관리 엔진 사용" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "다이나믹 모드 사용" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "Wii 리모콘 상태 보고를 위한 알림 사용" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "시스템 기본 값 사용" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "시스템 기본 색상 사용" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "시스템 프록시 설정 사용" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "음량 표준화 사용" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "사용 됨" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "사용자 %1 은(는) 그루브샤크 Anywhere 계정이 아닙니다" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "사용자 인터페이스" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "사용자명" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "가변 비트 전송률" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "다양한 음악가" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "버전 %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "보기" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "시각화 모드" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "시각화" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "시각화 설정" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "음량 %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "웹 사이트" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "주" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "클레멘타인이 시작할 때" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "목록이 비었을 때..." #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "다음의 검색어는 어떠시나요..." #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "광대역 (WB)" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii 리모콘 %1: 활성화" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii 리모콘 %1: 연결됨" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii 리모콘 %1: 배터리 위험(%2%)" #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii 리모콘 %1: 비 활성화" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii 리모콘 %1: 연결 끊김" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii 리모콘 %1: 낮은 배터리(%2%)" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "윈도우 미디어 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "윈도우 미디어 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "윈도우 미디어 64k" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "윈도우 미디어 오디오" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "커버 제외:" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "지금 전부 다시 검색해도 좋습니까?" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "모든 음악에 통계를 작성" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "잘못된 사용자명 또는 비밀번호 입니다." #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "년도" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "년도 - 앨범" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "년도" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "어제" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "로그인 하지 않았습니다." #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "%1 로 로그인 하였습니다." #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "로그인 되었습니다." #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "다른 음악과 동시에 배경 음악을 들을 수 있습니다. " #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "당신은 그루브샤크 Anywhere 계정을 가지고 있지 않습니다." #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "스포티피에서 로그아웃 되셨습니다. 설정에서 비밀번호를 재입력하여 주십시오." #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "스포티피에서 로그아웃 되셨습니다. 비밀번호를 재입력하여 주십시오." #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "이 트랙을 좋아합니다." #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "언어를 변경을 하였다면 클레멘타인을 재시작 해야합니다." #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "당신의 IP 주소:" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "매그나튠의 계정정보가 잘 못되었습니다." #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "라이브러리가 비었습니다!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "당신의 라디오 스트림" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "당신의 시스템은 OpenGL을 지원하지 않아서, 시각화를 사용할 수 없습니다." #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "사용자명 또는 비밀번호가 틀렸습니다." #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "제로" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "%n 곡 추가" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "이후" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "전에" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "그리고" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "자동" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "이전" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "사이" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "포함" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "사용 안함" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "%1 디스크" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "포함 되지 않음" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "같음" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "gpodder.net" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "gpodder.net 디렉토리" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "%n 곡 이동" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "같지 않음" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "옵션" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "엔터를 누르세요" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "%n 곡 제거" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "섞인 노래들" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "음악 정렬" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "중지" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "" clementine-1.2.0+dfsg/src/translations/lt.po000066400000000000000000004663461223327513400210700ustar00rootroot00000000000000# 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-2013 # pencininkas4 , 2012 # pencininkas4 , 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-19 17:19+0000\n" "Last-Translator: Liudas Ališauskas \n" "Language-Team: Lithuanian (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr "dienos" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " pt" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " sek." #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " dainos" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 albumų" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 dienų" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "prieš %1 dienų" #: podcasts/gpoddersync.cpp:79 #, 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:413 #, qt-format msgid "%1 selected of" msgstr "%1 pažymėta iš" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 daina" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 dainos" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 rasta dainų" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 rasta dainų (rodoma %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 takeliai" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 perkelta" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wii pulto modulis" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "%failovardas%" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n nepavyko" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n baigta" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "&Pasirinktinas" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "Ekstra" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "&Pagalba" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "&Slėpti %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "&Paslėpti..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Kairė" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "Muzika" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Nieko" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "Grojaraštis" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Baigti" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "Kartojimo režimas" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Dešinė" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "Maišymo veiksena" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "&Ištempti stulpelius, kad užpildytų langą" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "Įrankiai" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(skirtinga daugelyje dainų)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "...ir visiems prisidėjusiems prie Amarok" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "0px" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 diena" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 daina" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "127.0.0.1" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "40%" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 atsitiktinių dainų" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "Naujinti į Premium dabar" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "Sukurti naują paskyrą arba atkurti Jūsų slaptažodį" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "Reikalinga Grooveshark Betkur paskyra." #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "Reikalingas mokamas Spotify vartotojas" #: ../bin/src/ui_networkremotesettingspage.h:189 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:78 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:153 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:297 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "Šlovė HYPNOTOAD'ui" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "Nutraukti" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "Apie %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "Apie Clementine..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "Apie Qt..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Paskyros informacija" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "Paskyros informacija (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Veiksmas" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Aktyvuoti/Deaktyvuoti Wii pultą" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "Pridėti srautą" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Pridėti srautą" #: ../bin/src/ui_notificationssettingspage.h:425 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:193 msgid "Add action" msgstr "Pridėti veiksmą" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Pridėti kitą srautą..." #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Pridėti nuorodą..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "Pridėti failą" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "Pridėti failą perkodavimui" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "Pridėti failus perkodavimui" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Pridėti failą..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Pridėti failus perkodavimui" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Pridėti aplankalą" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Pridėti aplanką..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Pridėti naują aplankalą..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "Pridėti srautą" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "Pridėti srautą..." #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Pridėti paieškos frazę" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "Pridėti žymę kūrinio albumui" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "Pridėti žymę kūrinio albumui" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "Pridėti žymę kūrinio atlikėjui" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "Pridėti dainai automatinį įvertinimą" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "Pridėti žymę kūrinio kompozitoriui" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "Pridėti žymę kūrinio diskui" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "Pridėti dainai failo vardą" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "Pridėti žymę kūrinio žanrui" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "Pridėti dainos grupavimo žymę" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "Pridėti žymę kūrinio ilgiui" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "Pridėti dainos atlikėjo žymę" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "Nustatyi kūrinio perklausymų skaičių" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "Pridėti dainos vertinimą" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "Nustatyti kūrinio prametimų skaičių" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "Pridėti žymę kūrinio pavadinimui" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "Pridėti žymę kūrinio numeriui" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "Pridėti žymę kūrionio metams" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Pridėti srautą..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "Pridėti į Grooveshark mėgstamiausius" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "Pridėti į Grooveshark grojaraščius" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "Pridėti prie kito grojaraščio" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Įdėti į grojaraštį" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "Įdėti į eilę" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Pridėti Wii pulto veiksmą" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Pridėti..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Pridėta šį mėnesį" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Pridėta šią savaitę" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Pridėta šiais metais" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Pridėta šiandien" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Pridėta tryjų mėnesių tarpe" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "Daina pridedama į Mano muziką" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "Daina pridedama į mėgstamiausius" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Platesnis grupavimas..." #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "Po" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "Po kopijavimo..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Albumas" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Albumas (idealus garsumas visoms dainoms)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Albumo atlikėjas" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "Albumo viršelis" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Albumo info iš jamendo.com..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Albumai su viršeliais" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Albumai be viršelių" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Visi Failai (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "Šlovė Hypnotoad'ui!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Visi albumai" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Visi atlikėjai" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "Visi failai (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Visi grojaraščiai (%1)" #: ui/about.cpp:74 msgid "All the translators" msgstr "Visi vertėjai" #: library/library.cpp:84 msgid "All tracks" msgstr "Visos dainos" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "Leisti klientui atsisiųsti muziką iš šio kompiuterio." #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "Leisti atsiuntimus" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "Įgalinti vidurinį/šoninį kodavimą" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "Kartu su originalais" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Visada slėpti pagrindinį langą" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Visada rodyti pagrindinį langą" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "Visada pradėti grojant" #: internet/spotifyblobdownloader.cpp:60 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:61 msgid "An error occurred loading the iTunes database" msgstr "Iškilo klaida įkeliant iTunes duomenų bazę" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Klaida rašant meta duomenis į '%1'" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "Įvyko nežinoma klaida." #: ui/about.cpp:78 msgid "And:" msgstr "Ir:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "Piktas" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Išvaizda" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Įterpti failus/URL į grojaraštį" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "Įterpti į esamą grojaraštį" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "Įterpti į grojaraštį" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "Pritaikyti suspaudimą, kad išvengti nukirtimų" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Ar tikrai norite ištrinti \"%1\" šabloną?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "Ar tikrai norite pašalinti šį grojaraštį?" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "Ar tikrai norite atstatyti šios dainos statistiką?" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Atlikėjas" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Atlikėjo info" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "Atlikėjo radijas" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "Atlikėjo žymės" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "Atlikėjo inicialai" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Audio formatas" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Autorizacija nepavyko" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "Autorius" #: ui/about.cpp:65 msgid "Authors" msgstr "Autoriai" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Automatiškai" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Automatinis atnaujinimas" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "Automatiškai atverti pavienias kategorijas fonotekos sąraše" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "Galimas" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "Vidutinis bitų dažnis" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "Vidutinis paveikslo dydis" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "BBC srautas" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "Fono srautai" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Fono spalva" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "Fono pavaikslėlis" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Fono nepermatomumas" #: core/database.cpp:734 msgid "Backing up database" msgstr "Daroma duomenų bazės atsarginė kopija" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "Balansas" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Užblokuoti" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "Barograma" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Įprasta mėlyna" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "Paprastas audio tipas" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Elgsena" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "Geriausias" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "Biografija iš %1" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Bitų greitis" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "Bitų dažnis" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "Blokograma" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "Bloko tipas" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "Suliejimo kiekis" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "Turinys" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "Bumograma" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "„Box“" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Naršyti..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "Buferio trukmė" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "Kaupiamas buferis" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "Bet šie šaltiniai yra išjungti" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Mygtukai" #: core/song.cpp:339 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "\"CUE sheet\" palaikymas" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "Atšaukti" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Keisti viršelio paveikslėlį" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Keisti šrifto dydį..." #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "Keisti kartojimo režimą" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Keisti greituką..." #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "Keisti maišymo režimą" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Keisti kalbą" #: ../bin/src/ui_playbacksettingspage.h:330 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:228 msgid "Check for new episodes" msgstr "Tikrinti, ar nėra naujų epizodų" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Atnaujinimų tikrinimas..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "Parinkite pavadinimą išmaniajam grojaraščiui" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Automatiškai parinkti" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Parinkti spalvą..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "Pasirinkite šifrą..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Parinkti iš sąrašo" #: smartplaylists/querywizardplugin.cpp:155 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" #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "Pasirinkite srauto siutimo vietą" #: ../bin/src/ui_songinfosettingspage.h:188 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:115 msgid "Classical" msgstr "Klasika" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "Valoma" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Išvalyti" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Išvalyti grojaraštį" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "„Clementine“" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "„Clementine“ klaida" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "„Clementine“ Oranžinė" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "„Clementine“ vizualizacija" #: ../bin/src/ui_deviceproperties.h:376 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_boxsettingspage.h:104 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:104 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:104 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_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "Clementine gali groti Jūsų į Ubuntu One įkeltą muziką" #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "„Clementine“ gali rodyti pranešimą besikeičiant dainoms" #: ../bin/src/ui_podcastsettingspage.h:250 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:128 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“." #: internet/lastfmsettingspage.cpp:110 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 "Clementine negalėjo nustatyti jūsų vartotojo tipo, nes yra problemų su jūsų internetu. Grojami kūriniai bus išsaugoti ir nusiųsti vėliau į Last.fm." #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "„Clementine“ nuotraukų peržiūra" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "„Clementine“ nepavyko rasti rezultatų šiam failui" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "Clementine ras muziką:" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Paspauskite čia, kad pridėti muziką" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "Spustelėkite, kad perjungti tarp likusio laiko ir viso laiko" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "Užverti grojaraštį" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "Uždaryti vizualizacijas" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "Uždarant šį langą bus atšaukti atsisiuntimai." #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "Uždarant šį langą bus sustabdyta albumo viršelių paieška." #: ui/equalizer.cpp:116 msgid "Club" msgstr "Klubinė" #: ../bin/src/ui_appearancesettingspage.h:272 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:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Komentaras" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "Užbaigti žymes automatiškai" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "Pabaigti žymes automatiškai..." #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Kompozitorius" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "Konfigūruoti %1..." #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "Konfigūruoti Grooveshark..." #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Konfigūruoti „Last.fm“..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "Konfigūruoti „Magnatune“..." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Konfigūruoti sparčiuosius klavišus" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "Konfigūruoti Spotify..." #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "Konfigūruoti subsonix" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "Nustatyti visuotinę paiešką..." #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "Konfigūruoti fonoteką..." #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "Konfigūruojamas srautas... " #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "Konfigūruoti..." #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "Prijungti Wii pultą naudojant aktyvuoti/deaktyvuoti veiksmą" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "Prijungti įrenginį" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "Jungiamasi prie Spotify" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "Ryšį serveris atmetė, patikrinkite serverio URL. Pvz.: http://localhost:4040/" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Baigėsi prisijungimo laikas, patikrinkite serverio URL. Pavyzdys: http://localhost:4040/" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "Pultas" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "Pastovus bitų dažnis" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "Konvertuoti visą muziką" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "Konvertuoti visą įrenginio nepalaikomą muziką" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "Kopijuoti į atmintinę" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Kopijuoti į įrenginį..." #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Kopijuoti į fonoteką..." #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "Teisės" #: internet/subsonicsettingspage.cpp:81 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:64 #, 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" #: transcoder/transcoder.cpp:432 #, 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:426 #, 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/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "Nepavyko įkelti „Last.fm“ radijo stoties" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "Nepavyko atverti išvesties failo %1" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Viršelių tvarkyklė" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "Viršelio paveikslėlis iš įdėtos nuotraukos" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Viršelio paveikslėlis įkeltas automatiškai iš %1" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "Viršelio paveikslėlis savarankiškai pašalintas" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "Viršelio paveikslėlis nenustatytas" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "Viršelio paveikslėlis nustatytas iš %1" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "Viršeliai iš %1" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "Kurti naują Grooveshark grojaraštį" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "Naudoti „Cross-fade“ funkciją kai takeliai keičiami automatiškai" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "Naudoti „Cross-fade“ funkciją kai takeliai keičiami savarankiškai" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "Pasirinktinis" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "Pasirinktinis paveikslėlis" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "Specifiniai žinutės nustatymai" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "Pasirinktinis radijas" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Pasirinktinis..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "„DBus“ kelias" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Šokių" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Sukūrimo data" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Pakeitimo data" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "Dienos" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "Numatytas" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "Sumažinti garsą per 4%" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "Patildyti procentais" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Sumažinti garsą" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "Numatytasis fono paveikslėlis" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "Numatyti" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "Delsa tarp vizualizacijų" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "Trinti" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "Šalinti Grooveshark grojaraštį" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "Naikinti atsiųstus duomenis" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Ištrinti failus" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Ištrinti iš įrenginio..." #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Ištrinti iš disko..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "Ištrinti atliktus epizodus" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "Ištrinti šabloną" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "Ištrinti išmanųjį grojaraštį" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "Ištrinti originalius failus" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Trinami failai" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "Iš eilės pažymėtus takelius" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "Iš eilės takelį" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Kopijuoti į aplanką" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Detalės..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Įrenginys" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Įrenginio savybės" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Įrenginio pavadinimas" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Įrenginio savybės..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Įrenginiai" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Ar turėjote omenyje" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "Digitally Imported slaptažodis" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "Digitally Imported naudotojo vardas" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "Tiesioginis interneto ryšys" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Aplankas" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "Išjungti trukmę" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "Išjungti moodbar generavimą" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Išjungtas" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Diskas" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "Nevientisa transliacija" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "Rodymo nuostatos" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Rodyti OSD" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "Pilnai perskanuoti fonoteką" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "Nekonvertuoti jokios muzikos" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "Ne perrašyti" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Nekartoti" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "Nerodyti įvairiuose atlikėjuose" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "Nemaišyti" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "Nesustoti!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "Paremti pinigais" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Du kart spustelėkite norėdami atverti" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "Du kartus spūstelėjus dainą..." #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "Atsiųsti %n epizodus" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "Atsisiuntimų aplankas" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "Atsiųsti epizodus į" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "Atsiųsti narystę" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "Atsisiųsti naujus epizodus automatiškai" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "Atsiuntimas eilėje" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "Atsisiųsti Android programą" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Atsisiųsti šį albumą" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Atsisiunčiamas šis albumas" #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "Atsiųsti šį epizodą" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "Atsisiųsti..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "Atsiunčiama (%1%)..." #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "Atsiunčiamas Icecast aplankas" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "Atsiunčiamas Jamendo katalogas" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "Atsiunčiamas Magnatune katalogas" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "Siunčiamas Spotify plėtinys" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "Atsiunčiami metaduomenys" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "Temkite, kad pakeisti poziciją" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "Dropbox" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "Dinaminė veiksena yra įjungta" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "Dinaminis atsitiktinis maišymas" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "Taisyti išmanųjį grojaraštį..." #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Taisyti žymą \"%1\"..." #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "Taisyti žymę..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "Taisyti žymes" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Taisyti takelio informaciją" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "Taisyti takelio informaciją..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Taisyti takelių informaciją..." #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Keisti..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "Įgalinti Wii nuotolinio pulto palaikymą" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "Įjungti glodintuvą" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "Įgalinti kombinacijas tik tada kai Clementine yra aktyvus" #: ../bin/src/ui_globalsearchsettingspage.h:147 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:62 msgid "Enable/disable Last.fm scrobbling" msgstr "Įjungti/Išjungti „Last.fm scrobbling“" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "Kodavimo sudėtingumas" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "Kodavimo varikliuko kokybė" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "Kodavimo režimas" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "Įrašykite URL" #: ../bin/src/ui_coverfromurldialog.h:103 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:205 msgid "Enter a filename for exported covers (no extension):" msgstr "Įrašykite failo vardą eksportuotiems viršeliams (be plėtinio):" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "Įveskite naują pavadinimą šiam grojaraščiui" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Įveskite atlikėją arba žymę, kad pradėti klausytis Last.fm radijo." #: ../bin/src/ui_globalsearchview.h:209 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:77 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:77 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:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "Įveskite paieškos žodžius čia" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "Įveskite internetinio radijo srauto URL:" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "Įveskite naujo aplanko pavadinimą" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "Programoje įveskite šį adresą ir prisijungsite prie Clementine." #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "Visa kolekcija" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Klaida" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Klaida prijungiant MTP įrenginį" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "Klaida kopijuojant dainas" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "Klaida trinant dainas" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "Klaida siunčiant Spotify plėtinį" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "Klaida įkeliant %1" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Klaida įkeliant di.fm grojaraštį" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "Klaida apdorojant %1: %2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "Klaida įkeliant audio CD" #: library/library.cpp:63 msgid "Ever played" msgstr "Bet kada grota" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "Kas 10 minučių" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "Kas 12 valandų" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "Kas 2 valandas" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "Kas 20 minučių" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "Kas 30 minučių" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "Kas 6 valandas" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "Kiekvieną valandą" #: ../bin/src/ui_playbacksettingspage.h:303 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:208 msgid "Existing covers" msgstr "Esantys viršeliai" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "Išplėsti" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "Baigsis galiojimas %1" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "Eksportuoti viršelius" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "Eksportuoti viršelius" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "Eksportuoti atsisiųstus viršelius" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "Eksportuoti įterptus viršelius" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "Eksportavimas baigtas" #: ui/albumcovermanager.cpp:786 #, 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:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "Laipsniškai tildyti pristabdant / garsinti tęsiant" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "Palaipsniui nutilti kai stabdomas takelis" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "Pradingimas" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "Suliejimo trukmė" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "Nepavyko atsiųsti direktorijos" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "Nepavyko atsiųsti garso prenumeratos" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "Nepavyko įkelti garso prenumeratos" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "Nepavyko apdoroti XML šiam RSS srautui" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "Greitai" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "Mėgstamiausi" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "Megstami takeliai" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "Gauti trūkstamus albumų viršelius" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "Gauti automatiškai" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "Parsiuntimas baigtas" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "Gaunama Subsonic biblioteka" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Viršelio atsiuntimo klaida" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "Failo plėtinys" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "Failų formatai" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Failo vardas" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "Failo vardas (be kelio)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Failo dydis" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Failo tipas" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Failopavadinimas" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Failai" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "Failai perkodavimui" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "Rasti fonotekoje dainas, kurios atitinka jūsų nurodytus kriterijus." #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "Skenuojama daina" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "Baigti" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "Pirmas lygis" #: core/song.cpp:328 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Šrifto dydis" #: ../bin/src/ui_spotifysettingspage.h:213 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:204 msgid "Force mono encoding" msgstr "Įjungti tik mono kodavimą" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "Pamiršti įrenginį" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Forma" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "Formatas" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Kadrų dažnis" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "Kadrai per buferį" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Draugai" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "Užšaldyta" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Visi žemi tonai" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "Visi žemi ir aukšti tonai" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "Visi aukšti tonai" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "GStreamer audio variklis" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "Bendri" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Pagrindiniai nustatymai" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Žanras" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "Gauti URL šio Grooveshark grojaraščio bendrinimui" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "Gauti URL šios Grooveshark dainos bendrinimui" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "Gaunamos Grooveshark populiarios dainos" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "gaunami kanalai" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "Gaunami srautai" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "Suteikti pavadinimą" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "Eiti" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "Eiti į sekančią grojaraščių kortelę" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "Eiti į praeitą grojarasčių kortelę" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "Google diskas" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, 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:206 msgid "Grey out non existent songs in my playlists" msgstr "Pažymėti pilkai neegzistuojančias dainas mano grojaraštyje" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "Grooveshark prisijungimo klaida" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "Grooveshark grojaraščio URL" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "Grooveshark radijas" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "Grooveshark dainos URL" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "Grupuoti fonoteką pagal..." #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "Grupuoti pagal" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "Grupuoti pagal Albumą" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "Grupuoti pagal Atlikėją" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "Grupuoti pagal Atlikėją/Albumą" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "Grupuoti pagal Atlikėją/Metus - Albumą" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "Grupuoti pagal Žanrą/Albumą" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "Grupuoti pagal Žanrą/Atlikėją/Albumą" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "Grupavimas" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "HTML puslapis neturėjo jokio RSS srauto" #: internet/subsonicsettingspage.cpp:135 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:163 msgid "HTTP proxy" msgstr "HTTP įgaliotasis serveris" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "Laimingas" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "Įrangos informacija" #: ../bin/src/ui_deviceproperties.h:372 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:202 msgid "High" msgstr "Aukšta" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "Aukšta (%1 kps)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "Aukšta (1024x1024)" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "Mazgas nerastas, patikrinkite serverio URL. Pavyzdys: http://localhost:4040/" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "Valandos" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "Hypnotoad'as" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "Aš neturiu Magnatune paskyros" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Piktograma" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "Piktogramos viršuje" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "Nustatoma daina" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 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:77 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:204 msgid "Ignore \"The\" in artist names" msgstr "Nepaisyti \"The\" atlikėjų varduose" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Paveikslai (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "Po %1 d." #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "Po %1 sav." #: ../bin/src/ui_wizardfinishpage.h:86 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/spotifyservice.cpp:360 msgid "Inbox" msgstr "Gautieji" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "Rodyti albumo paveikslus pranešime" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "Įtraukti visas dainas" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Nesuderinama Subsonic REST protokolo versija. Reikia atnaujinti klientą." #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Nesuderinama Subsonic REST protokolo versija. Serveris turi atsinaujinti." #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Nepilna konfigūracija, įsitikinkite kad visi laukai užpildyti." #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "Pagarsinti 4%" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "Pagarsinti procentais" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Pagarsinti" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "Indeksuojama %1" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "Informacija" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "Įterpti..." #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Įdiegta" #: core/database.cpp:673 msgid "Integrity check" msgstr "Vientisumo tikrinimas" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Internetas" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "Interneto tiekėjai" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "Netinkamas API raktas" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Netinkamas formatas" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "Netinkamas metodas" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "Netinkami parametrai" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "Nurodytas netinkamas šaltinis" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "Netinkama paslauga" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "Netinkamas sesijos raktas" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "Neteisingas naudotojo vardas ir/arba slaptažodis" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "Jamendo Daugiausia klausyti takeliai" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "Jamendo Top takeliai" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "Jamendo mėnesio Top takeliai" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "Jamendo savaitės Top takelia" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "Jamendo duomenų bazė" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "Peršokti prie dabar grojamo takelio" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Laikykite mygtukus %1 sek." #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Laikyti mygtukus %1 sekundžių..." #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "Veikti fone kai langas uždaromas" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "Palikti originialius failus" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "Kačiukai" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Kalba" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "Nešiojamojo kompiuterio kolonėlės/ausinės" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Didelė salė" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "Didelis albumo viršelio paveikslėlis" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "Didelė juosta" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "Vėliausiai grota" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "Last.fm Savitas Radijas: %1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Last.fm Biblioteka - %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "Last.fm Mix Radijas - %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Last.fm Kaimyninis Radijas - %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Last.fm Radijo Stotis - %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Last.fm Panašūs Atlikėjai į %1" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Last.fm Žymės Radijas: %1" #: internet/lastfmservice.cpp:437 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:154 msgid "Last.fm password" msgstr "Last.fm slaptažodis" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "Last.fm grojimų skaitliukas" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Last.fm žymės" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Last.fm naudotojo vardas" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Last.fm wiki" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "Mažiausiai populiarūs takeliai" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "Palikite tuščią numatytoms reikšmėms. Pavyzdžiai: \"/dev/dsp\", \"front\", ir t.t." #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "Kairė" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Trukmė" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Fonoteka" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "Sudėtingesnis fonotekos grupavimas" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "Fonotekos perskanavimo žinutė" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "Fonotekos paieška" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Apribojimai" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "Klausyti Grooveshark dainų pagal jūsų anksčiau klausytas dainas" #: ui/equalizer.cpp:123 msgid "Live" msgstr "Gyvai" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Įkelti" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "Įkelti viršelį iš URL" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "Įkelti viršelį iš URL..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "Įkelti viršelį iš disko" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "Įkelti viršelį iš disko..." #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "Įkelti grojaraštį" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "Įkelti grojaraštį..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Įkeliama Last.fm radijo stotis" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Įkeliamas MTP įrenginys" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "Įkeliama iPod duomenų bazė" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "Įkeliamas išmanusis grojaraštis" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "Keliamos dainos" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "Įkeliamas srautas" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "Įkeliami takeliai" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "Užkraunama kūrinio informacija" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "Įkeliama..." #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "Įkelia failus/URL, pakeičiant esamą sąrašą" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Prisijungti" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "Prisijungimas nepavyko" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "Ilgalaikio nuspėjimo profilis (LTP)" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "Meilė" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Žema (%1 kps)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "Žema (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "Žemo sudėtingumo profilis (LC)" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "Dainų žodžiai" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "Žodžiai iš %1" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Magnatune atsiuntimas" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Magnatune atsiuntimas baigtas" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "Pagrindinis profilis" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "Padaryti tai taip!" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "Padaryti šį grojaraštį prieinamą atsijungus" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "Netinkamas atsakymas" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "Rankinis tarpinės stoties konfigūravimas" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "Rankiniu būdu" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "Gamintojas" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "Pažymėti kaip klausytą" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "Pažymėti kaip naują" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "Atitikti kiekvieną paieškos frazę (IR)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "Atitinka vieną ar daugiau paieškos frazių (ARBA)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "Maksimalus bitrate" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "Vidutinė (%1 kps)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "Vidutinė (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "Narystės tipas" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "Minimalus bitrate" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "Trūksta projectM šablonų" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "Modelis" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "Stebėti fonoteką dėl pasikeitimų" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "Mono grojimas" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "Mėnesiai" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "Nuotaika" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "Nuotaikos juostos stilius" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "Nuotaikos juostos" #: library/library.cpp:74 msgid "Most played" msgstr "Dažniausiai grota" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "Prijungimo vieta" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "Prijungimo vietos" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "Perkelti žemyn" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "Perkelti į fonoteką" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "Perkelti aukštyn" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "Muzika" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Fonoteka" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "Nutildyti" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "Mano Last.fm fonoteka" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "Mano Last.fm Mix radijas" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "Mano Last.fm kaiminystė" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "Mano Last.fm rekomenduotos stotys" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "Mano Mix radijas" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "Mano muzika" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "Mano kaiminystė" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "Mano radijo stotis" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "Mano rekomendacijos" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Veiksmas" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "Pavadinimų nustatymai" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "Siauras dažnis (NB)" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "Kaimynai" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "Tinklas" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "Tinklo įgaliotasis serveris" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "Nutolęs tinklas" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "Naujesni" #: library/library.cpp:67 msgid "Never played" msgstr "Niekada negrota" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "Niekada nepradėti groti" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "Naujas aplankas" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "Naujas grojaraštis" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "Naujas išmanusis grojaraštis..." #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "Naujos dainos" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "Nauji takeliai bus pridėti automatiškai." #: library/library.cpp:80 msgid "Newest tracks" msgstr "Naujausi takeliai" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "Toliau" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Kitas takelis" #: core/utilities.cpp:147 msgid "Next week" msgstr "Kitą savaitę" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "Jokio analizatoriaus" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "Išjungti fono paveikslėlį" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "Nėra eksportuotinų viršelių." #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "Jokių ilgų blokų" #: playlist/playlistcontainer.cpp:366 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:145 msgid "No short blocks" msgstr "Jokių trumpų blokų" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "Nėra" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 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:155 msgid "Normal" msgstr "Normalus" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "Normalus bloko tipas" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "Negalimas naudojant dinaminį grojaraštį" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "Neprisijungus" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "Nepakanka turinio" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "Nepakanka gerbėjų" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "Nepakanka narių" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "Nepakanka kaimynų" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Neįdiegta" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "Neprisijungęs" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "Neprijungtas - du kartus spragtelėkite, kad prijungti" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "Pranešimo tipas" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Pranešimai" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Dabar leidžiama" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "OSD peržiūra" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "Ogg opus" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "Permatomumas" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "Atverti %1 naršyklėje" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "Atverti &audio CD..." #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "Atverti OPML failą" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "Atverti OPML failą..." #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "Atverti įrenginį" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "Atverti failą..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "Atverti Google diske" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "Atverti naujame grojaraštyje" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Atverti..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "Operacija nepavyko" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "Optimizuoti grojimo bitrate dydžiui" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "Optimizuoti kokybei" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "Pasirinktys..." #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "Tvarkyti failus" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "Tvarkyti failus..." #: core/organise.cpp:65 msgid "Organising files" msgstr "Tvarkomi failai" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "Originalios žymės" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Kitos parinktys" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "Išvestis" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "Išvesties įrenginys" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "Išvesties parinktys" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "Išvesties įskiepis" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "Perrašyti viską" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "Perrašyti egzistuojančius failus" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "Perrašyti tik mažesnius" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "Savininkas" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "Apdorojamas Jamendo katalogas" #: ui/equalizer.cpp:124 msgid "Party" msgstr "Vakarėlis" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "Slaptažodis" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Pristabdyti" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "Sulaikyti grojimą" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Pristabdyta" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "Atlikėjas" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "Pikselis" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "Paprasta juosta" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Groti" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "Groti Atlikėją ar Žymę" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "Groti Atlikėjoradijo stotį" #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "Grojimo skaitiklis" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "Groti savitą radijo stotį..." #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "Groti jei sustabdyta, Pristabdyti jei grojama" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "Groti jei jau kas nors negroja" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "Groti pažymėtą radijo stotį..." #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "Groti takelį grojaraštyje" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "Groti/Pristabdyti" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Grojimas" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Leistuvo parinktys" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "Grojaraštis" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "Grojaraštis baigtas" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "Grojaraščio parinktys" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "Grojaraščio tipas" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "Grojaraščiai" #: ../data/oauthsuccess.html:36 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:214 msgid "Plugin status:" msgstr "Plėtinio būklė:" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "Podcast" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Pop" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "Populiarios dainos" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "Populiarios mėnesio dainos" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "Populiarios šiandienos dainos" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "Pranešino rodymo trukmė" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "Prievadas" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "Sustiprinti" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "Nustatymai" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "Nustatymai..." #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "Pageidaujamas viršelio paveikslėlio failo pavadinimas (atskirta kableliais)" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "Pageidaujamas audio formatas" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "Pageidautinas pralaidumas" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "Pageidaujamas formatas" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "Premium audio tipas" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "Šablonas:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "Spauskite mygtukų kombinaciją panaudojimui" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "Paspauskite klavišą" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Spauskite mygtukų kombinaciją panaudojimui %1..." #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "Gražus OSD" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "Peržiūra" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "Atgal" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 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:131 msgid "Profile" msgstr "Profilis" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "Progresas" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 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:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "Kokybė" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "Pateikiama užklausa įrenginiui..." #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "Eilės tvarkyklė" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "į eilę pažymėtus takelius" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "į eilę takelį" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "Radijas (vienodas garsumas visiems takeliams)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "Radijai" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "Lietus" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "Atsitiktinis vaizdinys" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "Įvertinti šią dainą 0 žvaigždžių" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "Įvertinti šią dainą 1 žvaigžde" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "Įvertinti šią dainą 2 žvaigždėmis" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "Įvertinti šią dainą 3 žvaigždėmis" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "Įvertinti šią dainą 4 žvaigždėmis" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "Įvertinti šią dainą 5 žvaigždėmis" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "Įvertinimas" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "Tikrai atšaukti?" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "Pasiekta nukreipimo riba, patikrinkite serverio konfigūraciją." #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "Atnaujinti" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "Atnaujinti katalogus" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "Atnaujinti kanalus" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "Atnaujinti draugų sąrašą" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "Atnaujinti stočių sąrašą" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "Atnaujinti srautus" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Regis" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "Prisiminti Wii pulto pasukimą" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "Prisiminti paskutinio karto būseną" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Pašalinti" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "Pašalinti veiksmą" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "Pašalinti dublikatus iš grojaraščio" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "Pašalinti aplanką" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "Pašalinti iš Mano muzika" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "Pašalinti iš mėgstamiausių" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "Ištrinti iš grojaraščio" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "Pašalinti grojaraštį" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "Pašalinti grojaraščius" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "Šalinamos dainos iš Mano muzika" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "Šalinamos dainos iš mėgstamiausių" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "Pervardinti %1 grojaraštį" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "Pervardinti Grooveshark grojaraštį" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "Pervadinti grojaraštį" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "Pervadinti grojaraštį..." #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "Pernumeruoti takelius šia tvarka..." #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Kartoti" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "Kartoti albumą" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "Kartoti grojaraštį" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "Kartoti takelį" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Pakeisti esamą griojaraštį" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "Pakeisti grojaraštį" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "Pakeisti tarpus pabraukimo simboliais" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "Garsumo suvienodinimas" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "Garsumo suvienodinimo veiksena" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "Užpildyti naujai" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "Reikalauti atpažinimo kodo" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "Atstatyti" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" msgstr "Atstatyti perklausų skaičių" #: 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:206 msgid "Restrict to ASCII characters" msgstr "Naudoti tik SCII simbolius" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "Paleidžiant pratęsti atkūrimą" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "Gaunamos Grooveshark Mano muzikos dainos" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "Gaunamos Grooveshark mėgstamiausios dainos" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "Gaunami Grooveshark grojaraščiai" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "Grįžti į Clementine" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "Dešinė" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Rokas" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "Vykdyti" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "SOCKS įgaliotasis serveris" #: internet/subsonicsettingspage.cpp:122 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:202 msgid "Safely remove device" msgstr "Saugiai pašalinti įrenginį" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "Saugiai pašalinti įrenginį po kopijavimo" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "Išrankos dažnis" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "Išrankosdažnis" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "Saugoti .mood failus Jūsų fonotekoje" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "Išsaugoti albumo viršelį" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "Išsaugoti albumo viršelį į diską..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "Išsaugoti paveikslėlį" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "Įrašyti grojaraštį" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "Įrašyti grojaraštį..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "Išsaugoti šabloną" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "Jei įmanoma, įvertinimus ir failo žymes saugoti" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "Jei įmanoma, statistiką saugoti failo žymėse" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "Išsaugoti šį srautą interneto kortelėje" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "Dainų statistika saugoma dainų failuose" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "Išsaugomi takeliai" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "Besikeičiantis kodavimo dažnio profilis (SSR)" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "Keisti dydį" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "Įvertinimas" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "Pateikti klausomų takelių informaciją" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "Ieškoti" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "Ieškoti Icecast stočių" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "Ieškoti Jamendo" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Ieškoti Magnatune" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "Ieškoti subsonic" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "Ieškoti albumo viršelių..." #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "Ieškoti bet ko" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "Ieškoti gpodder.net" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "Ieškoti iTunes" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "Paieškos veiksena" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "Paieškos parinktys" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "Paieškos rezultatai" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "Paieškos terminai" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "Ieškoti Grooveshark" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "Antras lygis" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "Sukti atgal" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "Sukti į priekį" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "Rasti dabar grojamą takelį pagal santykinį kiekį" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "Rasti dabar grojamą takelį į absoliučiąją poziciją" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "Pažymėti visus" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "N" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "Pasirinkite fono spalvą:" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "Pasirinkti fono paveikslėlį" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "Pažymėti geriausią galimą atitikimą" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "Pasirinkite priekinio plano spalvą:" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "Pasirinkti vaizdinius" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "Parinkti vaizdinius" #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "Serijos numeris" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "Serverio URL" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "Serverio detalės" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "Servisas nepasiekiamas" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Nustatyti %1 į \"%2\"..." #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "Nustatyti garsumą iki procentų" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "Nustatyti vertę visiems pažymėtiems takeliams..." #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "Nustatymai" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Kombinacija" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "Kombinacija veiksmui: %1" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Kombinacija veiksmui %1 jau egzistuoja" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Rodyti" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "Rodyti OSD" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "Švytėjimo efektas ant dabar grojamo takelio" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "Rodyti nuotaikos juostą progreso slankiklyje" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "Rodyti numatytą darbastalio pranešimą" #: ../bin/src/ui_notificationssettingspage.h:442 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:441 msgid "Show a notification when I change the volume" msgstr "Rodyti pranešimą kai keičiu garsumą" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "Rodyti iššokantį langą iš sistemos dėklo" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "Rodyti gražų OSD" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "Rodyti virš būsenos juostos" #: ui/mainwindow.cpp:460 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:209 msgid "Show cover art in library" msgstr "Rodyti albumo viršelius fonotekoje" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "Rodyti skirtukus" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "Rodyti viso dydžio..." #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "Rodyti failų naršyklėje..." #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "Rodyti įvairiuose atlikėjuose" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "Rodyti nuotaikos juostą" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "Rodyti tik duplikatus" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "Rodyti tik be žymių" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "Rodyti paieškos pasiūlymus" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "Rodyti \"meilė\" ir \"blokavimas\" mygtukus" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "Rodyti „scrobble“ mygtuką pagrindiniame lange" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "Rodyti piktogramą sistemos dėkle" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "Rodyti kurie šaltiniai yra įjungti ar išjungti" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "Rodyti/Slėpti" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Maišyti" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "Maišyti albumus" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "Maišyti viską" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "Maišyti grojaraštį" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "Maišyti takelius šiame albume" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "Prisijungti" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "Atsijungti" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "Jungiamasi..." #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "Panašūs atlikėjai" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "Dydis" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "Dydis:" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "Ankstesnis kūrinys grojaraštyje" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "Praleisti skaičiavimą" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "Kitas grojaraščio kūrinys" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "Mažas albumo viršelio paveikslėlis" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "Maža juosta" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "Išmanusis grojaraštis" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "Išmanūs grojaraščiai" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Rami" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "Ramus rokas" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "Dainos informacija" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "Dainos info" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "Sonograma" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "Atleiskite" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "Rikiuoti pagal žanrą (alfabetiškai)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "Rikiuoti pagal žanrą (pagal populiarumą)" #: ../bin/src/ui_icecastfilterwidget.h:77 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" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "Šaltinis" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "Šaltiniai" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "Spotify prisijungimo klaida" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "Spotify plėtinys" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "Spotify plėtinys neįdiegtas" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "Standartinis" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "Su žvaigždute" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "Pradėti grajaraštį nuo dabar grojančio" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "Perkoduoti" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 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:405 #, qt-format msgid "Starting %1" msgstr "Paleidžiama %1" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "Pradedama..." #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "Stotys" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Stabdyti" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "Stabdyti po" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "Sustabdyti po šio takelio" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Stabdyti grojimą" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "Sustoti po grojamo takelio" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "Sustabdyta" #: core/song.cpp:341 msgid "Stream" msgstr "Srautas" #: internet/subsonicsettingspage.cpp:30 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:160 msgid "Streaming membership" msgstr "Transliavimo narystė" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "Prenumeruoti grojaraščiai" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "Prenumeratoriai" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "Pavyko!" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "Sėkmingai įrašyta %1" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "Siūlomos žymės" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "Santrauka" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "Super aukšta (%1 kps)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "Super aukšta (2048x2048)" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "Palaikomi formatai" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "Sinchronizuoti statistiką į failus dabar" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "Atnaujinama Spotify dėžutė" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "Atnaujinama Spotify grojaraštis" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "Atnaujinama Spotify pažymėti kūriniai" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "Sistemos spalvos" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "Kortelės viršuje" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Žyma" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "Žymių gavėjas" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "Žymėti radijas" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "Numatomas bitrate" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "Teksto nustatymai" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Dėkojame" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Komanda \"%1\" negalėjo būti paleista." #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "Viršelis iš šiuo metu atliekamos dainos albumo" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "Aplankas %1 yra netinkamas" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "Grojaraštis '%1' buvo tuščias arba negalėjo būti įkeltas." #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "Puslapis, kurio prašėte nėra paveikslas" #: internet/subsonicsettingspage.cpp:98 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:2083 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 perskanavimo dėl savybių išdėstytų žemiau:" #: library/libraryview.cpp:529 msgid "There are other songs in this album" msgstr "Čia yra kitų dainų iš šio albumo" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "Problema jungiantis su gpodder.net" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Įvyko klaida gaunant meta duomenis iš Magnatune" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Problema apdorojant iTunes parduotuvės atsakymą" #: ui/organiseerrordialog.cpp:56 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:389 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:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 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:187 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:174 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "Šie nustatymai yra naudojimo \"Muzikos perkodavimas\" lange ir tada, kad muzika kopijuojama į įrenginį." #: ../bin/src/ui_groupbydialog.h:151 msgid "Third level" msgstr "Trečias lygis" #: internet/jamendoservice.cpp:171 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/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "Albumas yra negalimas prašomu formatu" #: ../bin/src/ui_deviceproperties.h:381 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:375 msgid "This device supports the following file formats:" msgstr "Šis įrenginys palaiko šiuos formatus:" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Šis įrenginys neveiks tinkamai" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Ši pasirinktis gali būti pakeista „Elgsena“ dalyje" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "Šis srautas yra tik apmokamiems prenumeratoriams" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "Šio tipo įrenginys yra nepalaikomas: %1" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "Pertrauka" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Pavadinimas" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "Kad paleisti Grooveshark radiją, pirma turite paklausyti kelių Grooveshark dainų" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "Šiandien" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "Išjungti gražųjį OSD" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Visame ekrane" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "Perjungti eilės statusą" #: ../bin/src/ui_mainwindow.h:718 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:143 msgid "Tomorrow" msgstr "Rytoj" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "Per daug peradresavimų." #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "Top takeliai" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "Viso albumų:" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "Viso baitų perkelta" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "Viso tinklo užklausų padaryta" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Takelis" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "Perkoduoti muziką" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "Perkodavimo logas" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "Perkoduojama" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Perkoduojami %1 failai naudojant %2 gijų" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "Perkodavimo pasirinktys" #: core/song.cpp:338 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "Turbina" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "Išjungti" #: devices/giolister.cpp:161 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "URL" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "Ubuntu One slaptažodis" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "Ubuntu One naudotojo vardas" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "Ultra platus dažnis (UWB)" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Nepavyko atsiųsti %1 (%2)" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Nežinomas" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "Nežinomas turinio tipas" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Nežinoma klaida" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "Pašalinti viršelį" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "Nebeprenumeruoti" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "Artėjantys koncertai" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "Atnaujinti Grooveshark grojaraštį" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "Atnaujinti visas garso prenumeratas" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "Atnaujinti pakeistus fonotekos katalogus" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "Atnaujinti fonoteką paleidžiant Clementine" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "Atnaujinti šią garso prenumeratą" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "Atnaujinama" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Atnaujinama %1" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "Atnaujinama %1..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Atnaujinama biblioteka" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "Naudojimas" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "Naudoti albumo artisto žymę, jei galima" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "Naudoti Gnome klavišų kombinacijas" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "Naudoti garsumo suvienodinimo meta duodeninis jei tai yra prieinama" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "Naudoti SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "Naudoti Wii valdymo pultą" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "Naudoti pasirinktų spalvų rinkinį" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "Naudoti savo žinutę pranešimams" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "Naudoti tinklo nuotolinį valdymą" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "Naudoti tapatybės patvirtinimą" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "Naudoti bitrate valdymo varikliuklą" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "Naudoti dinaminę veikseną" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "Naudoti pranešimus Wii pulto būsenos rodymui" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "Naudoti laikinąjį triukšmų formavimą" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "Naudoti sistemos numatytus" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "Naudoti sistemos numatytą spalvų rinkinį" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "Naudoti sistemos tarpinio serverio nustatymus" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "Naudoti garso normalizavimą" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "Panaudota" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "Naudotojas %1 neturi Grooveshark Bet kur paskyros" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "Naudotojo sąsaja" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Naudotojo vardas" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "Naudojant meniu pridėti dainai..." #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "Kintamas bitrate" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "Įvairūs atlikėjai" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "Versija %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "Rodymas" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "Vaizdinio veiksena" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "Vaizdiniai" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "Vaizdinio nustatymai" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "Balso aktyvumo aptikimas" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "Garsumas %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "Perspėti mane, kai uždaroma grijaraščio kortelė." #: core/song.cpp:337 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "Svetainė" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "Savaitės" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "Kai Clementine paleidžiamas" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "Kai sąrašas yra tuščias..." #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "Kodėl nepabandžius..." #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "Platus dažnis (WB)" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii pultas %1: aktyvuotas" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii pultas %1: prijungtas" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii pultas %1: kritinė baterija (%2%) " #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii pultas %1: dezaktyvuotas" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii pultas %1: atjungtas" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii pultas %1: išsekusi baterija (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "Windows Media Audio" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "Be viršelių:" #: library/libraryview.cpp:530 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:2088 msgid "Would you like to run a full rescan right now?" msgstr "Ar norite paleisti pilną perskenavimą dabar?" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "Rašyti visą dainų statistiką į dainų failus" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "Netinkamas naudotojo vardas ar slaptažodis." #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "Metai" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "Metai - Albumas" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "Metai" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "Vakar" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "Jūs ketinate atsisiųsti šiuos albumus" #: playlist/playlistlistcontainer.cpp:311 #, 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:177 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:172 msgid "You are not signed in." msgstr "Jūs nesate prisijungęs." #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "Jūs esate prisijungęs kaip %1." #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "Jūs esate prisijungęs." #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "Galite nustatyti kaip organizuoti dainas fonotekoje" #: internet/digitallyimportedsettingspage.cpp:46 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/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "Galite klausyti foninių garsų kartu su kita muzika." #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "Galite teikti informaciją apie klausomus takelius į Last.fm nemokamai, bet tik apmokami prenumeratoriai gali transliuoti Last.fm radiją per Clementine." #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "Jūs neturite Grooveshark Bet kur paskyros." #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Jūs neturite Spotify Premium paskyros." #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "Jūs neturite aktyvios prenumeratos" #: internet/spotifyservice.cpp:170 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/spotifysettingspage.cpp:158 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:87 msgid "You love this track" msgstr "Jūs mylite šį takelį" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "Jums reikia paleisti Sistemos nustatymus ir įjungti \"Suteikti prieigą pagalbiniams įrenginiams\", kad naudoti Bendrąsias klavišų kombinacijas Clementine programoje." #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "Reikės paleisti iš naujo Clementine, kad pasikeistų kalba." #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "Jus negalite klausyti „Last.fm“ radijo stočių, nes neesate „Last.fm“ abonentas" #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "Jūsų IP adresas:" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Jūsų Last.fm duomenys buvo neteisingi" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "Jūsų Magnatune prisijungimo duomenys buvo neteisingi" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "Jūsų fonoteka yra tuščia!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "Tavo radijo srautai" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "Jūsų pateikta informacija: %1" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Jūsų sistemoje nėra OpenGL palaikymo, vizualizacijos negalimos." #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "Jūsų naudotojo vardas arba slaptažodis yra neteisingi." #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Nulis" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "pridėti %n dainų" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "po" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "prieš" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "ir" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "automatinis" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "anksčiau" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "tarp" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "Didžiausi pirmiausia" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "dpm" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "susideda iš" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "išjungta" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "diskas %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "neturi" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "baigiasi iš" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "lygus" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "gpodder.net" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "gpodder.net direktorija" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "daugiau nei" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "per paskutines" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "mažiau nei" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "Ilgiausi pirmiausia" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "perkelti %n dainų" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "naujausi pirmiausia" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "nelygu" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "ne per paskutines" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "ne esantis" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "seniausi pirmiausia" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "iš" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "parinktys" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "arba nuskenuokite QR kodą!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "paspauskite enter" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "pašalinti %n dainas" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "trumpiausi pirmiausia" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "Maišyti dainas" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "mažiausi pirmiausia" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "Rikiuoti dainas" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "prasideda iš" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "stabdyti" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "takelis %1" clementine-1.2.0+dfsg/src/translations/lv.po000066400000000000000000004363141223327513400210620ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # FIRST AUTHOR , 2011 # Kristaps, 2012 # uGGa , 2011 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:07+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Latvian (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " kb/s" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " punkti" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " sekundes" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " dziesmas" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 albumi" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 dienas" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 dienas atpakaļ" #: podcasts/gpoddersync.cpp:79 #, 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:413 #, qt-format msgid "%1 selected of" msgstr "%1 izvēlēti no" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 dziesma" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 dziesmas" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "atrastas %1 dziesmas" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "atrastas %1 dziesmas (redzamas %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 dziesmas" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimotedev modulis" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n neizdevās" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n pabeigti" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "&Izvēles" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "Ekstras" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "&Palīdzība" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "&Paslēpt %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "%Paslēpt..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "Pa &kreisi" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "Mūzika" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Nav" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "Dziesmu liste" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Iziet" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "Atkārtošanas režīms" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Pa labi" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "Jaukšanas režīms" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "&mainīt stabu lielumu" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "&Rīki" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(dažādām dziesmām atšķiras)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "... un visiem Amarok atbalstītājiem" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 diena" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 dziesma" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 nejaušas dziesmas" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "Nepieciešams Grooveshark Anywhere profils" #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "Nepieciešams Spotify Premium konts." #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:78 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:153 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:297 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "Hypnotoad krupis no Futurama" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "Par %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "Par Clementine..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "Par Qt..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Konta informācija" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Darbība" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Aktivizēt/deaktivizēt Wiiremote" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "Pievienot podraidi" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Pievienot straumi" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "Pievienot darbību" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Pievienot citu straumi..." #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Pievienot mapi..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "Pievienot datni" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Pievienot failu..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Pievienot failus pārkodēšanai" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Pievienot mapi" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Pievienot mapi..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Pievienot jaunu mapi..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "Pievienot podraidi" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "Pievienot podraidi..." #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Pievienot meklēšanas vienumu" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "Pievienot dziesmas albuma birku" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "Pievienot dziesmas albuma mākslinieka birku" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "Pievienot dziesmas mākslinieka birku" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "Pievienot dziesmas komponista birku" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "Pievienot dziesmas diska birku" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "Pievienot dziesmas žanra birku" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "Pievienot dziesmas ilguma birku" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "Pievienot dziesmas nosaukumu birku" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "Pievienot dziesmas numura birku" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "Pievienot dziesmas gada birku" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Pievienot straumi..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "Pievienot citai dziesmu listei" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Pievienot dziesmu listei" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "Pievienot rindai" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Pievienot wiimotedev darbību" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Pievienot..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Pievienots šomēnes" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Pievienots šonedēļ" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Pievienots šogad" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Pievienots šodien" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Pievienots pēdējos 3 mēnešos" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Advancēta grupēšana..." #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "Pēc kopēšanas..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Albums" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Albums (ideāls skaļums visiem celiņiem)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Albuma izpildītājs" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "Albuma vāks" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Albuma info iekš jamendo.com..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Albumi ar vāka attēlu" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Albumi bez vāka attēla" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Visi faili (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "Hypnotoad krupis no Futurama!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Visi albumi" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Visi izpildītāji" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "Visi faili (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Visas dziesmu listes (%1)" #: ui/about.cpp:74 msgid "All the translators" msgstr "Visi tulkotāji" #: library/library.cpp:84 msgid "All tracks" msgstr "Visas dziesmas" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "Atļaut centrs/sāni kodēšanu" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "Blakus oriģināliem" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Vienmēr slēpt galveno logu" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Vienmēr rādīt galveno logu" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "Vienmēr sākt atskaņošanu" #: internet/spotifyblobdownloader.cpp:60 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:61 msgid "An error occurred loading the iTunes database" msgstr "Kļūda ielādējot iTunes datubāzi" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Kļūda ievadot matadatus '%1'" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:78 msgid "And:" msgstr "Un:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "Dusmīgs" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Izskats" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Pievienot failus/saites dziesmu listei" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "Papildināt pašreizējo dziesmu listi" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "Papildināt dziesmu listi" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "Saspiest, lai izvairītos no izgriešanas" #: ui/equalizer.cpp:197 #, 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\"?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "Vai esat drošs, ka vēlaties dzēst šo atskaņošanas sarakstu?" #: ui/edittagdialog.cpp:769 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:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Izpildītājs" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Izpildītāja info" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "Izpildītāja radio" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "Izpildītāja birkas" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "Izpildītājā iciāļi" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Audio formāts" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Autentifikācija neizdevās" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "Autors" #: ui/about.cpp:65 msgid "Authors" msgstr "Autori" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Automātiski" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Automātiskā atjaunināšana" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "Meklējot automātiski atvērt kategorijas biblotēkas sarakstā" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "Pieejams" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "Vidējais bitu pārraides ātrums" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "Vidējais attēlu izmērs" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "BBC podraides" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "Sitieni minūtē" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "Fona Straumes" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Fona krāsa" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "Fona attēls" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Fona caurlaidība" #: core/database.cpp:734 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Bloķēt" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "Gabalveida analizators" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Pamata zils" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Uzvedība" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "Labākais" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "Biogrāfija no %1" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Bitreits" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "Bitreits" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "Bloku analizators" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "Bloku tips" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Pārlūkot..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Pogas" #: core/song.cpp:339 msgid "CDDA" msgstr "" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "Atcelt" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Mainīt vāka attēlu" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Mainīt fontu izmēru..." #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "Mainīt atkārtošanas režīmu" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Mainīt īsceļu..." #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "Mainīt jaukšanas režīmu" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Mainīt valodu" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "BBC podraides" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Pārbaudīt atjauninājumus..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "Izvēlieties nosaukumu gudrajai dziesmu listei" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Izvēlēties automātiski" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Izvēlēties krāsu..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "Izvēlēties burtrakstu..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Izvēlēties no saraksta" #: smartplaylists/querywizardplugin.cpp:155 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." #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "Izvēlieties podraides lejuplādes direktoriju" #: ../bin/src/ui_songinfosettingspage.h:188 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:115 msgid "Classical" msgstr "Klasisks" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Attīrīt" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Attīrīt dziesmu listi" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Clementine Kļūda" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Oranžs Clementine" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Clementine vizualizācija" #: ../bin/src/ui_deviceproperties.h:376 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_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:431 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:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:128 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." #: internet/lastfmsettingspage.cpp:110 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 "" #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Clementine attēlu atveidotājs" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "Clementine nespēja atrast rezultātus šim failam" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Spiediet te lai pievienotu mūziku" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "Spiediet, lai pārslēgtos no atlikušā uz pilno garumu" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "Aizvērt vizualizāciju" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "Aizverot programmu, tiks atcelta failu lejupielāde." #: ui/albumcovermanager.cpp:216 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:116 msgid "Club" msgstr "Klubu mūzika" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Colors" msgstr "Krāsas" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Piezīmes" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "Noformēt tagus automātiski" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "Noformēt tagus automātiski..." #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Komponists" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "" #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "Konfigurēt Grooveshark..." #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Konfigurēt Last.fm..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "Konfigurēt Magnatune" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Konfigurēt īsceļus" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "Konfigurēt Spotify..." #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "Konfigurēt bibliotēku..." #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "Konfigurēt podraides..." #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "Konfigurēt" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "Pieslēdziet Wii tālvadību izmantojot aktivizēt/deaktivizēt" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "Pieslēgt ierīci" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "Pieslēdzos Spotify" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "Konstants bitreits" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "Konvertēt visu mūziku" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "Konvertēt mūziku, ko ierīce nespēj atskaņot" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "Kopēt starpliktuvē" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Kopēt uz ierīci..." #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Kopēt uz bibliotēku..." #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "Autortiesības" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:64 #, 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" #: transcoder/transcoder.cpp:432 #, 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:426 #, 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/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "Nevar atvērt last.fm radio staciju" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "Nevar atvērt izejas failu %1" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Vāka attēlu pārvaldnieks" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "Vāka attēls no iekļautā attēla" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Vāka attēls ielādēts automātiski no %1" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "Vāka attēls manuāli noņemts" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "Vāka attēls nav uzstādīts" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "Vāka attēls uzstādīts no %1" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "Izveidot jaunu Groovershark atskaņošanas sarakstu" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "Izmantot laidenu pāreju, kad dziesmas pārslēdzas automātiski" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "Izmantot laidenu pāreju, kad dziesmas pārslēdz lietotājs" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "Pielāgots" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "Pielāgots radio" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Pielāgots..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "DBus ceļš" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Dance" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Izveides datums" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Pārveides datums" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "Dienas" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "Nok&lusētais" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "Samazināt skaļumu par 4%" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Samazināt skaļumu" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "Noklusējuma fona attēls" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "Noklusētie" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "Aizture starp vizualizācijām" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "Izdzēst Grooveshark atskaņošanas sarakstu" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "Dzēst lejuplādētos datus" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Dzēst failus" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Dzēst no ierīces..." #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Dzēst no diska..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "Dzēst uzstādījumu" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "Dzēst Smart Playlist" #: ../bin/src/ui_organisedialog.h:194 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:1363 msgid "Dequeue selected tracks" msgstr "Izņemt dziesmas no rindas" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "Izņemt dziesmu no rindas" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Galamērķis" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Detaļas..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Ierīce" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Ierīces īpašības" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Ierīces nosaukums" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Ierīces īpašības..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Ierīces" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Vai jūs domājāt" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "Tiešs interneta pieslēgums" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Mape" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Atslēgts" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Disks" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 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:715 msgid "Do a full library rescan" msgstr "Veikt pilnu bibliotēkas skenēšanu" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "Nekonvertēt mūziku" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Neatkārtot" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "Nerādīt pie dažādiem izpildītājiem" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "Nejaukt" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "Neapstāties" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Dubultklikšķis lai atvērtu" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "Dubultklikšķis uz dziesmas..." #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "Lejuplādēt %n sērijas" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "Lejupielādēt mapi" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "Lejupielādēt dalību" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "Automātiski lejuplādēt jaunās sērijas" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Lejupielādēt šo albumu" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Lejupielādēt šo albumu..." #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "Lejuplādēt šo sēriju" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "Lejupielādēt..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "Lejuplādē (%1%)..." #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "Lejupielādē Icecast mapi" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "Lejupielādē Jamendo katalogu" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "Lejupielādē Magnatude katalogu" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "Lejupielādē Spotify spraudni" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "Lejupielādē metadatus" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "Velciet, lai pārpozicionētu" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "Dinamiskais režīms ieslēgts" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "Dinamisks nejaušs mikss" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "Rediģēt gudro dziesmu listi..." #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Rediģēt birku \"%1\"..." #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "Rediģēt birku" #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "Rediģēt birkas" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Rediģēt dziesmas informāciju" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "Rediģēt dziesmas informāciju..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Rediģēt dziesmu informāciju..." #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Rediģēt..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "Atļaut Wii tālvadības atbalstu" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "Ieslēgt ekvalaizeru" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "Lietot saīsnes tikai tad, kad izvēlēts Clementine" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "Ieslēgt/izslēgt Last.fm skroblēšanu" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "Kodēšanas sarežģītība" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "Kodēšanas dzinēja kvalitāte" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "Kodēšanas režīms" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "Ievadiet jaunu nosakumu šai dziesmu listei" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Ievadiet izpildītāju vai birku lai sāktu klausīties Last.fm radio." #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "Ievadiet meklējamo tekstu šeit" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "Ievadiet interneta radio straumes adresi (URL):" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "Visa kolekcija" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Kļūda" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Kļūda pieslēdzoties MTP ierīcei" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "Kļūda kopējot dziesmas" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "Kļūda dzēšot dziesmas" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "Kļūda lejupielādējot Spotify spraudni" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "Kļūda ielādējot %1" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "Kļūda apstrādājot %1: %2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:63 msgid "Ever played" msgstr "Vispār atskaņots" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "Katras 10 minūtes" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "Katras 12 stundas" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "Katras 2 stundas" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "Katras 20 minūtes" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "Katras 30 minūtes" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "Katras 6 stundas" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "Katru stundu" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "Paplašināt" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "Laideni noklusināt apturot dziesmu" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "Pāreja" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "Pārejas garums" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "Ātri" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "Izlase" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "Mīļākās dziesmas" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "Meklēt trūkstošos vāku attēlus" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "Piemeklēt automātiski" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Kļūda piemeklējot vāku attēlus" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "Faila tips" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "Failu formāti" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Faila nosaukums" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "Faila nosaukums (bez atrašanās vietas)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Faila izmērs" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Faila tips" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Faila nosaukums" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Faili" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "Faili kodēšanai" #: smartplaylists/querywizardplugin.cpp:90 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" #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "Meklēju dziesmas \"pirkstu nospiedumus\"" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "Pabeigt" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "Pirmais līmenis" #: core/song.cpp:328 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Fonta izmērs" #: ../bin/src/ui_spotifysettingspage.h:213 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:204 msgid "Force mono encoding" msgstr "Forsēt mono kodēšanu" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "Aizmirst ierīci" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Forma" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "Formāts" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Kadrātrums" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "Kadri buferī" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Draugi" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Pilns bass" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "Pilns bass un augšas" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "Pilnas augšas" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "GStreamer audio dzinējs" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Pamata iestatījumi" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Žanrs" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "Ielādēju kanālus" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "Dodiet tam vārdu:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "Iet uz nākamās dziesmu listes cilni" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "Iet uz iepriekšējās dziesmu listes cilni" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, 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:206 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_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "Grooveshark radio" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "Grooveshark dziesmas vietrādis URL" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "Grupēt Bibliotēku pēc..." #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "Grupēt pēc" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "Grupēt pēc Albumiem" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "Grupēt pēc Izpildītāja" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "Grupēt pēc Izpildītāja/Albuma" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "Grupēt pēc Izpildītāja/Gada - Albuma" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "Grupēt pēc Stils/Albums" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "Grupēt pēc Stila/Izpildītāja/Albuma" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "HTTP starpniekserveris" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "Priecīgs" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "\"Dzelžu\" informācija" #: ../bin/src/ui_deviceproperties.h:372 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:202 msgid "High" msgstr "Augsts" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "Augsts (%1 kadri/s)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "Augsta (1024x1024)" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "Stundas" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "Hypnotoad krupis" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "Man nav Magnatune konta" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Ikona" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "Ikonas pa virsu" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "Identificēju dziesmu" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 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:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "Ignorēt \"The\" izpildītāju nosaukumos" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Attēli (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "Ienākošie" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "Iekļaut vāku attēlus paziņojumos" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "Iekļaut visas dziesmas" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "Palielināt skaļumu par 4%" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Palielināt skaļumu" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "Informācija" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "Ievietot..." #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Uzstādīts" #: core/database.cpp:673 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Internets" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "Nepareiza API atslēga" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Nepareizs formāts" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "Nepareiza metode" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "Nepareizi parametri" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "Norādīts nederīgs resurss" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "Nepareizs serviss" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "Nepareiza sesijas atslēga" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "Nederīgs lietotājvārds un/vai parole" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "Jamendo klausītākās dziesmas" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "Jamendo populārākās dziesmas" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "Jamendo populārākās mēneša dziesmas" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "Jamendo populārākās nedēļas dziesmas" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "Jamendo datubāze" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "Pārslēgties uz šobrīd skanošo dziesmu" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Turiet pogas %1 sekundi..." #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Turiet pogas %1 sekundes..." #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "Darboties fonā, kad logs ir aizvērts" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "Atstāt oriģinālos failus" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "Kakēni" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Valoda" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "Laptops/Austiņas" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Liela zāle" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "Liels vāka attēls" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "Liela sānjosla" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "Pēdējo reizi atskaņots" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "Last.fm Pielāgotais Radio: %1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Last.fm Bibliotēka - %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "Last.fm Mix Radio - %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Last.fm Kaimiņu Radio - %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Last.fm Radio Stacija - %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Last.fm Līdzīgi Izpildītāji ar %1" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Last.fm Birku Radio: %1" #: internet/lastfmservice.cpp:437 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:154 msgid "Last.fm password" msgstr "Last.fm parole" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "Last.fm atskaņojumu skaits" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Last.fm birkas" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Last.fm lietotājvārds" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Last.fm wiki" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "Visnemīļākās dziesmas" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "Atstājiet tukšu noklusētajam. Piemēri: /dev/dsp\", \"front\", utt." #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Ilgums" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Bibliotēka" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "Advancēta Bibliotēkas grupēšana" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "Bibliotēkās skenēšanas paziņojums" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "Meklēt Bibliotēkā" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Limiti" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "" #: ui/equalizer.cpp:123 msgid "Live" msgstr "Dzīvais" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Ielādēt" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "Ielādēt vāka attēlu no adreses" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "Ielādēt vāka attēlu no adreses..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "Ielādēt vāku no diska." #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "Ielādēt vāka attēlu no diska..." #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "Ielādēt dziesmu listi" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "Ielādēt dziesmu listi..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Ialēdē Last.fm radio" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Ielādē MTP ierīci" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "Ielādē iPod datubāzi" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "Ielādē gudro dziesmu listi" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "Ielādē dziesmas" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "Ielādē straumi" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "Ielādē dziesmas" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "Ielādē dziesmas info" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "Ielādē..." #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "Ielādē failus/adreses, aizstājot pašreizējo dziesmu listi" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Pieslēgties" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "Ilga termiņa paredzēšanas profils (LTP)" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "Patīk" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Zems (%1 kadri/s)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "Zema (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "Zemas sarežģītības profils (LC)" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "Dziesmas vārdi" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "Dziesmas vārdi no %1" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatude" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Magnatude Lejupielāde" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Magnatude lejupielāde pabeigta" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "Galvenais profils (MAIN)" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "Padarīt atskaņošanas sarakstu pieejamu nesaistē" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "Izkropļota atbilde" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "Manuāla starpniekservera konfigurācija" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "Ražotājs" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "Atzīmēt kā dzirdētu" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "Atzīmēt kā jaunu" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "Atbilst visiem meklēšanas nosacījumiem (UN)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "Atbilst vienam vai vairākiem meklēšanas nosacījumiem (VAI)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "Maksimālais bitreits" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "Vidējs (%1 kadri/s)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "Vidēja (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "Dalības tips" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "Minimālais bitreits" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "Pazuduši projectM preseti" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "Modelis" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "Pārlūkot izmaiņas bibliotēkā" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "Mēneši" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "Noskaņojums" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "" #: library/library.cpp:74 msgid "Most played" msgstr "Visvairāk atskaņotie" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "Montēšanas punkts" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "Montēšanas punkti" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "Pārvietot uz leju" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "Pārvietot uz bibliotēku..." #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "Pārvietot uz augšu" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Mūzikas bibliotēka" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "Klusums" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "Mana Last.fm Bibliotēka" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "Mani Last.fm Mix Radio" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "Mani Last.fm Kaimiņi" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "Mani Last.fm Ieteiktie Radio" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "Mans Mix Radio" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "Mani kaimiņi" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "Mana radio stacija" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "Mani ieteikumi" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Nosaukums" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "Nosaukšanas opcijas" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "Šaura josla (NB)" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "Kaimiņi" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "Tīkls" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "Tīkla starpniekserveris" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "Nekad" #: library/library.cpp:67 msgid "Never played" msgstr "Nekad nav atskaņotas" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "Nekad Nesākt atskaņot" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "Jauna dziesmu liste" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "Jauna gudrā dziesmu liste..." #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "Jaunas dziesmas" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "Jaunas dziesmas tiks pievienotas automātiski" #: library/library.cpp:80 msgid "Newest tracks" msgstr "Jaunākās dziesmas" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "Uz priekšu" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Nākamā" #: core/utilities.cpp:147 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "Bez analizatora" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "Bez gariem blokiem" #: playlist/playlistcontainer.cpp:366 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:145 msgid "No short blocks" msgstr "Bez īsiem blokiem" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "Nekas" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 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:155 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "Normāls bloku tips" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "Nav pieejams izmantojot dinamiskās dziesmu listes" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "Nav pieslēgts" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "Nepietiekošs saturs" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "Nepietiek fanu" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "Nepietiek dalībnieku" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "Nepietiek kaimiņu" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Nav uzstādīta" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "Nav uzmontēts - dubultklikšķis lai uzmontētu" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "Paziņojumu tips" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Paziņojumi" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Tagad atskaņo" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "Paziņojumu loga piemērs" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 msgid "Only allow connections from the local network" msgstr "" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Rādīt tikai pirmo" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "Opacity" msgstr "" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "" #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "Atvērt ierīci" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "Atvērt datni..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "Atvērt jaunā skaņsarakstā" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Atvērt..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "Darbība neizdevās" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "Optimizēts bitreitam" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "Optimizēts kvalitātei" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "Opcijas..." #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "Organizēt Failus" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "Organizēt failus..." #: core/organise.cpp:65 msgid "Organising files" msgstr "Kārtoju failus" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "Oriģinālās birkas" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Citas opcijas" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "Atskaņošanas opcijas" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "Pārrakstīt esošos failus" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "Īpašnieks" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "Pārsē Jamendo katalogu" #: ui/equalizer.cpp:124 msgid "Party" msgstr "Ballīte" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "Parole" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Pauze" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "Pauzēt atskaņošanu" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Nopauzēts" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "Parasta sānjosla" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Atskaņot" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "Atskaņot Izpildītāju vai Birku" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "Atskaņot izpildītāja radio..." #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "Atskaņošanu skaits" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "Atskaņot pielāgoto radio..." #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "Atskaņot, ja apturēts, pauzēt, ja atskaņo" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "Atskaņot, ja nekas netiek atskaņots" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "Atskaņot birku radio..." #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "Atskaņot dziesmu no dziesmu listes" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "Atskaņot/Pauzēt" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Atskaņošana" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Atskaņotāja opcijas" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "Dziesmu liste" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "Dziesmu liste beigusies" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "Dziesmu listes opcijas" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "Dziesmu listes tips" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "Atskaņošanas saraksti" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "Spraudņa statuss:" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "Podraides" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Popmūzika" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "Mēneša populārākās dziesmas" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "Šodienas populārākās dziesmas" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "Paziņojuma ilgums" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "Ports" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "Priekšpastiprinājums" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "Uzstādījumi" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "Iestatījumi..." #: ../bin/src/ui_librarysettingspage.h:202 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:167 msgid "Preferred audio format" msgstr "Vēlamais audio formāts" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "Vēlamais bitu pārraides ātrums" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "Vēlamais formāts" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "Presets:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "Nospiediet taustiņu kombināciju lai izmantotu par" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "Nospiediet taustiņu" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Nospiediet taustiņu kombināciju lai izmantotu par %1..." #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "Priekšskatīt" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "Iepriekšējais" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "Iepriekšējā" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "Profils" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "Virzība" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 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:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "Kvalitāte" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "Ierindoju ierīci..." #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "Rindas pārvaldnieks" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "Ierindot izvēlētās dziesmas" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "Ierindot dziesmu" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "Radio (ekvivalents skaļums visiem celiņiem)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "Radio" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "Lietus" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "Nejauša vizualizācija" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "Novērtēt dziesmu ar 0 zvaigznēm" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "Novērtēt ar 1 zvaigzni" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "Novērtēt ar 2 zvaigznēm" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "Novērtēt ar 3 zvaigznēm" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "Novērtēt ar 4 zvaigznēm" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "Novērtēt ar 5 zvaigznēm" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "Vērtējums" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "Tiešām atcelt?" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "Pārlādēt" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "Atjaunot katalogu" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "Atjaunot kanālus" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "Pārlādēt draugu sarakstu" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "Atjaunot staciu sarakstu" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Regejs" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "Atcerēties no pēdējās reizes" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Izņemt" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "Noņemt darbību" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "Aizvākt mapi" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "Izņemt no izlases" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "Azivākt no dziesmu listes" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "Pārdēvēt atskaņošanas sarakstu „%1”" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "Pārdēvēt dziesmu listi" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "Pārdēvēt dziesmu listi..." #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "Pārkārtot šādā secībā..." #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Atkartot" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "Atkārtot albumu" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "Atkārtot dziesmu listi" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "Atkārtot dziesmu" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Aizstāt pašreizējo dziesmu listi" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "Aizstāt dziesmu listi" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "Aizstāj atstarpes ar pasvītrojumiem" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "Atskaņošanas skaļums" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "Atjaunot" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "Atiestatīt" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" msgstr "Atstatīt atskaņošanu skaitu" #: 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:206 msgid "Restrict to ASCII characters" msgstr "Atļaut tikai ASCII simbolus" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Roks" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "SOCKS starpniekserveris" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "Saudzīgi atvienot ierīci" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "Saudzīgi atvienot ierīci pēc kopēšanas" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "Nolašu ātrums" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "Nolašu ātrums" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "Saglabāt vāka attēlu" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "Saglabāt vāka attēlu uz disku..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "Salgabāt bildi" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "Saglabāt dziesmu listi" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "Saglabāt dziesmu listi..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "Saglabāt presetu" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "Saglabāt šo straumi Interneta cilenē" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "Salgabā dziesmas" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "Maināms semplreita profils (SSR)" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "Vērtējums" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "Skroblēt dziesmas, ko klausos" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "Meklēt" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "Meklēt Icecast stacijas" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "Meklēt Jamendo" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Meklēt Magnatude" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "Meklēt albumu vāciņus..." #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "Meklēšanas režīms" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "Meklēšanas opcijas" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "Meklēšanas nosacījumi" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "Otrais līmenis" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "Patīt atpakaļ" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "Patīt uz priekšu" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "Patīt skanošo dziesmu par relatīvu attālumu" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "Patīt skanošo dziesmu par absolūtu attālumu" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "Iezīmēt visu" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "Neiezīmēt neko" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "Izvēlieties fona krāsu:" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "Izvēlēties fona attēlu" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "Izvēlēties labāko atbilstību" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "Izvēlēties vizualizācijas" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "Izvēlēties vizualizācijas..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "Sērijas numurs" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "Serviss atslēgts" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Uzstādīt %1 uz \"%2\"..." #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "Uzstādīt skaļumu uz procentiem" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "Saglabāt vērtību izvēlētajām dziesmām..." #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Īsceļš" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "Isceļš priekš %1" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Īsceļš priekš %1 jau eksistē" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Parādit" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "Parādīt paziņojumu" #: ../bin/src/ui_playbacksettingspage.h:298 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:293 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "Rādīt vienkāršu darbvirsmas paziņojumu" #: ../bin/src/ui_notificationssettingspage.h:442 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:441 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:436 msgid "Show a popup from the system tray" msgstr "Rādīt paziņojumu nu sistēmas joslas" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "Rādīt skaistu paziņojumu logu" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "Rādīt virs statusa joslas" #: ui/mainwindow.cpp:460 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:209 msgid "Show cover art in library" msgstr "Rādīt vāka attēlus bibliotēkā" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "Rādīt atdalītājus" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "Radīt pa visu ekrānu..." #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "Rādīt failu pārlūkā..." #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "Rādīt pie dažādiem izpildītājiem" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "Rādīt tikai dublikātus" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "Rādīt tikai bez birkām" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "Rādīt \"patīk\" un \"aizliegt\" pogas" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "Rādīt skroblēšanas pogu galvenajā logā" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "Rādīt paneļa ikonu" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "Rādīt/slēpt" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Jaukt" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "Jaukt visu" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "Jaukt dziesmu listi" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "Atslēgties" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "Līdzīgi izpildītāji" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "Izlaist atpakaļejot dziesmu listē" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "Izlaista" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "Izlaist turpinot dziesmu listē" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "Mazs vāka attēls" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "Maza sānjosla" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "Gudrā dziesmu liste" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "Gudrās dziesmu listes" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Viegla" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "Vieglais roks" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "Dziesmas informācija" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "Dziesmas info" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "Sonogramma" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "Atvainojiet" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "Kārtot pēc stila (alfabētiski)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "Kārtot pēc stila (pēc popularitātes)" #: ../bin/src/ui_icecastfilterwidget.h:77 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" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "Avots" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "Avoti" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "Spotify pieslēgšanās kļūda" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "Spotify spraudnis" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "Spotify spraudnis nav uzstādīts" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "Standarts" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "Novērtēts ar zvaigzni" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "Sākt pašreiz atskaņoto dziesmu listi" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "Sākt kodēšanu" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "Palaiž %1" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "Palaiž..." #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "Stacijas" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Apturēt" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "Apturēt pēc" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "Apturēt pēc šīs dziesmas" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Apturēt atskaņošanu" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "Apturēt atskaņošanu pēc šīs dziesmas" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "Apturēts" #: core/song.cpp:341 msgid "Stream" msgstr "Straume" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "Straumējuma dalība" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "Abonenti" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "Veiksmīgi ierakstīts %1" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "Ieteiktās birkas" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "Kopsavilkums" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "Ļoti augsts (%1 kadri/s)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "Ārkārtīgi augsta (2048x2048)" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "Atbalstītie formāti" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "Cilnes pa virsu" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Birka" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "Birku meklētājs" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "Birku radio" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "Mērķa bitreits" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Tehno" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Pateicoties" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Nevar startēt \"%1\" komandu" #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "Pašlaik atskaņotās dziesmas albuma vāks" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "Nederīga mape %1" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "Kļūda ielādējot dziesmu listi '%1'. Iespējams, tā ir tukša" #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "Pieprasītā adrese nav attēls!" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Problēma meklējot metadatus iekš Magnatude" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:56 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:389 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:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 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:174 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:151 msgid "Third level" msgstr "Trešais līmenis" #: internet/jamendoservice.cpp:171 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/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "Albums nav pieejams pieprasītajā formātā" #: ../bin/src/ui_deviceproperties.h:381 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:375 msgid "This device supports the following file formats:" msgstr "Ierīce atbalsta šādus failu formātus:" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Šī ierīce nedarbosies pareizi" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "Šī straume ir pieejama tikai maksas lietotājiem" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "Šī tipa ierīce netiek atbalstīta: %1" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "Noilgums" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Nosaukums" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "Šodien" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Ieslēgt pilnu ekrānu" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "Ieslēgt rindas statusu" #: ../bin/src/ui_mainwindow.h:718 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:143 msgid "Tomorrow" msgstr "" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "Par daudz pāradresāciju" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Dziesma" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "Kodēt Mūziku" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "Kodēšanas piezīmes" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "Pārkodēšana" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "Kodēšanas opcijas" #: core/song.cpp:338 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "Turbine" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "Izslēgt" #: devices/giolister.cpp:161 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "Adreses (URL)" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "Ultra plata josla (UWB)" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Nevar lejupielādēt %1 (%2)" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Nezināms" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Nezināma kļūda" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "Noņemt vāka attēlu" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "Atabonēt" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "Tuvākie koncerti" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "Atjaunot mainītās bibliotēkas mapes" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "Atjaunot bibliotēku ieslēdzot Clementine" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Atjaunoju %1" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "Atjaunoju %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Atjaunoju bibliotēku" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "Pielietojums" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "Pieejamības gadījumā izmantot albuma mākslinieka birku" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "Izmantot Gnome saīšņu taustiņus" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "Izmantot atskaņošanas skaļuma datus, ja pieejami" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "Izmantot Wii Tālvadību" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "Lietot autentifikāciju" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "Lietot dinamisko režīmu" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "Izmantot paziņojumus Wii Tālvadības statusa atskaitēm" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "Lietotot sistēmas uzstādījumus" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "Lietot sistēmas starpniekservera uzstādījumus" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "Izmantots" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "Lietotāja saskarne" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Lietotājvārds" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "Izmantojot izvēlni lai pievienotu dziesmu..." #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "Mainīgs bitreits" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "Dažādi izpildītāji" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "Versija %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "Skats" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "Vizualizāciju režīms" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "Vizualizācijas" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "Vizualizāciju Iestatījumi" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "Balss aktivitātes noteikšana" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "Skaļums %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "Tīmekļa vietne" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "Nedēļas" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "Kad startējas Clementine" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "Plaša josla (WB)" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii Tālvadība %1: aktivizēta" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii Tālvadība %1: savienots" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii Tālvadība %1: ļoti vāja baterija (%2%) " #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii Tālvadība %1: deaktivizēta" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii Tālvadība %1: atvienots" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Tālvadība %1: vāja baterija (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "Windows Media audio" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "Vai jūs vēlaties palaist pilnu skenēšanu?" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "Gads" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "Gads - Albums" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "Gadi" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "Vakar" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "Jūs gatavojaties lejupielādēt sekojošus albumus" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:123 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/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatunesettingspage.cpp:53 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:57 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." #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "Jums nav Grooveshark Anywhere konts." #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "Jums nav aktīva abonementa." #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "Jūs mīlat šo dziesmu" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:200 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." #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "Jūs nevarat atskaņot Last.fm radio stacijas neesot Last.fm lietotājs." #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Jūsu Last.fm dati ir nepareizi" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "Jūsu Magnatude dati ir nepareizi" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "Jūsu bibliotēka ir tukša!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "Jūsu radio straumes" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "Jūsu skrobli: %1" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "Jūsu lietotājvārds vai parole bija nederīgi." #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Nulle" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "pievienot %n dziesmas" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "pēc" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "atpakaļ" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "un" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "automātisks" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "pirms" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "starp" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "lielākais vispirms" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "sitieni minūtē" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "satur" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "izslēgts" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "disks %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "nesatur" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "beidzas ar" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "vienāds" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "lielāks par" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "pēdējās" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "kb/s" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "mazāks par" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "garākais vispirms" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "jaunākais vispirms" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "nav vienāds" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "ne pēdējajā" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "nav uz" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "vecākais vispirms" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "uz" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "opcijas" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "piespiediet enter" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "aizvākt %n dziesmas" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "īsākais vispirms" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "mazākais vispirms" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "sākas ar" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "apturēt" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "dziesma %1" clementine-1.2.0+dfsg/src/translations/mk_MK.po000066400000000000000000003667741223327513400214530ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # infoman , 2013 # kanaifu , 2013 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-26 08:55+0000\n" "Last-Translator: infoman \n" "Language-Team: Macedonian (Macedonia) (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr "kbps" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr "ms" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr "pt" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr "секунди" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "песни" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 албуми" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 денови" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "пред %1 денови" #: podcasts/gpoddersync.cpp:79 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 плејлисти (%2)" #: playlist/playlistmanager.cpp:413 #, qt-format msgid "%1 selected of" msgstr "%1 избрани од" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 песна" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 песни" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 песни се пронајдени" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 песни се пронајдени (прикажувам %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 нумера" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 пренесено" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimotedev модул" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n неуспешно" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n завршено" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "&Прилагодено" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "&Помош" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "%Скриено %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "&Сокриј..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Лево" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Без" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Излези" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Десно" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "&Истегни ги колоните за да го пополнат прозорецот" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "&Алатки" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(различно за различни песни)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "..и сите оние кои допринесоа за Amarok" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 ден" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 песна" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 песни по случаен избор" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "Премини на платена верзија" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "" #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:78 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:153 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "A-Z" msgstr "А-Ш" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "СЛАВА И НА ХИПНОЖАБАТА" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "Околу %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "За Clementine..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "За Qt..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Детали за сметката" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "Детали за сметката (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Акција" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Активирај/Деактивирај Wiiremote" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "Додади акција" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Додади уште еден извор..." #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Додади директориум..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Додади датотека..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Додади датотеки за транскодирање" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Додади папка" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Додади папка..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Додади нова папка..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Додади поим за пребарување" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "Додади поле за албум на песна" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "Додади поле за автор на слика на албум на песна" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "Додади поле за автор/музичар на песна" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "Додади поле за композитор на песна" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "Додади поле за диск на песна" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "Додади поле за жанр на песна" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "Додади поле за должина на песна" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "Додади бројач за пуштање на песна" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "Додади бројач за прескокнување на песна" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "Додади поле за наслов на песна" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "Додади поле за песна" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "Додади поле за песна на годината" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Додади извор..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "Додади на друга плејлиста" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Додади на плејлистата" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "Додади на редот" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Додади wiimotedev акција" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Додади..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Додено овој месец" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Додадено оваа недела" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Додадено оваа година" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Додадено денеска" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Додадено во последните три месеци" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Напредно групирање..." #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "После копирањето..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Албум" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Албум (идеална гласност за сите песни)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Музичар на албумот" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Податоци за албумот на jamendo.com..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Албуми со насловни слики" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Албуми без насловни слики" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Сите Датотеки (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "Слава му на Хипножабецот!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Сите албуми" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Сите музичари" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "Сите датотеки (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Сите плејлисти (%1)" #: ui/about.cpp:74 msgid "All the translators" msgstr "Сите преведувачи" #: library/library.cpp:84 msgid "All tracks" msgstr "Сите песни" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "Дозволи mid/side енкодирање" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "" #: internet/spotifyblobdownloader.cpp:60 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:61 msgid "An error occurred loading the iTunes database" msgstr "" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:78 msgid "And:" msgstr "" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "" #: ui/about.cpp:65 msgid "Authors" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "" #: core/database.cpp:734 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "" #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "" #: core/song.cpp:339 msgid "CDDA" msgstr "" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "" #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "" #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "" #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "" #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "" #: ui/equalizer.cpp:115 msgid "Classical" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: internet/lastfmsettingspage.cpp:110 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 "" #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "" #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:116 msgid "Club" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "" #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "" #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "" #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "" #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "" #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "" #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "" #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "" #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:64 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: transcoder/transcoder.cpp:432 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "" #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "" #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "" #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "" #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "Донирај" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "" #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "" #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "" #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "" #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "" #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "" #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:63 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "" #: core/song.cpp:328 msgid "Flac" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:43 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "" #: core/database.cpp:673 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "" #: internet/lastfmservice.cpp:437 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:154 msgid "Last.fm password" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "Лево" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "" #: ui/equalizer.cpp:123 msgid "Live" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "" #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "" #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "" #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "" #: core/song.cpp:330 msgid "MPC" msgstr "" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "" #: library/library.cpp:74 msgid "Most played" msgstr "" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "" #: library/library.cpp:67 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:80 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "" #: core/utilities.cpp:147 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:366 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "" #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "" #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "" #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "" #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "" #: core/organise.cpp:65 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:124 msgid "Party" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "" #: widgets/osd.cpp:156 msgid "Paused" msgstr "" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "" #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "" #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" 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:206 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "Десно" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "" #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "" #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:460 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "" #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "" #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 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 "" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "" #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "" #: core/song.cpp:341 msgid "Stream" msgstr "" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "" #: ui/about.cpp:70 msgid "Thanks to" msgstr "" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "" #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:56 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:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:174 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:151 msgid "Third level" msgstr "" #: internet/jamendoservice.cpp:171 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "" #: core/song.cpp:338 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "" #: devices/giolister.cpp:161 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "" #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "" #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "" #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "" clementine-1.2.0+dfsg/src/translations/mr.po000066400000000000000000003610721223327513400210550ustar00rootroot00000000000000# 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" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:08+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Marathi (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " सेकंद" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " गाणी" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 दिवस" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 दिवसांपुर्वी" #: podcasts/gpoddersync.cpp:79 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "" #: playlist/playlistmanager.cpp:413 #, qt-format msgid "%1 selected of" msgstr "" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 गाणे" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 गाणी सापडली" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 गाणी सापडली (%2 दाखवत आहे )" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, qt-format msgid "%L1 other listeners" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "%1 &लपवा" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "&लपवा...." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "" #: core/utilities.cpp:108 msgid "1 day" msgstr "" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "" #: library/library.cpp:60 msgid "50 random tracks" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "" #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:78 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:153 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "A-Z" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "" #: core/song.cpp:336 msgid "AIFF" msgstr "" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "" #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "" #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "" #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "" #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "" #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "" #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "" #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "" #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "" #: ui/about.cpp:74 msgid "All the translators" msgstr "" #: library/library.cpp:84 msgid "All tracks" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "" #: internet/spotifyblobdownloader.cpp:60 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:61 msgid "An error occurred loading the iTunes database" msgstr "" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:78 msgid "And:" msgstr "" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "" #: ui/about.cpp:65 msgid "Authors" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "" #: core/database.cpp:734 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "" #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "" #: core/song.cpp:339 msgid "CDDA" msgstr "" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "" #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "" #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "" #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "" #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "" #: ui/equalizer.cpp:115 msgid "Classical" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: internet/lastfmsettingspage.cpp:110 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 "" #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "" #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:116 msgid "Club" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "" #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "" #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "" #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "" #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "" #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "" #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "" #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "" #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:64 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: transcoder/transcoder.cpp:432 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "" #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "" #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "" #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "" #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "" #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "" #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "" #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "" #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "" #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "" #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:63 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "" #: core/song.cpp:328 msgid "Flac" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:43 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "" #: core/database.cpp:673 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "" #: internet/lastfmservice.cpp:437 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:154 msgid "Last.fm password" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "" #: ui/equalizer.cpp:123 msgid "Live" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "" #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "" #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "" #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "" #: core/song.cpp:330 msgid "MPC" msgstr "" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "" #: library/library.cpp:74 msgid "Most played" msgstr "" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "" #: library/library.cpp:67 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:80 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "" #: core/utilities.cpp:147 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:366 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "" #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "" #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "" #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "" #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "" #: core/organise.cpp:65 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:124 msgid "Party" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "" #: widgets/osd.cpp:156 msgid "Paused" msgstr "" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "" #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "" #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" 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:206 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "" #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "" #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:460 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "" #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "" #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 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 "" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "" #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "" #: core/song.cpp:341 msgid "Stream" msgstr "" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "" #: ui/about.cpp:70 msgid "Thanks to" msgstr "" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "" #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:56 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:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:174 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:151 msgid "Third level" msgstr "" #: internet/jamendoservice.cpp:171 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "" #: core/song.cpp:338 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "" #: devices/giolister.cpp:161 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "" #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "" #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "" #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "" clementine-1.2.0+dfsg/src/translations/ms.po000066400000000000000000004132401223327513400210510ustar00rootroot00000000000000# 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" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:08+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Malay (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " pt" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " saat" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " lagu" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 album" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 hari" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 hari lalu" #: podcasts/gpoddersync.cpp:79 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 senarai main (%2)" #: playlist/playlistmanager.cpp:413 #, qt-format msgid "%1 selected of" msgstr "" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 lagu" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 lagu" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 lagu ditemui" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 lagu ditemui (memaparkan %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 trek" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Modul Wiimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, qt-format msgid "%L1 other listeners" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n telah selesai" #: transcoder/transcodedialog.cpp:192 #, c-format msgid "%n remaining" msgstr "" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&Tengah" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "&Custom" msgstr "" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "Ekstra" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "&Bantuan" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "&Sembunyikan %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "&Sembunyikan..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Kiri" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "Muzik" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Tiada" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "Senarai main" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Keluar" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "Mod ulang" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Kanan" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "Mod kocok" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "&Regangkan kolum-kolum untuk dimuat mengikut tetingkap" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "&Alatan" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "...dan semua penyumbang Amarok" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 hari" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 trek" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 trek rawak" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "" #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "Akaun Spotify Premium diperlukan" #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:78 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:153 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:297 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "HIDUP HYPNOTOAD" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "Perihal %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "Perihal Clementine" #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "Perihal Qt..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Butir-butir akaun" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Tindakan" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Aktif/nyahaktif Wiiremote" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Tambah Strim" #: ../bin/src/ui_notificationssettingspage.h:425 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:193 msgid "Add action" msgstr "Tambah tindakan" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Tambah strim lain..." #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Tambah direktori..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Tambah fail..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Tambah fail-fail untuk transkod" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Tambah folder" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Tambah folder..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Tambah folder baru..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Tambah terma carian" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "Tambah tag albun lagu" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "Tambah tag artisalbum lagu" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "Tambah tag artis lagu" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "Tambah tag penggubah lagu" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "Tambah tag cakera lagu" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "Tambah tag genre lagu" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "Tambah tag panjang lagu" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "Tambah bilangan main lagu" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "Tambahkan bilangan langkau lagu" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "Tambah tag tajuk lagu" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "Tambah tag trek lagu" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "Tambah tag tahun lagu" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Tambah stream..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "Tambahkan ke senarai main lain" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Tambahkan ke senarai main" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Tambahkan tindakan wiimotedev" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Tambah..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Ditambah pada bulan ini" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Ditambah pada minggu ini" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Ditambah pada tahun ini" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Ditambah pada hari ini" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "Selepas menyalin..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Album (kelantangan ideal untuk semua trek)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Artis album" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Info album di jamendo.com..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Album dengan kulit muka" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Album tanpa kulit muka" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Semua Fail (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "Hidup Hypnotoad!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Semua album" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Semua artis" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "Semua fail (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Semua senarai main (%1)" #: ui/about.cpp:74 msgid "All the translators" msgstr "Semua penterjemah" #: library/library.cpp:84 msgid "All tracks" msgstr "Semua trek" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Sentiasa sembunyikan tetingkap utama" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Sentiasa tunjukkan tetingkap utama" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "" #: internet/spotifyblobdownloader.cpp:60 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:61 msgid "An error occurred loading the iTunes database" msgstr "Ralat berlaku semasa memuat pangkalan data iTunes" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Ralat berlaku semasa menulis metadata ke '%1'" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:78 msgid "And:" msgstr "Dan:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Tambah fail-fail/URL ke senarai main" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "Tambah ke senarai main semasa" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "Tambah ke senarai main" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Artis" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Info artis" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "Tag-tag artis" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Format audio" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Pengesahan gagal" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "" #: ui/about.cpp:65 msgid "Authors" msgstr "Pengarang-pengarang" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Auto" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Pengemaskinian automatik" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "Ada" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "Kadar bit purata" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Warna latar belakang" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Kelegapan latar belakang" #: core/database.cpp:734 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Larang" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Kelakuan" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "Terbaik" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "Biografi dari %1" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Kadar bit" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "Kadar bit" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Layar..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Bebutang" #: core/song.cpp:339 msgid "CDDA" msgstr "" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "Batal" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Ubahkan seni kulit muka" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Ubah saiz fon..." #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "Ubahkan mod ulang" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "" #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Ubah bahasa" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Periksa kemaskini..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "Pilih satu nama untuk senarai main pintar anda" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Pilih secara automatik" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Pilih warna..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "" #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Pilih daripada senarai" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Pilih laman-laman sesawang yang anda mahu Clementine gunakan semasa mencari lirik-lirik." #: ui/equalizer.cpp:115 msgid "Classical" msgstr "Klasikal" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Kosong" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Kosongkan senarai main" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Ralat Clementine" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "" #: ../bin/src/ui_deviceproperties.h:376 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_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "Clementine boleh paparkan mesej apabila trek berubah." #: ../bin/src/ui_podcastsettingspage.h:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: internet/lastfmsettingspage.cpp:110 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 "" #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Pemapar imej Clementine" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Klik di sini untuk menambah muzik" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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 "Tutup" #: playlist/playlisttabbar.cpp:54 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "Menutup tetingkap ini akan membatalkan muat turun." #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "Menutup tetingkap ini akan menghentikan pencarian kulit album." #: ui/equalizer.cpp:116 msgid "Club" msgstr "Kelab" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Komen" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "Lengkapkan tag-tag secara automatik" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "Lengkapkan tag-tag secara automatik..." #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Penggubah" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "" #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "" #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "" #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Tetapkan Pintasan" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "" #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "" #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "" #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "Sambung peranti" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "Menyambung ke Spotify" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "Kadar bit malar" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "Tukar semua muzik" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "Tukar mana-mana muzik yang tidak boleh dimainkan oleh peranti" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Salin ke peranti..." #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Salin ke pustaka..." #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:64 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: transcoder/transcoder.cpp:432 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Pengurus Kulit Album" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Seni kulit muka dimuat secara automatik dari %1" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "Seni kulit muka ditetap dari %1" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "" #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Tarikh dicipta" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Tarikg diubahsuai" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "Hari" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "Kurangkan kadar bunyi sebanyak 4%" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Kurangkan kadar bunyi" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Padamkan fail-fail" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Padamkan dari peranti..." #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Padam dari cakera..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "Padam senarai main pintar" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "Padamkan fail-fail asal" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Memadam fail-fail" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Destinasi" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Butir-butir..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Peranti" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Ciri-ciri Peranti" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Nama peranti" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Ciri-ciri peranti..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Peranti-peranti" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Adakah anda maksudkan" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Direktori" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Dilumpuhkan" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Cakera" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "Lakukan imbas semula pustaka penuh" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Jangan ulang" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "Jangan kocok" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "Jangan berhenti!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Dwi klik untuk buka" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "Dwi klik sesuatu lagu akan..." #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "Direktori muat turun" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "Keahlian muat turun" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Muat turun album ini" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Muat turun album ini..." #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "Muat Turun..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "Memuat turun direktori Icecast" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "Memuat turun katalog Jamendo" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "Memuat turun katalog Magnatune" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "Memuat turun plugin Spotify" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "Memuatturun metadata" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "Edit senarai main pintar..." #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Edit tag \"%1\"..." #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "Edit tag..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "Edit tag-tag" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Edit informasi trek" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "Edit informasi trek..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Edit informasi trek-trek..." #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Edit..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "Bolehkan sokongan Wii Remote" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "Bolehkan pintasan hanya apabila Clementine difokus" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "Masukkan nama baru bagi senarai main ini" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "Masukkan terma-terma carian di sini" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "Masukkan URL satu strim radio internet:" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "Kesemua koleksi" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Ralat" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Ralat menyambung peranti MTP" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "Ralat menyalin lagu-lagu" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "Ralat memadam lagu-lagu" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "Ralat memuat turun plugin Spotify" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "Ralat memuat %1" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "Ralat memproses %1: %2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:63 msgid "Ever played" msgstr "Pernah dimainkan" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:303 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:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "Laju" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "Trek-trek kegemaran" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "Format-format fail" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Nama fail" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Saiz fail" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Jenis fail" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Namafail" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Fail-fail" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "Fail-fail untuk transkod" #: smartplaylists/querywizardplugin.cpp:90 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." #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "Selesai" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "" #: core/song.cpp:328 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Saiz fon" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Atas sebab-sebab perlesenan sokongan Spotify berada dalam plugin berasingan." #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "Lupakan peranti" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "Format" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Kadar bingkai" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Rakan-rakan" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Bass Penuh" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "Bass Penuh + Treble" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "Treble Penuh" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "Enjin audio GStreamer" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Genre" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "Berikan ia nama" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "Pergi ke tab senarai main berikutnya" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "Pergi ke tab senarai main sebelumnya" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "Dapat %1 kulit muka daripada %2 (%3 gagal)" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "Kelabukan lagu yang tidak wujud dalam senarai main saya" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "Kumpulkan Pustaka mengikut..." #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "Kumpulkan mengikut" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "Kumpulkan mengikut Album" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "Kumpulkan mengikut Artis" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "Kumpulkan mengikut Artis/Album" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "Kumpulkan mengikut Artis/Tahun - Album" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "Kumpulkan mengikut Genre/Album" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "Kumpulkan mengikut Genre/Artis/Album" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "Proksi HTTP" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "Informasi perkakasan" #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "Informasi perkakasan hanya tersedia ketika peranti disambungkan." #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "Tinggi" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "Tinggi (%1 fps)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "Tinggi (1024x1024)" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "Jam" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "Saya tidak mempunyai akaun Magnatune" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Ikon" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "Ikon di atas" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "Mengenalpasti lagu" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 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:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "Pedulikan \"The\" dalam nama-nama artis" #: ui/albumcoverchoicecontroller.cpp:43 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "Imej-imej (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" #: ui/albumcoverchoicecontroller.cpp:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Imej-imej (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "Dalam mod dinamik trek-trek baru akan dipilih dan ditambah ke senarai main setiap kali lagu selesai." #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "Peti Masuk" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "Sertakan hasil seni album dalam pemberitahuan" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "Sertakan semua lagu" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "Naikkan kadar bunyi sebanyak 4%" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Naikkan kadar bunyi" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "Informasi" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Terpasang" #: core/database.cpp:673 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "Kunci API tidak sah" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Format tidak sah" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "Kaedah tidak sah" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "Servis tidak sah" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "Kunci sessi tidak sah" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "Trek-trek Paling Kerap Didengar Jamendo" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "Pangkalan data Jamendo" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "Kekalkan fail-fail asal" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Bahasa" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Dewan Besar" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "Kulim album besar" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "Terakhir dimainkan" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Pustaka Last.fm - %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Stesen Radio Last.fm - %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "" #: internet/lastfmservice.cpp:437 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:154 msgid "Last.fm password" msgstr "Kata laluan Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "Bilangan main Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Tag-tag Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Kata laluan Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Wiki Last.fm" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Panjang" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Pustaka" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "Notis imbas semula pustaka" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "Carian pustaka" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Had-had" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "" #: ui/equalizer.cpp:123 msgid "Live" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Muat" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "Muatkan kulit album dari URL" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "Muatkan kulit album dari URL..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "Muatkan kulit album dari cakera..." #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "Muatkan senarai main" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "Muatkan senarai main..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Memuat radio Last.fm" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Memuat peranti MTP" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "Memuat pangkalan data iPod" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "Memuat senarai main pintar" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "Memuat lagu-lagu" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "Memuat strim" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "Memuat trek-trek" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "Memuat info trek-trek" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "Memuat..." #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "Memuat fail-fail/URL, menggantikan senarai main semasa" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Log masuk" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "Suka" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Rendah (%1 fps)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "Rendah (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "Lirik-lirik" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "Lirik-lirik dari %1" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Muat Turun Magnatune" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Muat turun Magnatune selesai" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "Buatkan senarai main tersedia di luar talian" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "Konfigurasi proksi manual" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "Pengeluar" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "Kadar bit maksimum" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "Sederhana (%1 fps)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "Sederhana (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "Jenis keahlian" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "Kadar bit minimum" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "Model" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "Pantau pustaka untuk perubahan" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "Bulan" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "" #: library/library.cpp:74 msgid "Most played" msgstr "Dimain Terbanyak" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "Alih ke bawah" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "Alih ke pustaka..." #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "Alih ke atas" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Pustaka Muzik" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "Pustaka Last.fm Saya" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "Stesen Radio Saya" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "Cadangan Saya" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Nama" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "Opsyen -opsyen penamaan" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "Rangkaian" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "Proksi Rangkaian" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "" #: library/library.cpp:67 msgid "Never played" msgstr "Tidak pernah dimainkan" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "Senarai main baru" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "Senarai main pintar baru..." #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "Lagu-lagu baru" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "Trek-trek baru akan ditambah secara automatik" #: library/library.cpp:80 msgid "Newest tracks" msgstr "Trek-trek terbaru" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "Seterusnya" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Trek seterusnya" #: core/utilities.cpp:147 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:366 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:145 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "Tiada satupun lagu-lagu yang dipilih sesuai untuk disalin ke peranti" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "Tidak disambung" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "Tidak cukup kandungan" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "Tidak cukup peminat" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "Tidak cukup ahli" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Tidak dipasang" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "Jenis pemberitahuan" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Pemberitahuan" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Sekarang Dimainkan" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Flac Ogg" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Speex Ogg" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Vorbis Ogg" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 msgid "Only allow connections from the local network" msgstr "" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Hanya paparkan yang pertama" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "Opacity" msgstr "" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "" #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "Buka peranti" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "" #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "Buka dalam senarai main baru" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Buka..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "Operasi gagal" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "Opsyen..." #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "Aturkan Fail-fail" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "" #: core/organise.cpp:65 msgid "Organising files" msgstr "Mengatur fail-fail" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "Tag-tag asal" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Opsyen-opsyen lain" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "Tindih fail-fail sedia ada" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:124 msgid "Party" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "Kata laluan" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "Hentikan sebentar mainbalik" #: widgets/osd.cpp:156 msgid "Paused" msgstr "" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Mainkan" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "Mainkan Artis atau Tag" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "Mainkan radio artis..." #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "Bilangan main" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "" #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "Mainkan sekiranya telah dihenti, henti sebentar sekiranya sedang main" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "Mainkan sekiranya tiada apa yang tersedia main" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "Mainkan radio tag..." #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "Mainkan trek yang ke- dalam senarai main" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "Main/Henti sebentar" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Mainbalik" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Opsyen-opsyen pemain" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "Senarai main" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "Senarai main telah selesai" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "Opsyen-opsyen senarai main" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "Jenis senarai main" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "Status plugin:" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Pop" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "Tekankan satu kombinasi butang untuk digunakan bagi" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "Tekankan satu kekunci" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Tekankan satu kombinasi kekunci untuk digunakan bagi %1..." #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "Opsyen-opsyen OSD menarik" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "Trek sebelumnya" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "Profail" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "Kualiti" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "Memberi kadar populariti lagu semasa 0 bintang" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "Memberi kadar populariti lagu semasa 1 bintang" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "Memberi kadar populariti lagu semasa 2 bintang" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "Memberi kadar populariti lagu semasa 3 bintang" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "Memberi kadar populariti lagu semasa 4 bintang" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "Memberi kadar populariti lagu semasa 5 bintang" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "Kadar populariti" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "Betul batalkan?" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Reggae" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Buang" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "Buangkan tindakan" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "Buangkan folder" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "Buangkan dari senarai main" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "Namakan semula senarai main" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "Namakan semula senarai main..." #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "Nomborkan semula trek-trek mengikut tertib ini..." #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Ulang" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "Ulangkan album" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "Ulangkan senarai main" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "Ulangkan trek" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Gantikan senarai main semasa" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "Gantikan senarai main" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" 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:206 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "Buangkan peranti dengan selamat" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "Buangkan peranti dengan selamat selepas menyalin" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "Simpankan kulit album" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "Simpankan kulit album ke cakera..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "Simpankan imej" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "Simpankan senarai main" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "Simpankan senarai main..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "Menyimpan trek-trek" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "Cari" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "Cari Jamendo" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Cari Magnatune" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "Cari kulit album..." #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "Mod carian" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "Opsyen-opsyen carian" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "Terma-terma carian" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "Pilih semua" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "" #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "Nombor siri" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "Service di luar talian" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "Tetapkan kadar bunyi ke peratus" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Pintasan" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Tunjukkan" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "Tunjukkan OSD" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "Tunjukkan animasi bersinar di trek semasa" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Tunjukkan pemberitahuan bila saya ubah mod ulang/kocok" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "Tunjukkan pemberitahuan bila saya mengubah kadar bunyi" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "Tunjukkan popup dari dulang sistem" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "Tunjukkan OSD yang menarik" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "Tunjukkan di atas bar status" #: ui/mainwindow.cpp:460 msgid "Show all songs" msgstr "Tunjukkan semua lagu" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Tunjukkan kesemua lagu" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show cover art in library" msgstr "Tunjukkan seni kulit muka dalam pustaka" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "Tunjukkan pembahagi" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "Tunjukkan saiz penuh..." #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "Tunjukkan dalam pelayar fail" #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "Tunjukkan hanya yang tidak ditag" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "Tunjukkan bebutang \"love\" dan \"ban\"" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "Tunjukkan ikon dulang" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "Tunjukkan/Sembunyikan" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Kocok" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "Kocokkan semua" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "Kocokkan senarai main" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "Bilangan langkau" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "Kulit album kecil" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "Senarai main pintar" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "Informasi lagu" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "Info lagu" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "Maaf" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 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 "" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "Ralat log masuk Spotify" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "Plugin Spotify" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "Plugin Spotify tidak dipasang" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "Piawai" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "Disukai" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "Mulakan transkod" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "" #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Henti" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "Henti selepas" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "Henti selepas trek ini" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Hentikan mainbalik" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "Hentikan main selepas trek semasa" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "" #: core/song.cpp:341 msgid "Stream" msgstr "Strim" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "Tag-tag dicadangkan" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "Rumusan" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "Format-format disokong" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "Tab-tab di atas" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Tag" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "Pengambil tag" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "Radio tag" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "Kadar bit sasaran" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Tekno" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Terima kasih kepada" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "" #: smartplaylists/searchtermwidget.cpp:330 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 "" #: ui/coverfromurldialog.cpp:82 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Terdapat masalah mengambil metadata dari Magnatune" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:56 msgid "" "There were problems copying some songs. The following files could not be " "copied:" msgstr "Terdapat masalah menyalin beberapa lagu. Fail-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-fail berikut tidak boleh dipadam:" #: devices/deviceview.cpp:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Fail-fail ini akan dipadam dari peranti, adakah anda pasti untuk meneruskan?" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:174 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "Tetapan-tetapan ini akan digunakan dalam dialog \"Transkod Muzik\", dan bila menukar muzik sebelum disalin ke sesuatu peranti." #: ../bin/src/ui_groupbydialog.h:151 msgid "Third level" msgstr "" #: internet/jamendoservice.cpp:171 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/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 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-format fail yang ianya sokong." #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "Peranti ini menyokong format-format fail berikut:" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:567 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:324 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 menyambungkan peranti ini. Sekarang Clementine akan mengimbas peranti ini untuk mencari fail-fail muzik - ini mungkin mengambil masa." #: playlist/playlisttabbar.cpp:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "Strim ini untun pelanggan berbayar sahaja" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "Peranti jenis ini tidak disokong: %1" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Tajuk" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "Hari ini" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Trek" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "Opsyen-opsyen transkod" #: core/song.cpp:338 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "" #: devices/giolister.cpp:161 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "URL" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Tidak diketahui" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Ralat tidak diketahui" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "Kemaskinikan pustaka apabila Clemetine bermula" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Mengemaskini %1" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "Mengemaskini %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Mengemaskini pustaka" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "Penggunaan" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "Gunakan kekunci pintasan Gnome" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "Gunakan enjin pengurusan kadar bit" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "Gunakan mod dinamik" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "Gunakan pemberitahuan untuk laporkan status Wii Remote" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Nama pengguna" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "Menggunakan menu untuk menambah lagu akan..." #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "MP3 VBR" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "Pelbagai artis" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "Versi %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "Paparkan" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "Pengesanan aktiviti suara" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "Kadar bunyi %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "Minggu" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "Apabila Clementine bermula" #: ../bin/src/ui_librarysettingspage.h:204 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-fail gambar yang mengandungi salah satu dari perkataan-perkataan ini. \nSekiranya tiada padanan ia akan menggunakan imej terbesar dalam direktori." #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "Audio Windows Media" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "Inginkah anda menjalankan imbas semula penuh sekarang?" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "Tahun" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "Tahun - Album" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "Tahun" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "Semalam" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatunesettingspage.cpp:53 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-lagu Magnatune secara percuma tanpa akaun. Pembelian keahlian akan membuang mesej-mesej di akhir setiap trek." #: ../bin/src/ui_backgroundstreamssettingspage.h:57 msgid "You can listen to background streams at the same time as other music." msgstr "" #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "" #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "Anda suka trek ini" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "Anda perlu mulakan semula Clementine jika anda ubah bahasa." #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "Pustaka anda kosong!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "Strim radio anda" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Sifar" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "tambah %n lagu" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "selepas" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "yang lalu" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "dan" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "automatik" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "sebelum" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "antara" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "terbesar dahulu" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "mengandungi" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "dilumpuhkan" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "cakera %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "tidak mengandungi" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "berakhir dengan" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "sama" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "lebih besar daripada" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "kurang daripada" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "terpanjang dahulu" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "terbaru dahulu" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "opsyen-opsyen" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "buangkan %n lagu" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "terpendek dahulu" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "terkecil dahulu" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "bermula dengan" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "henti" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "trek %1" clementine-1.2.0+dfsg/src/translations/my.po000066400000000000000000006650611223327513400210710ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Yhal Htet Aung , 2013 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-17 05:44+0000\n" "Last-Translator: Yhal Htet Aung \n" "Language-Team: Burmese (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr "နေ့များ" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr "တစ်စက္ကန့်ကီလိုဘိုက်နှုန်း" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr "မိုက်ခရိုစက္ကန့်" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr "ပွိုင့်ပမာဏ" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr "စက္ကန့်များ" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "သီချင်းများ" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 အယ်လဘမ်များ" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 နေ့များ" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 လွန်ခဲ့သောနေ့များ" #: podcasts/gpoddersync.cpp:79 #, 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:413 #, qt-format msgid "%1 selected of" msgstr "%1 ကိုရွေးချယ်ခဲ့" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 သီချင်း" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 သီချင်းများ" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 သီချင်းများရှာတွေ့" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 သီချင်းများရှာတွေ့ (%2 ပြသနေ)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 တေးသံလမ်းကြောများ" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 ကူးပြောင်း" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: ဝီမိုတ်ဒပ်မော်ဂျူး" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n ဖွင့်မရ" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n ပြီးဆံုး" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "စိတ်ကြိုက်(&C)" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "အပိုများ(&E)" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "အကူအညီ(&H)" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "ဖုံးကွယ်(&H) %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "ဖုံးကွယ်(&H)... " #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "ဘယ်(&L)" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "ဂီတ(&M)" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "တစ်ခုမျှ(&N)" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "သီချင်းစာရင်း(&P)" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "ထွက်(&Q)" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "စနစ်ပြန်ဆို(&R)" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "ညာ(&R)" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "ကုလားဖန်ထိုးစနစ်(&S)" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "ဝင်းဒိုးနဲ့အံကိုက်ကော်လံများကိုဆွဲဆန့်(&S)" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "ကိရိယာများ(&T)" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(အမျိုးမျိုးသောသီချင်းများပေါင်းစုံဖြတ်၍)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "...နှင့်အမာရော့ခ်ကူညီသူများအားလံုး" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "၀" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "၀:၀၀:၀၀" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "၀ပီအိတ်စ်" #: core/utilities.cpp:108 msgid "1 day" msgstr "တစ်နေ့" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "တေးသံလမ်းကြောတစ်ခု" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "၁၂၇.၀.၀.၁" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "၁၂၈ကီလိုအမ်ပီသရီး" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "၄၀%" #: library/library.cpp:60 msgid "50 random tracks" msgstr "ကျပန်းတေးသံလမ်းကြောများ၅၀" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "အရစ်ကျစနစ်သို့အခုအဆင့်မြှင့်" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "စာရင်းအသစ်တစ်ခုဖန်တီး(သို့)စကားဝှက်ပြန်ပြောင်း" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr " ဂရုရှက်အန်နီးဝဲစာရင်းတစ်ခုလိုအပ်။" #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "စပေါ့တီဖိုင်းအရစ်ကျစနစ်စာရင်းတစ်ခုလိုအပ်။" #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "မှန်ကန်သောကုဒ်ထည့်သွင်းနိုင်မှသာအသံုးပြုသူဆက်သွယ်နိုင်။" #: smartplaylists/wizard.cpp:78 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:153 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "သီချင်းသည်လိုအပ်ချက်များနှင့်ပြည့်စံုပါကသီချင်းစာရင်းတွင်ထည့်သွင်းပါဝင်ပါလိမ့်မည်။" #: smartplaylists/searchterm.cpp:297 msgid "A-Z" msgstr "အေ-ဇီး" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "အေအေစီ" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "အေအေစီ၁၂၈ကီလို" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "အေအေစီ၃၂ကီလို" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "အေအေစီ၆၄ကီလို" #: core/song.cpp:336 msgid "AIFF" msgstr "အေအိုင်အက်ဖ်အက်ဖ်" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "အံ့မခန်းဖွယ်အားလံုးကိုဟိုက်ဖ်နိုဖားသို့" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "ဖျက်သိမ်း" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "ခန့် %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "ကလီမန်တိုင်းအကြောင်း" #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "ကျူတီအကြောင်း..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "စာရင်းအသေးစိတ်အကြောင်းအရာများ" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "စာရင်းအသေးစိတ်အကြောင်းအရာများ(အရစ်ကျစနစ်)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "လုပ်ဆောင်ချက်" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "ဝိုင်ယာမုတ်သက်ဝင်လှုပ်ရှား/သက်ဝင်မလှုပ်ရှား" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "ပို့စ်ကဒ်ထည့်" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "သီချင်းစီးကြောင်းထည့်" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "သတိပေးချက်ပုံစံလက်ခံပါကလိုင်းအသစ်ထည့်" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "လုပ်ဆောင်ချက်ထည့်ပါ" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "သီချင်းစီးကြောင်းနောက်တစ်ခုထည့်..." #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "ဖိုင်လမ်းညွှန်ထည့်..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "ဖိုင်ထည့်" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "ဖိုင်များကိုပံုစံပြောင်းလဲသူသို့ထည့်ပါ" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "ဖိုင်(များ)ကိုပံုစံပြောင်းလဲသူသို့ထည့်ပါ" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "ဖိုင်ထည့်..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "ဖိုင်များကိုပံုစံပြောင်းလဲရန်ထည့်ပါ" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "ဖိုင်တွဲထည့်" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "ဖိုင်တွဲထည့်..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "ဖိုင်တွဲအသစ်ထည့်..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "ပို့စ်ကဒ်ထည့်" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "ပို့စ်ကဒ်ထည့်..." #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "ရှာဖွေစကားရပ်ထည့်ပါ" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "သီချင်းတေးသံအမည်ထည့်" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "သီချင်းတေးသံအနုပညာရှင်အမည်ထည့်" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "သီချင်းအနုပညာရှင်အမည်ထည့်" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "အလိုအလျောက်သီချင်းရမှတ်ထည့်" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "သီချင်းတေးရေးအမည်ထည့်" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "သီချင်းချပ်ပြားဝိုင်းအမည်ထည့်" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "သီချင်းဖိုင်အမည်ထည့်" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "သီချင်းအမျိုးအစားအမည်ထည့်" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "သီချင်းအုပ်စုခြင်းအမည်ထည့်" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "သီချင်းအရှည်အမည်ထည့်" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "တင်ဆင်သူအုပ်စုခြင်းအမည်ထည့်" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "သီချင်းဖွင့်သံအရေအတွက်ထည့်" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "သီချင်းအဆင့်သတ်မှတ်ချက်ထည့်" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "သီချင်းကျော်သံအရေအတွက်ထည့်" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "သီချင်းခေါင်းစဉ်အမည်ထည့်" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "သီချင်းတေးသံလမ်းကြောအမည်ထည့်" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "သီချင်းနှစ်အမည်ထည့်" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "သီချင်းစီးကြောင်းထည့်..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "ဂရုရှက်အနှစ်သက်ဆုံးများသို့ထည့်" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "ဂရုရှက်သီချင်းစာရင်းများသို့ထည့်" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "သီချင်းစာရင်းနောက်တစ်ခုသို့ထည့်" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "သီချင်းစာရင်းသို့ထည့်" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "စီတန်းထဲသို့ထည့်ပါ" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "ဝီမိုတ်ဒပ်လုပ်ဆောင်ချက်ကိုထည့်" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "ထည့်..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "ယခုလကိုထည့်သွင်းပြီး" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "ယခုအပတ်ကိုထည့်သွင်းပြီး" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "ယခုနှစ်ကိုထည့်သွင်းပြီး" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "ယခုနေ့ကိုထည့်သွင်းပြီး" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "၃လအတွင်းထည့်သွင်းပြီး" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "ငါ့ဂီတသို့သီချင်းများထည့်" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "အနှစ်သက်ဆုံးများသို့သီချင်းများထည့်" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "အဆင့်မြင့်အုပ်စုဖွဲ့ခြင်း..." #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "ပြီးနောက်" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "ကူးယူပြီးနောက်..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "အယ်လဘမ်" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "အယ်လဘမ် (တေးသံလမ်းကြောများအားလံုးအတွက်အကောင်းဆုံးအသံကျယ်ကျယ်)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "အယ်လဘမ်အနုပညာရှင်" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "အယ်လဘမ်အဖုံး" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "ဂျမန်ဒို.ကွမ်းမှအယ်လဘမ်အချက်အလက်..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "အဖုံးများနဲ့အယ်လဘမ်များ" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "အဖုံးများနဲ့အယ်လဘမ်များ" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "ဖိုင်များအားလံုး(*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "အံ့မခန်းဖွယ်အားလံုးကိုဟိုက်ဖ်နိုဖားသို့!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "အယ်လဘမ်များအားလံုး" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "အနုပညာရှင်များအားလံုး" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "ဖိုင်များအားလံုး(*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "သီချင်းစာရင်းများအားလံုး(%1)" #: ui/about.cpp:74 msgid "All the translators" msgstr "ဘာသာပြန်များအားလံုး" #: library/library.cpp:84 msgid "All tracks" msgstr "တေးသံလမ်းကြောများအားလံုး" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "ယခုကွန်ပျုတာမှသီချင်းကူးဆွဲရန်အသုံးပြုသူကိုခွင့်ပြု။" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "ကူးဆွဲများခွင့်ပြု" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "အလယ်/ဘေးကုဒ်ပြောင်းခွင့်ပြု" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "မူရင်းများနှင့်အတူ" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "အဓိကဝင်းဒိုးအမြဲတမ်းဖုံးကွယ်" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "အဓိကဝင်းဒိုးအမြဲတမ်းပြသ" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "သီချင်းအမြဲတမ်းစတင်ဖွင့်" #: internet/spotifyblobdownloader.cpp:60 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "စပေါ့တီဖိုင်ကိုကလီမန်တိုင်းတွင်အသံုးပြုရန်နောက်ထပ်ဖြည့်စွက်ပရိုဂရမ်လိုအပ်။ သင်ကူးဆွဲပြီးယခုသွင်းလိုပါသလား?" #: devices/gpodloader.cpp:61 msgid "An error occurred loading the iTunes database" msgstr "အိုင်ကျွန်းအချက်အလက်အစုထည့်သွင်းနေစဉ်အမှားပြ" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "'%1' သို့အချက်အလက်ဖွဲ့စည်းမှုရေးနေစဉ်အမှားပြ" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "အမှားသေချာမသိဖြစ်ပေါ်။" #: ui/about.cpp:78 msgid "And:" msgstr "နှင့်:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "ဒေါသထွက်" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "ပုံပန်းသဏ္ဎာန်" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "ဖိုင်များ/ယူအာအလ်များသီချင်းစာရင်းသို့ဖြည့်စွက်" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "ယခုသီချင်းစာရင်းသို့ဖြည့်စွက်" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "သီချင်းစာရင်းသို့ဖြည့်စွက်" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "ဖြတ်ညှပ်ခံရခြင်းကာကွယ်ရန်ချုံ့" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "ယခု \"%1\" ကြိုတင်ထိန်းညှိပယ်ဖျက်မှာသေချာသလား?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "ဒီသီချင်းစာရင်းပယ်ဖျက်မှာသေချာသလား?" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "ယခုသီချင်းစာရင်းဇယားပြန်လည်ထိန်းညှိမှာသေချာသလား?" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "အနုပညာရှင်" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "အနုပညာရှင်အချက်အလက်" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "အနုပညာရှင်ရေဒီယို" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "အနုပညာရှင်အမည်များ" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "အနုပညာရှင်အမည်၏အစ" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "အသံပုံစံ" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "အထောက်အထားစစ်ဆေးခြင်းမမှန်" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "စာဆို" #: ui/about.cpp:65 msgid "Authors" msgstr "စာဆိုများ" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "အလိုအလျောက်" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "အလိုအလျောက်မွမ်းမံခြင်း" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "သီချင်းတိုက်ဖွဲ့စည်းပံုမှာတစ်ခုတည်းအတန်းအစားများအလိုအလျောက်ဖွင့်" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "ရနိုင်" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "ပျမ်းမျှဘစ်နှုန်း" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "ပျမ်းမျှပုံအရွယ်အစား" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "ဘီဘီစီပို့စ်ကဒ်များ" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "ဘီပီအမ်" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "နောက်ခံသီချင်းစီးကြောင်းများ" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "နောက်ခံအရောင်" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "နောက်ခံပုံ" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "နောက်ခံအလင်းပိတ်" #: core/database.cpp:734 msgid "Backing up database" msgstr "အချက်အလက်အစုအရန်မှတ်သိမ်း" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "ချိန်ညှိချက်" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "တားမြစ်" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "တိုင်စိစစ်သူ" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "အခြေခံအပြာရောင်" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "အခြေခံအသံအမျိုးအစား" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "လုပ်ဆောင်ပုံ" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "အကောင်းဆုံး" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "%1 မှအတ္ထုပ္ပတ္တိ" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "ဘစ်နှုန်း" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "ဘစ်နှုန်း" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "ဘလောက်စိစစ်သူ" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "ဘလောက်အမျိုးအစား" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "မှုန်ဝါးပမာဏ" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "စာကိုယ်" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "မြည်ဟိန်းသံစိစစ်သူ" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "သေတ္တာ" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "လျှောက်ကြည့်..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "ကြားခံကြာချိန်" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "ကြားခံ" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "သို့သော်ရင်းမြစ်များမလုပ်ဆောင်နေ:" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "ခလုတ်များ" #: core/song.cpp:339 msgid "CDDA" msgstr "စီဒီဒီအေ" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "ကယူးအပြားအထောက်အကူ" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "ပယ်ဖျက်" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "အနုပညာအဖုံးပြောင်းလဲ" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "ဖွန်အရွယ်ပြောင်းလဲ" #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "ပြန်ဆိုစနစ်ပြောင်းလဲ" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "အတိုကောက်ပြောင်းလဲ..." #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "ကုလားဖန်ထိုးစနစ်ပြောင်းလဲ" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "ဒီဘာသာစကားပြောင်းလဲ" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "ပြန်ဖွင့်လိုလားချက်များပြောင်းလဲခြင်းသည်နောက်ဖွင့်ဆဲသီချင်းများတွင်သက်ရောက်မှုရှိ" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "တွဲအသစ်များစစ်ဆေးခြင်း" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "မွမ်းမံများစစ်ဆေးခြင်း..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "သင့်ရဲ့ချက်ချာသီချင်းစာရင်းအတွက်နာမည်တစ်ခုရွေး" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "အလိုအလျောက်ရွေးချယ်ခြင်း" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "အရောင်ရွေးချယ်..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "ဖွန်ရွေးချယ်..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "စာရင်းမှရွေး" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "သီချင်းစာရင်းကိုဘယ်သို့မျိုးတူစုမည်၊ ပြီးနောက်သီချင်းဘယ်နှစ်ပုဒ်ပါဝင်မည်ဟုရွေးချယ်ပါ" #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "ပို့စ်ကဒ်ကူးဆွဲဖိုင်လမ်းညွှန်ရွေးချယ်" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "သီချင်းစာသားများရှာဖွေရန်ကလီမန်တိုင်းအသံုးချ၍ဝက်ဘ်ဆိုက်များရွေးချယ်" #: ui/equalizer.cpp:115 msgid "Classical" msgstr "ဂန္တဝင်" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "ရှင်းထုတ်ဖြစ်" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "ဖယ်ထုတ်" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "သီချင်းစာရင်းဖယ်ထုတ်" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "ကလီမန်တိုင်း" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "ကလီမန်တိုင်းအမှားပြ" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "ကလီမန်တိုင်းလိမ္မော်" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "ကလီမန်တိုင်းပုံဖော်ကြည့်ခြင်း" #: ../bin/src/ui_deviceproperties.h:376 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "လက်ရိုပစ္စည်းသို့ကူးယူကာပစ္စည်းမှဖွင့်နိုင်သောပုံစံသို့ကလီမန်တိုင်းသည်ဂီတကိုအလိုအလျောက်ကူးပြောင်းနိုင်" #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "ဘောက်စ်သို့ကူးတင်ပြီးဂီတများကိုကလီမန်တိုင်းဖွင့်နိုင်" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "တရော့ဘောက်စ်သို့ကူးတင်ပြီးဂီတများကိုကလီမန်တိုင်းဖွင့်နိုင်" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "ဂူဂယ်ဒရိုက်ဗ်သို့ကူးတင်ပြီးဂီတများကိုကလီမန်တိုင်းဖွင့်နိုင်" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "ဦးဘွန်တူးဝမ်းသို့ကူးတင်ပြီးဂီတများကိုကလီမန်တိုင်းဖွင့်နိုင်" #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "တေးသံလမ်းကြောင်းပြောင်းလဲသွားသောအခါကလီမန်တိုင်းသည်မှာကြားချက်ပြသနိုင်" #: ../bin/src/ui_podcastsettingspage.h:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "ကလီမန်တိုင်းသည်မှာယူခြင်းစာရင်းရှိတစ်ခြားကွန်ပျုတာများနှင့်ပို့စ်ကဒ်လုပ်ငန်းသုံးပရိုဂရမ်များနှင့်တစ်သားတည်းလုပ်ဆောင်နိုင်။စာရင်းဖန်တီးပါ." #: visualisations/projectmvisualisation.cpp:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "ပရောဂျက်အမ်ပုံဖော်ကြည့်ခြင်းများတစ်ခုမျှကလီမန်တိုင်းမထည့်သွင်းနိုင်။ ကလီမန်တိုင်းသေချာစွာသွင်းပြီးကြောင်းစစ်ဆေးပါ။" #: internet/lastfmsettingspage.cpp:110 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 "သင့်ရဲ့ဆက်သွယ်မှု၌ပြသနာများကြုံနေ၍ကလီမန်တိုင်းမှမှာယူခြင်းအခြေအနေမယူဆောင်နိုင်ပါ။ ဖွင့်ပြီးတေးသံလမ်းကြောများကိုမှတ်သား၍လက်စ်.အက်ဖ်အမ်သို့မကြာမီပေးပို့မည်။" #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "ကလီမန်တိုင်းပုံကြည့်ကိရိယာ" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "ယခုဖိုင်အတွက်ရလဒ်များကလီမန်တိုင်းမရှာဖွေနိုင်။" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "ကလီမန်တိုင်းသည်ဂီတကိုဤတွင်ရှာဖွေ: " #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "ဂီတအနည်းငယ်ထည့်ရန်ဒီမှာကလစ်နှိပ်ပါ" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "လက်ကျန်အချိန်နှင့်စုစုပေါင်းအချိန်အကြားဖွင့်ပိတ်လုပ်ရန်ကလစ်နှိပ်" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "သီချင်းစာရင်းပိတ်" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "ပုံဖော်ကြည့်ခြင်းပိတ်" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "ယခုဝင်းဒိုးပိတ်လျှင်ကူးဆွဲပယ်ဖျက်သွားလိမ့်မည်။" #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "ယခုဝင်းဒိုးပိတ်လျှင်အယ်လဘမ်အဖုံးများရှာဖွေခြင်းရပ်သွားလိမ့်မည်။" #: ui/equalizer.cpp:116 msgid "Club" msgstr "ကလပ်" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Colors" msgstr "အရောင်များ" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "အမျိုးအစားစာရင်းခွဲခြားရန်ပုဒ်ရပ်: အမျိုးအစား, အမျိုးအစားက ၀-၃" #: playlist/playlist.cpp:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "ထင်မြင်ချက်" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "အမည်များအလိုအလျောက်ဖြည့်" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "အမည်များအလိုအလျောက်ဖြည့်..." #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "တေးရေး" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "ပုံစံပြင် %1..." #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "ဂရုရှက်ပုံစံပြင်..." #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "လက်စ်.အက်ဖ်အမ်ပုံစံပြင်..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "မက်နာကျွန်းပုံစံပြင်..." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "အတိုကောက်များပုံစံပြင်" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "စပေါ့တီဖိုင်ပုံစံပြင်..." #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "ဆပ်ဆိုးနစ်ပုံစံပြင်..." #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "အနှံ့ရှာဖွေပုံစံပြင်..." #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "သီချင်းတိုက်ပုံစံပြင်..." #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "ပို့စ်ကဒ်များပုံစံပြင်..." #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "ပုံစံပြင်..." #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "သက်ဝင်လှုပ်ရှား/သက်ဝင်မလှုပ်ရှားလုပ်ဆောင်ချက်သံုး၍ဝီအဝေးထိန်းကိုချိတ်ဆက်" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "ပစ္စည်းချိတ်ဆက်" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "စပေါ့တီဖိုင်သို့ချိတ်ဆက်" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "ဆာဗာမှဆက်သွယ်ခြင်းငြင်းပယ်၊ဆာဗာယူအာအယ်ပြန်စစ်ဆေးပါ။ ဥပမာ: http://localhost:4040/" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "ဆက်သွယ်ချိန်ကုန်ဆံုး၊ ဆာဗာယူအာအယ်ပြန်စစ်ဆေးပါ။ ဥပမာ: http://localhost:4040/" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "ခလုတ်ခုံ" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "ကိန်းသေဘစ်နှုန်း" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "ဂီတအားလံုးကူးပြောင်း" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "ယခုပစ္စည်းမဖွင့်နိုင်သောဂီတမျိုးစံုကူးပြောင်း" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "အောက်ခံကတ်ပြားသို့ကူးယူ" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "ပစ္စည်းသို့ကူးယူ" #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "သီချင်းတိုက်သို့ကူးယူ..." #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "မူပိုင်ခွင့်" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "ဆပ်ဆိုးနစ်သို့မဆက်သွယ်နိုင်၊ ဆာဗာယူအာအယ်ပြန်စစ်ဆေးပါ။ ဥပမာ: http://localhost:4040/" #: transcoder/transcoder.cpp:64 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "ဂျီသီချင်းစီးကြောင်းအစိတ်အပိုင်းမဖန်တီးနိင် \"%1\" - လိုအပ်သောဂျီသီချင်းစီးကြောင်းဖြည့်စွက်ပရိုဂရမ်များအားလံုးသွင်းပြီးပါစေ" #: transcoder/transcoder.cpp:432 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "%1 အတွက်မြုစာမရှာဖွေနိင်၊ ဂျီသီချင်းစီးကြောင်းလိုအပ်သောဖြည့်စွက်ပရိုဂရမ်များသွင်းပြီးမပြီးစစ်ဆေး" #: transcoder/transcoder.cpp:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "%1 အတွက်သီချင်းပြောင်းသူမရှာဖွေနိင်၊ ဂျီသီချင်းစီးကြောင်းလိုအပ်သောဖြည့်စွက်ပရိုဂရမ်များသွင်းပြီးမပြီးစစ်ဆေး" #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "လက်စ်.အက်ဖ်အမ်ရေဒီယိုထုတ်လွှင့်မှုဌာနမထည့်သွင်းနိုင်" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "ပေးပို့ဖိုင်ဖွင့်မရ %1" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "အဖုံးမန်နေဂျာ" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "ပုံမြှပ်မှအနုပညာအဖုံး" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "%1 မှအနုပညာအဖုံးအလိုအလျောက်ထည့်သွင်း" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "အနုပညာအဖုံးလက်အားသံုးမသတ်မှတ်" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "အနုပညာအဖုံးသတ်မှတ်မထား" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "%1 မှအနုပညာအဖုံးသတ်မှတ်" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "%1 မှအဖုံးများ" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "ဂရုရှက်သီချင်းစာရင်းအသစ်တစ်ခုဖန်တီး" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "တေးသံလမ်းကြောများအလိုအလျောက်ပြောင်းလဲသွားသောအခါအရောင်မှိန်ဖြတ်သန်း" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "တေးသံလမ်းကြောများလက်အားသံုးပြောင်းလဲသွားသောအခါအရောင်မှိန်ဖြတ်သန်း" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "ကွန်+အော်+ဗီ" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "ကွန်+ဘီ" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "ကွန်+အောက်" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "ကွန်+အီး" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "ကွန်+အိပ်ရ့်ှ" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "ကွန်+ဂျေ" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "ကွန်+ကေ" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "ကွန်+အယ်လ်" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "ကွန်+အမ်" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "ကွန်+အန်" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "ကွန်+အို" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "ကွန်+ပီ" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "ကွန်+ကျူ" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "ကွန်+အက်စ်" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "ကွန်+ရှစ်ပ်+အေ" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "ကွန်+ရှစ်ပ်+အို" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "ကွန်+တီ" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "ကွန်+အပေါ်" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "စိတ်ကြိုက်" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "စိတ်ကြိုက်ပုံ:" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "စိတ်ကြိုက်မှာကြားချက်ချိန်ညှိချက်" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "စိတ်ကြိုက်ရေဒီယို" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "စိတ်ကြိုက်..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "ဒီဘတ်စ်လမ်းကြောင်း" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "အက" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "ရက်စွဲဖန်တီးပြီး" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "ရက်စွဲမွမ်းမံပြီး" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "နေ့များ" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "မူလအခြေအနေ(&f)" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "အသံပမာဏ၄%ခန့်လျှော့ချ" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "အသံပမာဏ ရာခိုင်နှုန်းခန့်လျှော့ချ" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "အသံပမာဏလျှော့ချ" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "မူလပံုစံနောက်ခံပုံ" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "မူလပံုစံများ" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "ပုံဖော်ကြည့်ခြင်းများအကြားနှောင့်နှေး" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "ပယ်ဖျက်" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "ဂရုရှက်သီချင်းစာရင်းပယ်ဖျက်" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "ကူးဆွဲပြီးအချက်အလက်ပယ်ဖျက်" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "ဖိုင်များပယ်ဖျက်" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "ပစ္စည်းမှပယ်ဖျက်..." #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "ဓာတ်ပြားမှပယ်ဖျက်..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "ဖွင့်ပြီးတွဲများပယ်ဖျက်" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "ကြိုတင်ထိန်းညှိပယ်ဖျက်" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "ချက်ချာသီချင်းစာရင်းပယ်ဖျက်" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "မူရင်းဖိုင်များပယ်ဖျက်" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "ဖိုင်များပယ်ဖျက်နေ" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "ရွေးချယ်တေးသံလမ်းကြောများမစီတန်း" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "တေးသံလမ်းကြောမစီတန်း" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "သွားမည့်နေရာ" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "အသေးစိတ်အကြောင်းအရာများ..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "ပစ္စည်း" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "ပစ္စည်းဂုဏ်သတ္တိများ" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "ပစ္စည်းနာမည်" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "ပစ္စည်းဂုဏ်သတ္တိများ..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "ပစ္စည်းများ" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "သင်ဆိုလိုခဲ့သလား" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "ကွန်ပျုတာစနစ်ဖြင့်တင်သွင်း" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "စကားဝှက်ကွန်ပျုတာစနစ်ဖြင့်တင်သွင်း" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "အသင်းဝင်အမည်ကွန်ပျုတာစနစ်ဖြင့်တင်သွင်း" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "အင်တာနက်တိုက်ရိုက်ဆက်သွယ်မှု" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "ဖိုင်လမ်းညွှန်" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "ကြာချိန်မလုပ်ဆောင်စေ" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "စိတ်နေစိတ်ထားဘားမျဉ်းတိုးတက်လာမှုမလုပ်ဆောင်စေ" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "မလုပ်ဆောင်စေ" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "ချပ်ပြားဝိုင်း" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "ဆက်လက်မထုတ်လွှင့်ခြင်း" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "ပြသခြင်းရွေးပိုင်ခွင့်များ" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "ဖန်သားပြင်ပေါ်ပံုရိပ်ပြသခြင်း" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "သီချင်းတိုက်အပြည့်ပြန်လည်ဖတ်ရှု" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "ဂီတတစ်ခုမှမကူးပြောင်း" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "အစားထိုးမရေး" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "မပြန်ဆို" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "အနုပညာရှင်များအမျိုးမျိုးမပြသ" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "ကုလားဖန်မထိုး" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "မရပ်ဆိုင်းနဲ့!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "လှုဒါန်း" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "ဖွင့်ရန်ကလစ်နှစ်ခါနှိပ်" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "ကလစ်နှစ်ခါနှိပ်ခြင်းဖြင့်သီချင်းဟာ..." #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "တွဲများ %n ကူးဆွဲ" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "ဖိုင်လမ်းညွှန်ကူးဆွဲ" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "သို့တွဲများကူးဆွဲ" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "အသင်းဝင်ကူးဆွဲ" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "တွဲအသစ်များအလိုအလျောက်ကူးဆွဲ" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "စီတန်းပြီးကူးဆွဲ" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "စက်ရုပ်အပ်များကူးဆွဲ" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "ဒီအယ်လဘမ်ကူးဆွဲ" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "ဒီအယ်လဘမ်ကူးဆွဲ..." #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "ဒီတွဲကူးဆွဲ" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "ကူးဆွဲ..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "ကူးဆွဲ(%1%)..." #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "အိုင့်ကက်စ်ဖိုင်လမ်းညွှန်ကူးဆွဲနေ" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "ဂျမန်တိုစာရင်းကူးဆွဲနေ" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "မက်နကျွန်းစာရင်းကူးဆွဲနေ" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "စပေါ့တီဖိုင်ဖြည့်စွက်ပရိုဂရမ်ကူးဆွဲနေ" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "အချက်အလက်ဖွဲ့စည်းမှုကူးဆွဲနေ" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "ပြန်လည်နေရာချထားရန်တရွတ်တိုက်ဆွဲ" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "တရော့ဘောက်စ့်" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "စနစ်အရှင်ဖွင့်ထား" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "ကျပန်းရောသမမွှေအရှင်" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "ချက်ချာသီချင်းစာရင်းပြင်ဆင်..." #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "အမည်ပြင်ဆင် \"%1\"..." #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "အမည်ပြင်ဆင်..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "အမည်များပြင်ဆင်..." #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "တေးသံလမ်းကြောအချက်အလက်ပြင်ဆင်" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "တေးသံလမ်းကြောအချက်အလက်ပြင်ဆင်..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "တေးသံလမ်းကြောများအချက်အလက်ပြင်ဆင်..." #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "ပြင်ဆင်..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "ဝီအဝေးထိန်းအထောက်အကူလုပ်ဆောင်စေ" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "အသံထိန်းညှိသူလုပ်ဆောင်စေ" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "ကလီမန်တိုင်းအလုပ်လုပ်နေစဉ်အတိုကောက်များလုပ်ဆောင်စေ" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "ရှာဖွေရလဒ်များတွင်ပါဝင်စေရန်အောက်ရှိရင်းမြစ်များကိုလုပ်ဆောက်စေ။ ရလဒ်များအစဉ်အလိုက်ပြသလိမ့်မည်။" #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "လက်စ်.အက်ဖ်အမ်အလိုအလျောက်သီချင်းနာမည်ပေးပို့ခြင်းလုပ်ဆောင်စေ/မလုပ်ဆောင်စေ" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "ရှုပ်ထွေးမှုကုဒ်ပြောင်း" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "အင်ဂျင်အရည်အသွေးကုဒ်ပြောင်း" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "စနစ်ကုဒ်ပြောင်း" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "ယူအာအလ်ထည့်" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "အင်တာနက်မှအဖံုးများကူးဆွဲရန်ယူအာအလ်ထည့်ပါ:" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "တင်ပို့ပြီးအဖံုးများအတွက်ဖိုင်နာမည်ထည့်(နောက်ဆက်တွဲမပါ):" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "ဒီသီချင်းစာရင်းအတွက်နာမည်အသစ်တစ်ခုရွေး" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "လက်စ်.အက်ဖ်အမ်ရေဒီယိုစတင်နားထောင်ရန် အနုပညာရှင် သို့ အမည် ထည့်ပါ။" #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "ကွန်ပျုတာနှင့်အင်တာနက်ပေါ်တွင်ဂီတရှာဖွေရန်ရှာဖွေရလဒ်များကိုအပေါ်တွင်ထည့်သွင်းပါ" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "အိုင်ကျွန်းစတိုးထဲရှိပို့စ်ကဒ်များကိုရှာဖွေရန်ရှာဖွေစကားရပ်များကိုအောက်တွင်ထည့်သွင်းပါ" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "ဂျီပေါ့တာ.နက်ထဲရှိပို့စ်ကဒ်များကိုရှာဖွေရန်ရှာဖွေစကားရပ်များကိုအောက်တွင်ထည့်သွင်းပါ" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "ရှာဖွေစကားရပ်များဒီမှာထည့်သွင်း" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "အင်တာနက်ရေဒီယိုသီချင်းစီးကြောင်းယူအာအလ်ထည့်:" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "ဒီဖိုင်တွဲအတွက်နာမည်အသစ်တစ်ခုရွေး" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "ကလီမန်တိုင်းသို့ချိတ်ဆက်ရန်ယခုအပ်တွင်အိုင်ပီထည့်သွင်းပါ။" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "စုပေါင်းမှုတစ်ခုလုံး" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "အမှားပြ" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "အမ်တီပီပစ္စည်းချိတ်ဆက်မှုအမှားပြ" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "သီချင်းများကူးယူမှုအမှားပြ" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "သီချင်းများပယ်ဖျက်မှုအမှားပြ" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "စပေါ့တီဖိုင်ဖြည့်စွက်ပရိုဂရမ်ကူးဆွဲမှုအမှားပြ" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "ထည့်သွင်းခြင်းအမှားပြ %1" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "ဒီအိုင်.အက်ဖ်အမ်သီချင်းစာရင်းထည့်သွင်းအမှားပြ" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "ဆောင်ရွက်ခြင်းအမှားပြ %1: %2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "အသံဓာတ်ပြားထည့်သွင်းနေခြင်းအမှားပြ" #: library/library.cpp:63 msgid "Ever played" msgstr "သီချင်းဖွင့်ခဲ့သမျှ" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "၁၀မိနစ်တိုင်း" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "၁၂နာရီတိုင်း" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "၂နာရီတိုင်း" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "မိနစ်၂၀တိုင်း" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "မိနစ်၃၀တိုင်း" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "၆နာရီတိုင်း" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "နာရီတိုင်း" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "အယ်လဘမ်တူသို့ကယူးအပြားပေါ်မှတေးသံလမ်းကြောများအကြားမှလွဲ၍" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "တည်ရှိပြီးအဖံုးများ" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "ချဲ့တွင်" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "%1 တွင်သက်တမ်းကုန်" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "အဖံုးများတင်ပို့" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "အဖံုးများတင်ပို့" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "ကူးဆွဲပြီးအဖံုးများတင်ပို့" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "အဖံုးမြှပ်များတင်ပို့" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "တင်ပို့ခြင်းပြီးဆံုး" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "တင်ပို့ပြီး %1 အဖံုးများရရှိ %2 မှ (%3 ခုန်ကျော်)" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "အက်ဖ်၁" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "အက်ဖ်၂" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "အက်ဖ်၅" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "အက်ဖ်၆" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "အက်ဖ်၇" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "အက်ဖ်၈" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "အက်ဖ်အယ်အေစီ" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "ရပ်တန့်နေစဥ်အပြင်သို့အရောင်မှိန်၊ပြန်စလျှင်အတွင်းသို့အရောင်မှိန်" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "တေးသံလမ်းကြောရပ်နေစဉ်အပြင်သို့အရောင်မှိန်" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "အရောင်မှိန်" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "အရောင်မှိန်ကြာချိန်" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "ဖိုင်လမ်းညွှန်များယူဆောင်ခြင်းမရ" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "ပို့စ်ကဒ်များယူဆောင်ခြင်းမရ" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "ပို့စ်ကဒ်များထည့်သွင်းခြင်းမရ" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "အာအက်စ်အက်စ်ဖိဒ်များအတွက်အိက်စ်အမ်အယ်ကိုမရယူနိင်" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "မြန်သော" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "အနှစ်သက်ဆုံးများ" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "အနှစ်သက်ဆုံးတေးသံလမ်းကြောများ" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "ပျောက်နေသောအဖံုးများယူဆောင်" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "အလိုအလျောက်ယူဆောင်ခြင်း" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "ယူဆောင်ခြင်းပြီးဆံုး" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "ဆပ်ဆိုးနစ်သီချင်းတိုက်ယူဆောင်နေ" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "အဖုံးအမှားယူဆောင်နေ" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "ဖိုင်နောက်ဆက်တွဲ" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "ဖိုင်ပုံစံများ" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "ဖိုင်နာမည်" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "ဖိုင်နာမည် (လမ်းကြောင်းနှင့်မဟုတ်)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "ဖိုင်ပမာဏ" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "ဖိုင်အမျိုးအစား" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "ဖိုင်နာမည်" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "ဖိုင်များ" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "ဖိုင်များကိုပံုစံပြောင်းလဲ" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "သတ်မှတ်ထားသောစံဟပ်စပ်သောသီချင်းများသီချင်းတိုက်တွင်ရှာဖွေ" #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "လက်ဗွေနှိပ်သီချင်း" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "ပြီးဆုံး" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "ပထမဆံုးအဆင့်" #: core/song.cpp:328 msgid "Flac" msgstr "အက်ဖ်အယ်အေစီ" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "ဖွန်ပမာဏ" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "လိုင်စင်အကြောင်းများကြောင့်စပေါ့တီဖိုင်အထောက်အကူသည်ဖြည့်စွက်ပရိုဂရမ်တွင်ပါဝင်။" #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "အတင်းမိုနိကုဒ်ပြောင်း" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "ပစ္စည်းမေ့ပြစ်" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "ပုံစံ" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "ပုံစံချ" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "ဘောင်နှုန်း" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "ကြားခံတစ်ခုမှဘောင်များ" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "သူငယ်ချင်းများ" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "လှုပ်မရ" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "ဘက်စ်အပြည့်" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "ဘက်စ်အပြည့် + အမြင့်သံ" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "အမြင့်သံအပြည့်" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "ဂျီသီချင်းစီးကြောင်းအသံအင်ဂျင်" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "အထွေထွေ" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "အထွေထွေချိန်ညှိချက်" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "အမျိုးအစား" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "ဂရုရှက်သီချင်းစာရင်းမျှဝေရန်ယူအာအယ်ရယူ" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "ဂရုရှက်သီချင်းမျှဝေရန်ယူအာအယ်ရယူ" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "ဂရုရှက်ရေပန်းစားဆံုးသီချင်းများရယူခြင်း" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "လေလှိုင်းများရယူခြင်း" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "သီချင်းစီးကြောင်းများရယူခြင်း" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "ဒီဟာကိုနာမည်ပေး:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "သွား" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "နောက်သီချင်းစာရင်းမျက်နှာစာသို့သွား" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "ယခင်သီချင်းစာရင်းမျက်နှာစာသို့သွား" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "ဂူဂယ်ဒရိုက်ဗ်" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "%1 အဖံုးများရရှိ %2 မှ (%3 ) ဖွင့်မရ" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "သီချင်းစာရင်းများတွင်မရှိနေသောသီချင်းများကိုမီးခိုးရောင်ပြ" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "ဂရုရှက်" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "ဂရုရှက်ဖွင့်ဝင်အမှားပြ" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "ဂရုရှက်သီချင်းစာရင်းယူအာအလ်" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "ဂရုရှက်ရေဒီယို" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "ဂရုရှက်သီချင်းယူအာအလ်" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "သီချင်းတိုက်အုပ်စုအလိုက်" #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "အုပ်စုအလိုက်" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "အယ်လဘမ်အုပ်စုအလိုက်" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "အနုပညာရှင်အုပ်စုအလိုက်" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "အနုပညာရှင်/အယ်လဘမ်အုပ်စုအလိုက်" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "အနုပညာရှင်/နှစ် - အယ်လဘမ်အုပ်စုအလိုက်" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "အမျိုးအစား/အယ်လဘမ်အုပ်စုအလိုက်" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "အမျိုးအစား/အနုပညာရှင်/အယ်လဘမ်အုပ်စုအလိုက်" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "အုပ်စုအလိုက်စုခြင်း" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "အာအက်စ်အက်စ်ဖိဒ်တစ်ခုမှဟိတ်စ်တီအမ်အယ်စာမျက်နှာတွင်မရှိပါ" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "ယူအာအယ်မရှိပဲအိတ်ပ်တီတီပီ ၃XX အချက်အလက်ပြကုဒ်ကိုလက်ခံရရှိ၊ ဆာဗာပုံစံပြင်ခြင်းကိုလုပ်ပါ။" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "အိပ်စ်တီတီပီပရောက်ဇီ" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "ပျော်ရွှင်" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "ဟက်တ်ဝဲအချက်အလက်" #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "ပစ္စည်းဆက်သွယ်နေစဉ်မှသာဟက်တ်ဝဲအချက်အလက်ရနိုင်" #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "မြင့်" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "မြင့် (%1 အက်ဖ်ပီအက်စ်)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "မြင့် (၁၀၂၄x၁၀၂၄)" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "လက်ခံရှာမတွေ့၊ဆာဗာယူအာအယ်ပြန်စစ်ဆေးပါ။ ဥပမာ: http://localhost:4040/" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "နာရီများ" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "ဟိုက်ဖ်နိုဖား" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "ငါ့ဆီမှာမက်နာကျွန်းစာရင်းမရှိပါ" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "သင်္ကေတ" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "သင်္ကေတများကိုအပေါ်သို့" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "သီချင်းများစစ်ရွေးနေ" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "ဆက်လက်လုပ်လျှင်ယခုပစ္စည်းသည်နှေးကွေးစွာအလုပ်လုပ်ပြီးကူးယူပြီးသီချင်းများအလုပ်မလုပ်နိုင်။" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "ပို့စ်ကဒ်ယူအာအယ်ကိုသိပါကအောက်တွင်ထည့်သွင်းပြီးသွားကိုကလစ်နှိပ်ပါ။" #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "အနုပညာရှင်နာမည်များတွင်\"ဒီ\"ကိုအလေးမပေး" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "ပုံများ (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "%1 နေ့များအတွင်း" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "%1 အပတ်များအတွင်း" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "စနစ်အရှင်ထဲတွင်တေးသံလမ်းကြောများရွေးချယ်ပြီးသီချင်းတစ်ပုဒ်ပြီးတိုင်းတေးသံလမ်းကြောထဲသို့ထည့်သွင်း။" #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "စာတိုက်ပံုး" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "သတိပေးချက်တွင်အယ်လဘမ်အနုပညာထည့်သွင်းစေ" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "သီချင်းများအားလံုးထည့်သွင်းစေ" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "ဆပ်ဆိုးနစ်အပ်စ်ပရိုတိုကောပံုစံအံဝင်ခွင်မဖြစ်။ အသံုးပြုသူများအဆင့်မြှင့်သင့်။" #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "ဆပ်ဆိုးနစ်အပ်စ်ပရိုတိုကောပံုစံအံဝင်ခွင်မဖြစ်။ ဆာဗာများအဆင့်မြှင့်သင့်။" #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "ပံုစံပြင်ခြင်းမပြီးဆံုးသေး၊လိုအပ်သောနယ်ပယ်များကိုပြီးအောင်ဖြည့်ပါ။" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "အသံပမာဏ၄%ခန့်တိုးမြင့်" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "အသံပမာဏ ရာခိုင်နှုန်းခန့်တိုးမြင့်" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "အသံပမာဏတိုးမြင့်" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "ရည်ညွှန်းခြင်း %1" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "အချက်အလက်" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "ထည့်သွင်း..." #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "သွင်းပြီး" #: core/database.cpp:673 msgid "Integrity check" msgstr "ခိုင်မြဲမှုစစ်ဆေး" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "အင်တာနက်" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "အင်တာနက်ပံ့ပိုးသူများ" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "အေပီအိုင်သော့မမှန်" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "ပုံစံမမှန်" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "နည်းလမ်းမမှန်" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "သတ်မှတ်ချက်များမမှန်" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "သတ်မှတ်အရင်းအမြစ်မမှန်" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "ဝန်ဆောင်မှုမမှန်" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "စစ်ဆေးခြင်းသော့မမှန်" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "အသင်းဝင်အမည်နှင့်/သို့စကားဝှက်မမှန်" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "ဂျမန်တို" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "ဂျမန်တိုနားအထောင်ဆံုးတေးသံလမ်းကြောများ" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "ဂျမန်တိုထိပ်တန်းတေးသံများ" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "ဂျမန်တိုယခုလထိပ်တန်းတေးသံများ" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "ဂျမန်တိုယခုအပတ်ထိပ်တန်းတေးသံများ" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "ဂျမန်တိုအချက်အလက်အစု" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "လက်ရှိဖွင့်ဆဲတေးသံလမ်းကြောသို့" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "ခလုတ်များကို %1 စက္ကန့်ကြာထိန်းထား..." #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "ခလုတ်များကို %1 စက္ကန့်များကြာထိန်းထား..." #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "ဝင်းဒိုးပိတ်နေစဉ်နောက်ခံအလုပ်လုပ်စေခြင်း" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "မူရင်းဖိုင်များထိန်းထား" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "ကြောင်ပေါက်စများ" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "ဘာသာစကား" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "လက်ဆွဲကွန်ပျူတာ/နားကြပ်များ" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "ခန်းမကြီး" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "အယ်လဘမ်အဖုံးကြီး" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "ဘေးတိုင်ကြီး" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "နောက်ဆံုးသီချင်းဖွင့်ခဲ့သမျှ" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "လက်စ်.အက်ဖ်အမ်" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "လက်စ်.အက်ဖ်အမ်စိတ်ကြိုက်ရေဒီယို: %1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "လက်စ်.အက်ဖ်သီချင်းတိုက် - %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "လက်စ်.အက်ဖ်ရောသမမွှေရေဒီယို - %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "လက်စ်.အက်ဖ်အိမ်နီးနားရေဒီယို - %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "လက်စ်.အက်ဖ်အမ်ရေဒီယိုထုတ်လွှင့်မှုဌာန - %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr " %1 လက်စ်.အက်ဖ်အမ်တူညီအနုပညာရှင်များသို့" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "လက်စ်.အက်ဖ်အမ်အမည်ရေဒီယို: %1" #: internet/lastfmservice.cpp:437 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "လက်စ်.အက်ဖ်အမ်အလုပ်ရှုပ်နေ၊ မကြာမီမိနစ်အနည်းငယ်အတွင်းထပ်စမ်းကြည့်" #: ../bin/src/ui_lastfmsettingspage.h:154 msgid "Last.fm password" msgstr "လက်စ်.အက်ဖ်အမ်စကားဝှက်" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "လက်စ်.အက်ဖ်ဖွင့်သံအရေအတွက်များ" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "လက်စ်.အက်ဖ်အမ်အမည်များ" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "လက်စ်.အက်ဖ်အမ်အသင်းဝင်အမည်" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "လက်စ်.အက်ဖ်အမ်ဝီကီ" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "အနှစ်သက်ဆုံးတေးသံလမ်းကြောများအနည်းဆုံး" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "မူလပံုစံအတွက်အလွတ်ထားရှိပါ။ ဥပမာ: \"/dev/dsp\", \"front\", စသည်ဖြင့်" #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "ဘယ်" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "အလျား" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "သီချင်းတိုက်" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "သီချင်းတိုက်အဆင့်မြင့်အုပ်စုဖွဲ့ခြင်း" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "သီချင်းတိုက်ပြန်လည်ဖတ်ရှုအကြောင်းကြားစာ" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "သီချင်းတိုက်ရှာဖွေ" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "ကန့်သတ်ချက်များ" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "ယခင်နားဆင်မှုများအပေါ်မူတည်၍ဂရုရှက်သီချင်းများကိုနားဆင်" #: ui/equalizer.cpp:123 msgid "Live" msgstr "တိုက်ရိုက်ထုတ်လွှင့်မှု" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "ထည့်သွင်း" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "ယူအာအလ်မှအဖုံးထည့်သွင်း" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "ယူအာအလ်မှအဖုံးထည့်သွင်း..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "ဓာတ်ပြားမှအဖုံးထည့်သွင်း" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "ဓာတ်ပြားမှအဖုံးထည့်သွင်း..." #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "သီချင်းစာရင်းထည့်သွင်း" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "သီချင်းစာရင်းထည့်သွင်း..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "လက်စ်.အက်ဖ်အမ်ရေဒီယိုထည့်သွင်းနေ" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "အမ်တီပီပစ္စည်းထည့်သွင်းနေ" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "အိုင်ပေါ့အချက်အလက်အစုထည့်သွင်းနေ" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "ချက်ချာသီချင်းစာရင်းထည့်သွင်းနေ" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "သီချင်းများထည့်သွင်းနေ" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "သီချင်းစီးကြောင်းထည့်သွင်းနေ" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "တေးသံလမ်းကြောများထည့်သွင်းနေ" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "တေးသံလမ်းကြောအချက်အလက်များထည့်သွင်းနေ" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "ထည့်သွင်းနေ..." #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "ဖိုင်များ/ယူအာအလ်များထည့်သွင်း၊ ယခုသီချင်းစာရင်းအစားထိုး" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "ဖွင့်ဝင်" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "ဖွင့်ဝင်၍မရ" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "ကာလရှည်ခန့်မှန်းအကြောင်း (အယ်တီပီ)" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "နှစ်သက်" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "နိမ့် (%1 အက်ဖ်ပီအက်စ်)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "နိမ့် (၂၅၆x၂၅၆)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "ရှုပ်ထွေးမှုအနည်းဆံုးအကြောင်း (အယ်စီ)" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "သီချင်းစာသားများ" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "%1 မှသီချင်းစာသားများ" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "အမ်ပီသရီး" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "အမ်ပီသရီး၂၅၆ကီလို" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "အမ်ပီသရီး၉၆ကီလို" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "အမ်ပီဖိုးအေအေစီ" #: core/song.cpp:330 msgid "MPC" msgstr "အမ်ပီစီ" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "မက်နကျွန်း" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "မက်နကျွန်းကူးဆွဲ" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "မက်နကျွန်းကူးဆွဲပြီးဆံုး" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "အဓိကအကြောင်း(အဓိက)" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "အဲဒီကဲ့သို့လုပ်" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "သီချင်းစာရင်းအောဖ့်လိုင်းသုံးလုပ်" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "တုံ့ပြန်မှုပုံမမှန်" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "ပရောက်ဇီပုံစံလက်အားသံုးပြင်ခြင်း" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "လက်အားသံုး" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "ထုတ်လုပ်သူ" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "နားထောင်ပြီးကဲ့သို့မတ်သား" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "အသစ်ကဲ့သို့မတ်သား" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "ရှာဖွေစကားရပ်တိုင်းဟပ်စပ် (နှင့်)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "ရှာဖွေစကားရပ်များတစ်ခုသို့အများဟပ်စပ် (သို့)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "အများဆုံးဘစ်နှုန်း" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "လယ် (%1 အက်ဖ်ပီအက်စ်)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "လယ် (၅၁၂x၅၁၂)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "အသင်းဝင်အမျိုးအစား" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "အနည်းဆုံးဘစ်နှုန်း" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "ပရောဂျက်အမ်ကြိုတင်ထိန်းညှိများလိုနေ" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "ပုံစံ" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "သီချင်းတိုက်ပြောင်းလဲမှုများစောင့်ကြည့်" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "မိုနိတစ်ခုတည်း" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "လများ" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "စိတ်နေစိတ်ထား" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "စိတ်နေစိတ်ထားဘားမျဉ်းပုံစံ" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "စိတ်နေစိတ်ထားဘားမျဉ်းများ" #: library/library.cpp:74 msgid "Most played" msgstr "အများဆံုးဖွင့်ခဲ့သမျှ" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "အမှတ်စီစဉ်" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "အမှတ်များစီစဉ်" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "အောက်သို့ရွှေ့" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "သီချင်းတိုက်သို့ရွှေ့..." #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "အပေါ်သို့ရွှေ့" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "ဂီတ" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "ဂီတတိုက်" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "အသံအုပ်" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "ငါ့လက်စ်.အက်ဖ်သီချင်းတိုက်" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "ငါ့လက်စ်.အက်ဖ်ရောသမမွှေရေဒီယို" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "ငါ့လက်စ်.အက်ဖ်အိမ်နီးနားများ" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "ငါ့လက်စ်.အက်ဖ်အမ်အကြံပြုရေဒီယို" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "ငါ့ရောသမမွှေရေဒီယို" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "ငါ့ဂီတ" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "ငါ့အိမ်နီးနားများ" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "ငါ့ရေဒီယိုထုတ်လွှင့်မှုဌာန" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "ငါ့ထောက်ခံချက်များ" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "နာမည်" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "နာမည်ပေးခြင်းရွေးပိုင်ခွင့်များ" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "ရေဒီယိုလှိုင်းကျဉ်း (အန်ဘီ)" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "အိမ်နီးနားချင်းများ" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "ကွန်ရက်" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "ကွန်ရက်ပရောက်ဇီ" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "ကွန်ရက်အဝေးထိန်း" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "ဘယ်သောအခါမှ" #: library/library.cpp:67 msgid "Never played" msgstr "သီချင်းမဖွင့်ခဲ့သမျှ" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "သီချင်းလုံးဝစတင်မဖွင့်" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "ဖိုင်တွဲအသစ်" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "သီချင်းစာရင်းအသစ်" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "ချက်ချာသီချင်းစာရင်းအသစ်..." #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "သီချင်းအသစ်များ" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "တေးသံလမ်းကြောများအလိုအလျောက်ထည့်။" #: library/library.cpp:80 msgid "Newest tracks" msgstr "တေးသံလမ်းကြောအသစ်ဆုံးများ" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "နောက်တစ်ခု" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "နောက်တေးသံလမ်းကြော" #: core/utilities.cpp:147 msgid "Next week" msgstr "နောက်အပတ်" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "စိစစ်သူမရှိ" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "နောက်ခံပုံမသံုး" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "တင်ပို့ရန်အဖံုးများမရှိ" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "ဘလောက်ရှည်များမရှိ" #: playlist/playlistcontainer.cpp:366 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "ဟပ်စပ်များရှာမတွေ့။ သီချင်းစာရင်းတစ်ခုလံုးနောက်တစ်ချိန်ပြသရန်ရှာဖွေနေရာကိုဖယ်ရှင်းပါ။ " #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "ဘလောက်တိုများမရှိ" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "ဘယ်တစ်ခုမျှ" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "ရွေးချယ်ပြီးသီချင်းများတစ်ခုမှပစ္စည်းသို့ကူးယူရန်မသင့်တော်" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "သာမန်" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "သာမန်ဘလောက်အမျိုးအစား" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "သီချင်းစာရင်းအရှင်သံုးနေစဉ်မရနိုင်" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "မဆက်သွယ်ထား" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "အကြောင်းအရာလုံလောက်မှုမရှိ" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "အားပေးသူများလုံလောက်မှုမရှိ" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "အသင်းဝင်များလုံလောက်မှုမရှိ" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "အိမ်နီးနားချင်းများလုံလောက်မှုမရှိ" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "မသွင်းထား" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "မဖွင့်ဝင်ရသေး" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "မစီစဉ်ထား - စီစဉ်ရန်ကလစ်နှစ်ခါနှိပ်" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "သတိပေးချက်ပုံစံ" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "သတိပေးချက်များ" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "ယခုသီချင်းဖွင့်ဆဲ" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "ဖန်သားပြင်ပေါ်ပံုရိပ်ကြိုတင်ကြည့်ရှု" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "အောဖ့်အက်ဖ်အယ်အေစီ" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "အောဖ့်တေး" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "အောဖ့်စဖိစ်" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "အောဖ့်ဗော်ဘစ်စ်" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "အလင်းပိတ်မှု" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "ဘရောက်ဇာထဲတွင် %1 ဖွင့်" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "အသံဓာတ်ပြားဖွင့်(&a)..." #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "အိုပီအမ်အယ်ဖိုင်ဖွင့်" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "အိုပီအမ်အယ်ဖိုင်ဖွင့်..." #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "ပစ္စည်းဖွင့်" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "ဖိုင်ဖွင့်..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "ဂူဂယ်ဒရိုက်ဗ်တွင်ဖွင့်" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "သီချင်းစာရင်းအသစ်တွင်ဖွင့်" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "ဖွင့်..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "လည်ပတ်မှုလုပ်မရ" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "ဘစ်နှုန်းအတွက်ဆောင်ရွက်" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "အရည်အသွေးအတွက်ဆောင်ရွက်" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "ရွေးပိုင်ခွင့်များ..." #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "တေး" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "ဖိုင်များစုစည်း" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "ဖိုင်များစုစည်း..." #: core/organise.cpp:65 msgid "Organising files" msgstr "ဖိုင်များစုစည်းနေ" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "မူရင်းအမည်များ" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "အခြားရွေးပိုင်ခွင့်များ" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "ပေးပို့" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "ပေးပို့ပစ္စည်း" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "ပေးပို့ရွေးပိုင်ခွင့်များ" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "ပေးပို့ဖြည့်စွက်ပရိုဂရမ်" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "အားလံုးအစားထိုးရေး" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "တည်ရှိဆဲဖိုင်များထပ်မံဖြည့်သွင်း" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "အသေးစားများကိုသာအစားထိုးရေး" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "ပိုင်ရှင်" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "ဂျမန်တိုစာရင်းစစ်ထုတ်ခြင်း" #: ui/equalizer.cpp:124 msgid "Party" msgstr "အဖွဲ့" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "စကားဝှက်" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "ရပ်တန့်" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "ပြန်ဖွင့်ရပ်တန့်" #: widgets/osd.cpp:156 msgid "Paused" msgstr "ရပ်တန့်ပြီး" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "တင်ဆင်သူ" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "အစက်အပြောက်" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "ဘေးတိုင်ရိုးရိုး" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "ဖွင့်" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "အနုပညာရှင်သို့အမည်ဖွင့်" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "အနုပညာရှင်ရေဒီယိုဖွင့်..." #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "ဖွင့်သံအရေအတွက်" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "စိတ်ကြိုက်ရေဒီယိုဖွင့်..." #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "ရပ်တန့်ပြီးလျှင်ဖွင့်၊ ဖွင့်ပြီးလျှင်ရပ်တန့်" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "ဘယ်သီချင်းမှဖွင့်မနေလျှင်စတင်ဖွင့်" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "အမည်ရေဒီယိုဖွင့်..." #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "သီချင်းစာရင်းတွင်တေးသံလမ်းကြော စတင်ဖွင့်" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "ဖွင့်/ရပ်တန့်" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "ပြန်ဖွင့်" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "ဖွင့်စက်ရွေးပိုင်ခွင့်များ" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "သီချင်းစာရင်း" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "သီချင်းစာရင်းပြီးဆံုး" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "သီချင်းစာရင်းရွေးပိုင်ခွင့်များ" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "သီချင်းစာရင်းအမျိုးအစား" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "သီချင်းစာရင်းများ" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "ဘရောက်ဇာကိုပိတ်ပြီးကလီမန်တိုင်းသို့သွားပါ။" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "ဖြည့်စွက်ပရိုဂရမ်အခြေအနေ:" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "ပို့စ်ကဒ်များ" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "ပေါ့ဂီတ" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "ရေပန်းစားဆံုးသီချင်းများ" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "ယခုလရေပန်းစားဆံုးသီချင်းများ" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "ယနေ့ရေပန်းစားဆံုးသီချင်းများ" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "ထွက်ပေါ်ကြာချိန်" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "နံပါတ်ပေါက်" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "အသံချဲ့အကြို" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "လိုလားချက်များ" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "လိုလားချက်များ..." #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "နှစ်သက်သောအယ်လဘမ်အနုပညာဖိုင်နာမည်များ (ပုဒ်ရပ်ခွဲခြား)" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "နှစ်သက်သောအသံပုံစံ" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "နှစ်သက်သောဘစ်နှုန်း" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "နှစ်သက်သောပုံစံ" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "အရစ်ကျစနစ်အသံအမျိုးအစား" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "ကြိုတင်ထိန်းညှိ:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "အသုံးပြုရန်ခလုတ်များပေါင်းခေါက်" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "စာတစ်လံုးခေါက်" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "%1 အတွက်အသုံးပြုရန်ခလုတ်များပေါင်းခေါက်..." #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "ဖန်သားပြင်ပေါ်ပံုရိပ်လှလှရွေးပိုင်ခွင့်များ" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "ကြိုတင်ကြည့်ရှု" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "ယခင်" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "ယခင်တေးသံလမ်းကြော" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "ပုံစံအချက်အလက်ဖော်ပြ" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "အကြောင်း" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "အခြေအနေ" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 msgid "Push Wiiremote button" msgstr "ဝိုင်ယာမုတ်ခလုတ်နှိပ်" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "သီချင်းများကိုကျပန်းစီစဉ်ကာထားပါ" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "အရည်အသွေး" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "ပစ္စည်းမေးမြန်းခြင်း..." #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "စီတန်းမန်နေဂျာ" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "ရွေးချယ်တေးသံလမ်းကြောများစီတန်း" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "တေးသံလမ်းကြောစီတန်း" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "ရေဒီယို (တေးသံလမ်းကြောများအားလံုးအတွက်တူညီအသံကျယ်ကျယ်)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "ရေဒီယိုများ" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "မိုး" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "ကျပန်းပုံဖော်ကြည့်ခြင်း" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "လက်ရှိသီချင်း၀ကြယ်တန်ဖိုးဖြတ်" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "လက်ရှိသီချင်း၁ကြယ်တန်ဖိုးဖြတ်" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "လက်ရှိသီချင်း၂ကြယ်တန်ဖိုးဖြတ်" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "လက်ရှိသီချင်း၃ကြယ်တန်ဖိုးဖြတ်" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "လက်ရှိသီချင်း၄ကြယ်တန်ဖိုးဖြတ်" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "လက်ရှိသီချင်း၅ကြယ်တန်ဖိုးဖြတ်" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "အဆင့်သတ်မှတ်ချက်များ" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "တကယ်ပယ်ဖျက်?" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "ဦးတည်ရာပြောင်းကန့်သတ်ကျော်လွန်၊ ဆာဗာပုံစံပြင်ခြင်းလုပ်ပါ။" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "ပြန်လည်" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "စာရင်းပြန်လည်" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "လေလှိုင်းများပြန်လည်" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "သူငယ်ချင်းများစာရင်းပြန်လည်" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "ထုတ်လွှင့်မှုဌာနစာရင်းပြန်လည်" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "သီချင်းစီးကြောင်းများပြန်လည်" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "ရက်ပ်ဂယ်" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "ဝီအဝေးထိန်းပြောင်းလဲခြင်းမှတ်သား" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "နောက်ဆံုးအချိန်မှမှတ်သား" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "ဖယ်ရှား" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "လုပ်ဆောင်ချက်ဖယ်ရှား" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "သီချင်းစာရင်းမှပုံတူများဖယ်ရှား" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "ဖိုင်တွဲဖယ်ရှား" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "ငါ့ဂီတမှဖယ်ရှား" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "အနှစ်သက်ဆုံးများမှဖယ်ရှား" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "သီချင်းစာရင်းမှဖယ်ရှား" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "သီချင်းစာရင်းဖယ်ရှား" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "သီချင်းစာရင်းများဖယ်ရှား" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "ငါ့ဂီတမှသီချင်းများဖယ်ရှား" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "အနှစ်သက်ဆုံးများမှသီချင်းများဖယ်ရှား" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "သီချင်းစာရင်း \"%1\" နာမည်ပြန်ရွေး" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "ဂရုရှက်သီချင်းစာရင်းနာမည်ပြန်ရွေး" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "သီချင်းစာရင်းနာမည်ပြန်ရွေး" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "သီချင်းစာရင်းနာမည်ပြန်ရွေး..." #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "တေးသံလမ်းကြောများယခုအစဉ်အလိုက်နံပါတ်ပြန်ပြောင်းပါ..." #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "ပြန်ဆို" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "အယ်လဘမ်ပြန်ဆို" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "သီချင်းစာရင်းပြန်ဆို" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "တေးသံလမ်းကြောပြန်ဆို" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "ယခုသီချင်းစာရင်းအစားထိုး" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "သီချင်းစာရင်းအစားထိုး" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "ကွက်လပ်များကိုအောက်မျဉ်းများနှင့်အစားထိုး" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "ရီပလေးဂိမ်း" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "ဂိမ်းစနစ်ပြန်ဖွင့်" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "ပြန်လည်ရွှေ့ပြောင်း" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "အထောက်အထားစစ်ဆေးခြင်းကုဒ်လိုအပ်" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "ပြန်လည်ထိန်းညှိ" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" 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:206 msgid "Restrict to ASCII characters" msgstr "အက်စ်စီအက္ခရာများသို့ကန့်သတ်" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "ပြန်ဖွင့်ကိုစသံုးတိုင်းပြန်စ" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "ဂရုရှက်ငါ့ဂီတသီချင်းများပြန်ထုတ်ခြင်း" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "ဂရုရှက်ရေပန်းစားဆံုးသီချင်းများပြန်ထုတ်ခြင်း" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "ဂရုရှက်သီချင်းစာရင်းများပြန်ထုတ်ခြင်း" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "ကလီမန်တိုင်းသို့ပြန်သွား" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "ညာ" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "ရော့ခ်" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "စတင်" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "ဆော့ပရောက်ဇီ" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "အက်စ်အက်စ်အယ်အမှားပြနေ၊ဆာဗာပံုစံပြင်ခြင်းအတည်ပြု။ အက်စ်အက်စ်အယ်ဗီ၃ရွေးပိုင်ခွင့်တွင်ပြသနာများရှိနေ။" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "ပစ္စည်းလုံလုံခြုံခြုံဖယ်ရှား" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "ကူးယူပြီးနောက်ပစ္စည်းလုံလုံခြုံခြုံဖယ်ရှား" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "နမူနာနှုန်း" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "နမူနာနှုန်း" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "ဂီတတိုက်တွင်.moodဖိုင်များမှတ်သား" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "အယ်လဘမ်အဖုံးမှတ်သား" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "ဓာတ်ပြားသို့အဖံုးမှတ်သား..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "ပုံမှတ်သား" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "သီချင်းစာရင်းမှတ်သား" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "သီချင်းစာရင်းမှတ်သား..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "ကြိုတင်ထိန်းညှိမှတ်သား" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "ဖြစ်နိုင်ပါကဖိုင်အမည်များထဲတွင်အဆင့်သတ်မှတ်ချက်များမှတ်သား" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "ဖြစ်နိုင်ပါကဖိုင်အမည်များထဲတွင်စာရင်းဇယားများမှတ်သား" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "အင်တာနက်မျက်နှာစာထဲတွင်ယခုသီချင်းစီးကြောင်းမှတ်သား" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "သီချင်းဖိုင်များထဲသို့သီချင်းကိန်းဂဏန်းအချက်အလက်များမှတ်သား" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "တေးသံလမ်းကြောများမှတ်သားနေ" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "သတ်မှတ်နမူနာနှုန်းအကြောင်း (အက်စ်အက်စ်အာ)" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "အတိုင်းအတာပမာဏ" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "ရမှတ်" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "နားဆင်နေကြတေးသံလမ်းကြောများလိုလျှောက်နာမည်ပေးပို့" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "ရှာဖွေ" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "အိုင့်ကက်စ်ထုတ်လွှင့်မှုဌာနများရှာဖွေ" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "ဂျမန်တိုရှာဖွေ" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "မက်နကျွန်းရှာဖွေ" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "ဆပ်ဆိုးနစ်ရှာဖွေ" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "အယ်လဘမ်အဖုံးများအားရှာဖွေ..." #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "တစ်စုံတစ်ရာဖြစ်ဖြစ်ရှာဖွေ" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "ဂျီပေါ့တာ.နက်ရှာဖွေ" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "အိုင်ကျွန်းရှာဖွေ" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "စနစ်ရှာဖွေ" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "ရှာဖွေရွေးပိုင်ခွင့်များ" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "ရလဒ်များရှာဖွေ" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "စကားရပ်များရှာဖွေ" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "ဂရုရှက်တွင်ရှာဖွေခြင်း" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "ဒုတိယအဆင့်" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "နောက်ပြန်ရှာဖွေ" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "ရှေ့သို့ရှာဖွေ" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "လက်ရှိဖွင့်ဆဲတေးသံလမ်းကြောအတိုင်းအတာနှိုင်းယှဉ်ချက်အားဖြင့်ရှာဖွေ" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "လက်ရှိဖွင့်ဆဲတေးသံလမ်းကြောမှပကတိနေရာသို့ရှာဖွေ" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "အားလံုးရွေးချယ်" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "တစ်ခုမျှမရွေးချယ်" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "နောက်ခံအရောင်ရွေးချယ်:" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "နောက်ခံပုံရွေးချယ်" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "အကောင်းဆံုးဟပ်စပ်ဖြစ်နိုင်ခြေရွေးချယ်" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "ရှေ့ခံအရောင်ရွေးချယ်:" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "ပုံဖော်ကြည့်ခြင်းများရွေးချယ်" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "ပုံဖော်ကြည့်ခြင်းများရွေးချယ်..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "အမှတ်စဉ်" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "ဆာဗာယူယူအာအလ်" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "ဆာဗာအသေးစိတ်အကြောင်းအရာများ" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "အောဖ့်လိုင်းဝန်ဆောင်မှု" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "%1 မှ \"%2\" ထိန်းညှိ..." #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "အသံပမာဏ ရာခိုင်နှုန်းခန့်ထိန်းညှိ" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "ရွေးချယ်တေးသံလမ်းကြောများအားလံုးအတွက်တန်ဖိုးထိန်းညှိ..." #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "ချိန်ညှိချက်" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "အတိုကောက်" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "%1 အတွက်အတိုကောက်" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "%1 အတွက်အတိုကောက်တည်ရှိပြီး" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "ပြသ" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "ဖန်သားပြင်ပေါ်ပံုရိပ်ပြသ" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "လက်ရှိတေးသံလမ်းကြောပေါ်ခပ်မှိန်မှိန်အန်နီမေးရှင်းပြသ" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "တေးသံလမ်းကြောအခြေအနေပြဘားမျဉ်းတွင်စိတ်နေစိတ်ထားဘားမျဉ်းပြသ" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "စက်ရှိအလုပ်ခုံသတိပေးချက်ပြသ" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "စနစ်ပြန်ဆို/ကုလားဖန်ထိုးတိုင်းသတိပေးချက်ပြသ" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "အသံပမာဏပြောင်းလဲတိုင်းသတိပေးချက်ပြသ" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "စနစ်အသေးမှထွက်ပေါ်ပြသ" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "ဖန်သားပြင်ပေါ်ပံုရိပ်လှလှတစ်ခုပြသ" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "အခြေအနေပြတိုင်အပေါ်မှာပြသ" #: ui/mainwindow.cpp:460 msgid "Show all songs" msgstr "သီချင်းများအားလံုးပြသ" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "သီချင်းများအားလံုးကိုပြသ" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show cover art in library" msgstr "သီချင်းတိုက်ထဲအနုပညာအဖုံးပြသ" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "ခွဲခြားမှုများပြသ" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "အရွယ်အပြည့်ပြသ..." #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "ဖိုင်ဘရောက်ဇာထဲမှာပြသ..." #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "အနုပညာရှင်များအမျိုးမျိုးပြသ" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "စိတ်နေစိတ်ထားဘားမျဉ်းပြသ" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "ပုံတူများသာပြသ" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "အမည်မရှိများသာပြသ" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "ရှာဖွေအကြံပြုချက်များပြသ" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "\"နှစ်သက်\"နှင့်\"တားမြစ်\"ခလုတ်များပြသ" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "အဓိကဝင်းဒိုးထဲတွင်လိုလျှောက်နာမည်ပေးပို့ခလုတ်ပြသ" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "စနစ်သင်္ကေတပြသ" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "မည်သည့်ရင်းမြစ်များလုပ်ဆောင်စေမလုပ်ဆောင်စေပြသ" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "ပြသ/ဖုံးကွယ်" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "ကုလားဖန်ထိုး" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "အယ်လဘမ်များကုလားဖန်ထိုး" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "ကုလားဖန်အားလံုးထိုး" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "သီချင်းစာရင်းကုလားဖန်ထိုး" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "ယခုအယ်လဘမ်တွင်တေးသံလမ်းကြောများကုလားဖန်ထိုး" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "အတွင်းသို့ဝင်" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "အပြင်သို့ထွက်" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "အတွင်းသို့ဝင်..." #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "တူညီအနုပညာရှင်များအားလံုး" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "ပမာဏ" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "ပမာဏ:" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "စကာဂီတ" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "စာရင်းရှိနောက်ပြန်များခုန်ကျော်" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "အရေအတွက်ခုန်ကျော်" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "စာရင်းရှိရှေ့သို့များခုန်ကျော်" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "အယ်လဘမ်အဖုံးသေး" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "ဘေးတိုင်ငယ်" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "ချက်ချာသီချင်းစာရင်း" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "ချက်ချာသီချင်းစာရင်းများ" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "ပျော့" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "ပျော့ရော့ခ်ဂီတ" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "သီချင်းအချက်အလက်" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "သီချင်းအချက်အလက်" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "အသံလှိုင်းသံုးကျွန်ပျုတာရိုက်ယူပံု" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "တောင်းပန်" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "အမျိုးအစားအားဖြင့်မျိုးတူစု (အက္ခရာစဉ်အတိုင်း)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "အမျိုးအစားအားဖြင့်မျိုးတူစု (ရေပန်းစားမှုဖြင့်)" #: ../bin/src/ui_icecastfilterwidget.h:77 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 "မျိုးတူစုခြင်း" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "ရင်းမြစ်" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "ရင်းမြစ်များ" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "စဖိစ်" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "စပေါ့တီဖိုင်" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "စပေါ့တီဖိုင်းဖွင့်ဝင်အမှားပြ" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "စပေါ့တီဖိုင်ဖြည့်စွက်ပရိုဂရမ်" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "စပေါ့တီဖိုင်ဖြည့်စွက်ပရိုဂရမ်မသွင်းထား" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "အဆင့်အတန်း" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "ကြည့်ခဲ့ပြီး" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "လက်ရှိဖွင့်ဆဲသီချင်းစာရင်းစတင်" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "ပံုစံပြောင်းလဲခြင်းစတင်" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "ရှာဖွေရလဒ်များစာရင်းများကိုဖြည့်ရန်ရှာဖွေနေရာတွင်တစ်ခုခုရိုက်ထည့်ပါ" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "%1 စတင်နေ" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "စတင်နေ..." #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "ထုတ်လွှင့်မှုဌာနများ" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "ရပ်" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "ပြီးနောက်ရပ်" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "ဒီတေးသံလမ်းကြောပြီးနောက်ရပ်" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "ပြန်ဖွင့်ရပ်" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "လက်ရှိတေးသံလမ်းကြောပြီးနောက်သီချင်းဖွင့်ခြင်းရပ်" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "ရပ်တန့်ပြီး" #: core/song.cpp:341 msgid "Stream" msgstr "သီချင်းစီးကြောင်း" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "ရက်၃၀အစမ်းသံုးကာလပြီးဆံုးပြီးနောက်သီချင်းစီးကြောင်းလွှင့်ရန်ဆပ်ဆိုးနစ်ဆာဗာမှတရားဝင်ဆာဗာလိုင်စစ်လိုအပ်။" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "အသင်းဝင်စီးကြောင်းလွှင့်" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "မှာယူပြီးသီချင်းစာရင်းများ" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "မှာယူသူများ" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "ဆပ်ဆိုးနစ်" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "ရရိုသွားပြီ!" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "%1 အောင်အောင်မြင်မြင်ဖြည့်သွင်းပြီး" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "အကြံပြုအမည်များ" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "အကျဉ်းချုပ်" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "ထိပ်တန်းမြင့် (%1 အက်ဖ်ပီအက်စ်)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "ထိပ်တန်းမြင့် (၂၀၄၈x၂၀၄၈)" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "လက်ခံပုံစံများ" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "ယခုကိန်းဂဏန်းအချက်အလက်များကိုဖိုင်များသို့လိုက်လျောညီထွေဖြစ်ရန်လုပ်" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "စပေါ့တီဖိုင်စာတိုက်ပံုးညီတူညှိ" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "စပေါ့တီဖိုင်သီချင်းစာရင်းညီတူညှိ" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "စပေါ့တီဖိုင်ကြည့်ခဲ့ပြီးတေးသံလမ်းကြောများညီတူညှိ" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "စနစ်အရောင်များ" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "မျက်နှာစာများကိုအပေါ်သို့" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "အမည်" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "အမည်ခေါ်ယူ" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "အမည်ရေဒီယို" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "ရည်မှန်းချက်ဘစ်နှုန်း" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "အီလက်ထရွန်နစ်အက" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "စာသားရွေးပိုင်ခွင့်များ" #: ui/about.cpp:70 msgid "Thanks to" msgstr "သို့ကျေးဇူးတင်ခြင်း" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "\"%1\" ညွှန်ကြားခြင်းမစတင်နိုင်။" #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "လက်ရှိဖွင့်ဆဲသီချင်းအယ်လဘမ်အဖုံး" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "%1 ယခုဖိုင်လမ်းညွှန်မမှန်" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr " '%1' သီချင်းစာရင်းသည်အလွတ်သို့မထည့်သွင်းနိုင်။" #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "တောင်းဆိုသောဝက်ဘ်ဆိုက်သည်ပံုမဟုတ်!" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "ယခုအယ်လဘမ်တွင်အခြားသီချင်းများရှိနေ" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "ဂျီပေါ့တာ.နက်နှင့်ဆက်သွယ်ရန်ပြသနာတွေ့" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "မက်နကျွန်းမှအချက်အလက်ဖွဲ့စည်းမှုယူဆောင်ရန်ပြသနာတွေ့" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "အိုင်ကျွန်းစတိုးမှတုံ့ပြန်မှုယူဆောင်ရန်ပြသနာတွေ့" #: ui/organiseerrordialog.cpp:56 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:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "ပစ္စည်းမှယခုဖို်င်များအားလံုးပယ်ဖျက်မည်၊ လုပ်ဆောင်မည်လား?" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "ဓာတ်ပြားမှယခုဖို်င်များအားလံုးထာဝရပယ်ဖျက်မည်၊ လုပ်ဆောင်မည်လား?" #: ../bin/src/ui_librarysettingspage.h:187 msgid "These folders will be scanned for music to make up your library" msgstr "သီချင်းတိုက်တွင်ဂီတအတွက်မွမ်းမံရန်ယခုဖိုင်တွဲများဖတ်ရှုမည်" #: ../bin/src/ui_transcodersettingspage.h:174 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:151 msgid "Third level" msgstr "တတိယအဆင့်" #: internet/jamendoservice.cpp:171 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "၁၅၀မီဂါဘိုက်ရှိအချက်အလက်အစုဖန်တီးမည်။ ⏎ လုပ်ဆောင်မည်လား?" #: internet/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "တောင်းဆိုသောပုံစံထဲတွင်ယခုအယ်လဘမ်မရနိုင်" #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "မည်သည့်ပံုစံလက်ခံကြောင်းကလီမန်တိုင်းသိရန်ယခုပစ္စည်းချိတ်ဆက်ပြီးဖွင့်ထားရမည်။" #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "အောက်ဖော်ပြပါဖိုင်ပံုစံများကိုယခုပစ္စည်းလက်ခံ:" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "ဒီပစ္စည်းသေချာစွာအလုပ်လုပ်မည်မဟုတ်" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "ယခုရွေးပိုင်ခွင့်ကိုလုပ်ဆောင်ပုံလိုလားချက်များတွင်ပြန်ပြောင်းနိုင်" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "ယခုသီချင်းစီးကြောင်းသည်အခကြေးပေးမှာယူသူများအတွက်သာ" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "ယခုပစ္စည်းအမျိုးအစားမလက်ခံ: %1" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "အချိန်ကုန်" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "ခေါင်းစဉ်" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "ဂရုရှက်ရေဒီယိုမဖွင့်မီတစ်ခြားဂရုရှက်သီချင်းများအနည်းငယ်ကိုအရင်နားဆင်ပါ။" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "ယနေ့" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "ဖန်သားပြင်ပေါ်ပံုရိပ်လှလှဖွင့်ပိတ်လုပ်" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "ဖန်သားပြင်အပြည့်ဖွင့်ပိတ်လုပ်" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "စီတန်းအခြေအနေဖွင့်ပိတ်လုပ်" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "သီချင်းနာမည်ပေးပို့ခြင်းဖွင့်ပိတ်လုပ်" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "ဖန်သားပြင်ပေါ်ပံုရိပ်လှလှမြင်ကွင်းပေါ်ရန်ဖွင့်ပိတ်လုပ်" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "မနက်ဖြန်" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "ဦးတည်ရာပြောင်းများများပြား" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "ထိပ်တန်းတေးသံများ" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "စုစုပေါင်းအယ်လဘမ်များ:" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "ဘိုက်စုစုပေါင်းများကူးပြောင်းပြီး" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "ကွန်ရက်တောင်းခံချက်စုစုပေါင်းများပြုလုပ်ပြီး" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "တေးသံလမ်းကြော" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "ဂီတပံုစံပြောင်းလဲခြင်း" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "ပံုစံပြောင်းလဲခြင်းမှတ်တမ်း" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "ပံုစံပြောင်းလဲခြင်း" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "%2 ပရိုဂရမ်များအသံုးပြုပြီး %1 ဖိုင်များပြောင်းလဲခြင်း" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "ပံုစံပြောင်းလဲခြင်းရွေးပိုင်ခွင့်များ" #: core/song.cpp:338 msgid "TrueAudio" msgstr "တီတီအေ" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "တာဗိုင်" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "လှည့်ပိတ်" #: devices/giolister.cpp:161 msgid "URI" msgstr "ယူအာအိုင်" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "ယူအာအလ်(များ)" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "ဦးဘွန်တူးဝမ်း" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "ဦးဘွန်တူးဝမ်းစကားဝှက်" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "ဦးဘွန်တူးဝမ်းအသုံးပြုသူနာမည်" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "အက်တရာလှိုင်းကျယ် (ယူဒဗလူဘီ)" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "မကူးဆွဲနိုင် %1 (%2)" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "အမည်မသိ" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "မသိအကြောင်းအရာအမျိုးအစား" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "အမည်မသိအမှားပြ" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "အဖုံးမသတ်မှတ်" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "မမှာယူ" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "လာမည့်ဂီတဖြေဖျော်ပွဲများ" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "ဂရုရှက်သီချင်းစာရင်းစစ်ဆေးခြင်း" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "ပို့စ်ကဒ်များစစ်ဆေးခြင်း" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "ပြောင်းလဲပြီးသီချင်းတိုက်ဖိုင်တွဲများမွမ်းမံ" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "ကလီမန်တိုင်းစတင်သောအခါသီချင်းတိုက်မွမ်းမံ" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "ဒီပို့စ်ကဒ်စစ်ဆေးခြင်း" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "မွမ်းမံနေ" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "မွမ်းမံနေ %1 " #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "မွမ်းမံနေ %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "သီချင်းတိုက်မွမ်းမံနေ" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "သုံးစွဲမှု" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "ရနိုင်သောအခါအယ်လဘမ်အနုပညာရှင်အမည်အသုံးပြု" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "ဂျီနှုန်းအတိုကောက်ကီးများသံုး" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "ရနိုင်ခဲ့ပါကရီပလေးဂိမ်းအချက်အလက်ဖွဲ့စည်းမှုသံုး" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "အက်စ်အက်စ်အယ်ဗီ၃သံုး" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "ဝီအဝေးထိန်းအသုံးပြု" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "စိတ်ကြိုက်အရောင်သတ်မှတ်သံုး" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "သတိပေးချက်များအတွက်စိတ်ကြိုက်မှာကြားချက်သံုး" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "ကွန်ရက်အဝေးထိန်းတစ်ခုအသုံးပြု" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "အထောက်အထားစစ်ဆေးခြင်းအသုံးပြု" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "ဘစ်နှုန်းစီမံခန့်ခွဲမှုအင်ဂျင်သံုး" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "စနစ်အရှင်အသုံးပြု" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "ဝီအဝေးထိန်းအခြေအနေအစီရင်ခံရန်သတိပေးချက်များသံုး" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "ယာယီအနှောက်အယှက်ပံုသဏ္ဎာန်သံုး" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "မူလစနစ်ပံုစံသံုး" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "မူလစနစ်ပံုစံအရောင်သတ်မှတ်သံုး" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "စနစ်ပရောက်ဇီချိန်ညှိချက်သံုး" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "အသံပမာဏပုံမှန်ပြုလုပ်မှုအသုံးပြု" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "အသုံးပြုပြီး" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "အသင်းဝင် %1 ဂရုရှက်အန်နီးဝဲစာရင်းတစ်ခုမရှိပါ။" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "အသံုးပြုသူမျက်နှာပြင်" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "အသင်းဝင်အမည်" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "သီချင်းထည့်ရန်ဇယားကိုသံုးခြင်းသည်..." #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "ဗီဘီအာအမ်ပီသရီး" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "ဘစ်နှုန်းကိန်းရှင်" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "အနုပညာရှင်များအမျိုးမျိုး" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "ပုံစံ %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "ကြည့်ရှု" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "ပုံဖော်ကြည့်ခြင်းစနစ်" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "ပုံဖော်ကြည့်ခြင်းများ" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "ပုံဖော်ကြည့်ခြင်းချိန်ညှိချက်များ" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "အသံလှုပ်ရှားမှုရှာဖွေတွေ့ရှိခြင်း" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "အသံပမာဏ %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "ဗော်ဘစ်စ်" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "တပလူအေဗီ" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "တပလူအမ်အေ" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "သီချင်းစာရင်းမျက်နှာစာကိုပိတ်နေတုန်းသတိပေး" #: core/song.cpp:337 msgid "Wav" msgstr "တပလူအေဗီ" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "ဝက်ဘ်ဆိုက်" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "အပတ်များ" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "ကလီမန်တိုင်းစတင်သောအခါ" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "စာရင်းအလွတ်ဖြစ်သောအခါ..." #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "ဘာလို့မစမ်းကြည့်..." #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "ရေဒီယိုလှိုင်းကျယ် (ဒဗလူဘီ)" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "ဝီအဝေးထိန်း %1: အသက်သွင်းပြီး" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "ဝီအဝေးထိန်း %1: ဆက်သွယ်ပြီး" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "ဝီအဝေးထိန်း %1: ဓာတ်ခဲအကျပ်အတည်း (%2%)" #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "ဝီအဝေးထိန်း %1: အသက်မသွင်းပြီး" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "ဝီအဝေးထိန်း %1: မဆက်သွယ်ပြီး" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "ဝီအဝေးထိန်း %1: ဓာတ်ခဲအားနည်း (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "ဝီမိုတ်ဒပ်" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "ဝင်းဒိုးမီဒီယာ၁၂၈ကီလို" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "ဝင်းဒိုးမီဒီယာ၄၀ကီလို" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "ဝင်းဒိုးမီဒီယာ၆၄ကီလို" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "ဝင်းဒိုးမီဒီယာအသံ" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "အဖံုးမပါ:" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "အနုပညာရှင်များအမျိုးမျိုးသို့ယခုအယ်လဘမ်မှတစ်ခြားသီချင်းများကိုရွှေ့" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "ယခုနောက်တစ်ချိန်အပြည့်ပြန်လည်ဖတ်ရှု?" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "သီချင်းဖိုင်များထဲသို့သီချင်းများကိန်းဂဏန်းအချက်အလက်များရေးသား" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "အသင်းဝင်အမည်နှင့်/သို့စကားဝှက်မမှန်" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "နှစ်" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "နှစ် - အယ်လဘမ်" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "နှစ်များ" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "မနေ့က" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "အောက်ဖော်ပြပါအယ်လဘမ်များကိုကူးဆွဲတော့မည်" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "%1 အနှစ်သက်ဆံုးများမှသီချင်းစာရင်းများဖယ်ရှားမှာသေချာသလား?" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "သင်မဝင်ရောက်သေးပါ။" #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "%1 ကဲ့သို့သင်ဝင်ရောက်ပြီး။" #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "သင်ဝင်ရောက်ပြီး။" #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "သီချင်းတိုက်ထဲရှိသီချင်းများစုစည်းမှုပံုစံကိုပြောင်းလဲနိုင်။" #: internet/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "သင်စာရင်းတစ်ခုမှမရှိဘဲအလကားနားဆင်နိုင်ပါသည်၊ သို့သော်အရစ်ကျစနစ်အဖွဲ့ဝင်များသည်ကြော်ငြာများမပါဘဲပို၍အရည်အသွေးကောင်းမွန်သောသီချင်းစီးကြောင်းများကိုနားဆင်နိုင်ပါသည်။" #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "တခြားဂီတကဲ့သို့နောက်ခံသီချင်းစီးကြောင်းများကိုတစ်ချိန်တည်းနားထောင်နိုင်။" #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "တေးသံလမ်းကြောများကိုအခမဲ့လိုလျှောက်နာမည်ပေးပို့ခြင်းလုပ်ဆောင်နိုင်၊ သို့သော် အခကြေးပေးမှာယူသူများ သည်ကလီမန်တိုင်းမှလက်စ်.အက်ဖ်အမ်ရေဒီယိုသို့သီချင်းစီးကြောင်းလွှင့်နိုင်။" #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "သင့်ဆီမှာဂရုရှက်အန်နီးဝဲစာရင်းတစ်ခုမရှိပါ။" #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "သင့်ဆီမှာစပေါ့တီဖိုင်းအရစ်ကျစနစ်စာရင်းတစ်ခုမရှိပါ။" #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "သင့်ဆီတွင်မှာယူနေခြင်းမရှိပါ" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "စပေါ့တီဖိုင်းမှထွက်ပြီးဖြစ်၍ချိန်ညှိချက်အရေးအသားတွင်စကားဝှက်ပြန်ထည့်ပါ။" #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "စပေါ့တီဖိုင်းမှထွက်ပြီးဖြစ်၍စကားဝှက်ပြန်ထည့်ပါ။" #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "သင်ဒီတေးသံလမ်းကြောကိုနှစ်သက်" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "စနစ်လိုလားချက်များကိုဆောင်ရွက်ပြီးစာမျက်နှာဖွင့်\"ကူညီနိင်သောပစ္စည်းများကိုဝင်ကြည့်\"ကလီမန်တိုင်းတွင်အများသံုးအတိုကောက်များသံုးရန်" #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "ဘာသာစကားပြောင်းလဲပါကကလီမန်တိုင်းကိုပြန်လည်စတင်ပါ။" #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "လက်စ်.အက်ဖ်အမ်မှာယူသူမဟုတ်၍လက်စ်.အက်ဖ်အမ်ရေဒီယိုထုတ်လွှင့်မှုဌာနကိုနားမဆင်နိင်ပါ။" #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "သင့်ရဲ့အိုင်ပီလိပ်စာ:" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "သင့်ရဲ့လက်စ်.အက်ဖ်အမ်အထောက်အထားများမမှန်ပါ" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "သင့်ရဲ့မက်နကျွန်းအထောက်အထားများမမှန်ပါ" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "သင့်သီချင်းတိုက်မှာဘာမှမရှိ!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "သင့်ရေဒီယိုသီချင်းစီးကြောင်းများ" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "သင့်လိုလျှောက်နာမည်ပေးပို့ခြင်း: %1" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "အိုးပန်းဂျီအယ်အထောက်အကူသင့်စနစ်တွင်မရှိပုံဖော်ကြည့်ခြင်းများမရနိုင်။" #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "သင့်အသင်းဝင်အမည်သို့စကားဝှက်မမှန်" #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "ဇက်-အေ" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "သုည" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "%n သီချင်းများထည့်သွင်း" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "ပြီးနောက်" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "အချိန်တွင်" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "နှင့်" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "အလိုအလျောက်" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "မတိုင်မီ" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "အကြား" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "အကြီးဆုံးဦးစားပေး" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "ဘီပီအမ်" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "ပါဝင်" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "မလုပ်ဆောင်စေ" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "ချပ်ပြားဝိုင်း %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "မပါဝင်" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "ဖြင့်အဆုံး" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "ညီမျှ" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "ဂျီပေါ့တာ.နက်" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "ဂျီပေါ့တာ.နက်ဖိုင်လမ်းညွှန်" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "ပို၍ကြီးမား" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "နောက်ဆံုးမှာ" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "တစ်စက္ကန့်ကီလိုဘိုက်နှုန်း" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "ပို၍သေးငယ်" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "အရှည်ဆုံးဦးစားပေး" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "သီချင်းများ %n ရွှေ့" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "အသစ်ဆုံးဦးစားပေး" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "မညီမျှ" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "နောက်ဆံုးမှာမဟုတ်" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "အပေါ်မှာမဟုတ်" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "အအိုဆုံးဦးစားပေး" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "အပေါ်မှာ" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "ရွေးပိုင်ခွင့်များ" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "(သို့)ကျုအာကုဒ်ကိုဖတ်" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "ဝင်ရောက်ကီးခေါက်" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "%n သီချင်းများဖယ်ရှား" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "အတိုဆုံးဦးစားပေး" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "သီချင်းများကုလားဖန်ထိုး" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "အသေးဆံုးဦးစားပေး" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "သီချင်းများမျိုးတူစု" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "နှင့်စတင်" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "ရပ်" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "တေးသံလမ်းကြော %1" clementine-1.2.0+dfsg/src/translations/nb.po000066400000000000000000004551571223327513400210460ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Arno Teigseth , 2011-2013 # Arno Teigseth , 2011 # FIRST AUTHOR , 2010 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:07+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Norwegian Bokmål (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr "dager" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr "kbps" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr "Normaliseringsmodus" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr "pkt" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " sekunder" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " sanger" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 album" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 dager" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 dager siden" #: podcasts/gpoddersync.cpp:79 #, 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:413 #, qt-format msgid "%1 selected of" msgstr "%1 valgte av" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 sang" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 sanger" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "fant %1 sanger" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "fant %1 sanger (viser %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 spor" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "overført %1" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: modulen Wiimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "%filnavn%" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "kunne ikke: %n" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n ferdige" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "&Egendefinert" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "&Ekstra" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "Hjelp" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "Skjul %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "Skjul..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Venstre" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "Musikk" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Ingen" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "&Spilleliste" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Avslutt" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "Repeteringsmodus" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Høyre" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "&Stokkemodus" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "Fyll &kolonner i vinduet" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "Verktøy" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(varierer mellom sanger)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "... og til alle som har bidratt til Amarok" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "0px" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 dag" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 spor" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "127.0.0.1" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "40%" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 tilfeldige spor" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "Oppgradér til Premium nå" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "Til dette trenger du en Grooveshark Anywhere-konto." #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "Til dette trenger du en Spotify Premium-konto." #: ../bin/src/ui_networkremotesettingspage.h:189 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:78 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:153 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:297 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "Ære være Hypnotoad" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "Avbryt" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "Om %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "Om Clementine..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "Om Qt..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Kontodetaljer" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "Kontodetaljer (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Aksjon" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Aktiver/deaktiver Wiiremote" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "Legg til Podcast" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Legg til strøm" #: ../bin/src/ui_notificationssettingspage.h:425 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:193 msgid "Add action" msgstr "Legg til handling" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Legg til enda en strøm..." #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Legg til katalog..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "Legg til fil" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "Legg fil til konvertering" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "Legg fil(er) til konvertering" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Legg til fil..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Legg filer til i konverterer" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Legg til katalog" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Legg til katalog..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Legg til katalog..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "Legg til Podcast" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "Legg til Podcast..." #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Legg til søke term" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "Legg til album-tagg" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "Legg til albumartist-tagg" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "Legg til artist-tagg" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "Legg til poeng automatisk" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "Legg til komponist-tagg" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "Legg til spor/disk-tagg" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "Legg til fil" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "Legg til sang-sjanger-tagg" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "Legg til sanggruppe-tagg" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "Legg til sporlengde-tagg" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "Legg til utøver-tagg" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "Legg til antall avspillinger" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "Legg til poeng" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "Legg til antall hoppet over" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "Legg til sportittel-tagg" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "Legg til spornummer-tagg" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "Legg til årstall-tagg" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Legg til strøm..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "Legg til i Grooveshark-favoritter" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "Legg til i Grooveshark-spillelister" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "Legg til en annen spilleliste" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Legg til på spilleliste" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "Legg i kø" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Legg til wiimotedev-handlig" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Legg til..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Lagt til denne måneden" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Lagt til denne uken" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Lagt til i år" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Lagt til idag" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Lagt til innen tre måneder" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "Legger til sangen i Musikk" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "Legg til sang i favoritter" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Avansert gruppering..." #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "Etter" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "Etter kopiering..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Album (ideell lydstyrke for alle spor)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Album artist" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "Albumgrafikk" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Album info på jamendo.com..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Album med cover" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Album uten cover" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Alle filer (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "Ære være Hypnotoad!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Alle album" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Alle artister" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "Alle filer (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Alle spillelister (%1)" #: ui/about.cpp:74 msgid "All the translators" msgstr "Alle oversetterne" #: library/library.cpp:84 msgid "All tracks" msgstr "Alle spor" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "Tillat midt/side-koding" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "Sammen med originalene" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Alltid gjem hovedvinduet" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Alltid vis hovedvinduet" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "Alltid start avspilling" #: internet/spotifyblobdownloader.cpp:60 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:61 msgid "An error occurred loading the iTunes database" msgstr "En feil oppsto med lasting av iTunes databasen" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Det oppstod en feil når metadata skulle skrives til '%1'" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "Det oppstod en udefinert feil" #: ui/about.cpp:78 msgid "And:" msgstr "Og" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "Sint" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Utseende" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Tilføy filer/URLer til spillelista" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "Legg til i gjeldende spilleliste" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "Legg til i spilleliste" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "Legg til kompressor, for å unngå klipping" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Er du sikker på at du vil slette \"%1\" innstillingen?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "Sikker på at du vil slette denne spillelista?" #: ui/edittagdialog.cpp:769 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:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Artist" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Artist info" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "Artistradio" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "Artist etiketter" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "Artistens initial" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Lydformat" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Autentiseringen feilet" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "Forfatter" #: ui/about.cpp:65 msgid "Authors" msgstr "Forfattere" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Automatisk" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Automatisk oppdatering" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "Automatisk åpne enkeltkategorier i bibliotektreet" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "Tilgjengelig" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "Gjennomsnittlig bitrate" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "Gjennomsittlig bildestørrelse" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "BBC-Podcast" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "Bakgrunnsstrømmer" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Bakgrunnsfarge" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "Bakgrunnsbilde" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Bakgrunnsgjennomsiktighet" #: core/database.cpp:734 msgid "Backing up database" msgstr "Tar sikkerhetskopi av databasen" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "Balanse" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Bannlys" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "Stolpeanalyse" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Blå" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "Grunnleggende lydtype" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Atferd" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "Best" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "Biografi fra %1" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Bitrate" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "Bitrate" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "Blokkanalyse" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "Blokktype" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "Mengde slør" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "Innhold" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "Boomanalysator" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Bla gjennom..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "Bufferlengde" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "Mellomlagring" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "Men disse kildene er slått av:" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Knapper" #: core/song.cpp:339 msgid "CDDA" msgstr "CD-audio" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "Støtte for CUE-filer" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "Avbryt" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Endre omslagsbilde" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Endre font størrelse..." #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "Endre repetisjonsmodus" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Endre snarvei..." #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "Endre stokke-modus" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Endre språket" #: ../bin/src/ui_playbacksettingspage.h:330 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:228 msgid "Check for new episodes" msgstr "Se etter nye episoder" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Sjekk for oppdateringer..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "Sett et navn på den smarte spillelisten" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Velg automatisk" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Velg farge..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "Velg skrifttype..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Velg fra listen" #: smartplaylists/querywizardplugin.cpp:155 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." #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "Velg katalog for podcastene" #: ../bin/src/ui_songinfosettingspage.h:188 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:115 msgid "Classical" msgstr "Klassisk" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "Rydder" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Tøm" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Tøm spillelisten" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Clementine feil" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Oransje" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Clementine visualisering" #: ../bin/src/ui_deviceproperties.h:376 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_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine kan spille musikk du har lastet opp til Box" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine kan spille musikk du har lastet opp til Dropbox" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine kan spille musikk du har lastet opp til Google Disk" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "Clementine kan spille musikk du har lastet opp til Ubuntu One" #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "Clementine kan vise en melding ved sporendring" #: ../bin/src/ui_podcastsettingspage.h:250 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:128 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." #: internet/lastfmsettingspage.cpp:110 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 "Clementine kunne ikke innhente abonnementsstatusen på grunn av problemer med forbindelsen. Informasjon om avspilte spor blir mellomlagret og sendt til Last.fm senere." #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Clementine bildevisning" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "Clementine klarte ikke å finne resultater for denne filen" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "Clementine leter etter musikk i:" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Klikk her for å legge til musikk" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "Klikk for å bytte mellom gjenværende tid og total tid" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "Lukk spillelista" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "Lukk visualisering" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "Lukking av dette vinduet vil kansellere nedlastingen." #: ui/albumcovermanager.cpp:216 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:116 msgid "Club" msgstr "Klubbmusikk" #: ../bin/src/ui_appearancesettingspage.h:272 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:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Kommentar" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "Fullfør tags automatisk" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "Fullfør tags automatisk..." #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Komponist" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "Konfigurér %1..." #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "Innstillinger for Grooveshark..." #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Sett opp Last.fm..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "Konfigurer Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Oppsett av hurtigtaster" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "Konfigurere Spotify..." #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "Konfigurere Subsonic.." #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "Konfigurér globalt søk..." #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "Sett opp bibliotek..." #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "Konfigurere podcasts..." #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "Innstillinger..." #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "Koble til Wii Remotes med aktiver/de-aktiver aksjon" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "Koble til enhet" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "Kobler til Spotify" #: internet/subsonicsettingspage.cpp:107 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/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Tidsavbrudd i tilkoblingen; sjekk tjener-URL. For eksempel: http://localhost:4040/" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "Konsoll" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "Konstant bitrate" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "Konverter all musikk" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "Konverter musikk som enheten ikke kan spille" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "Kopiér til utklippstavla" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Kopier til enhet..." #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Kopier til bibliotek..." #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "Copyright" #: internet/subsonicsettingspage.cpp:81 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:64 #, 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" #: transcoder/transcoder.cpp:432 #, 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:426 #, 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/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "Kunne ikke laste inn Last.fm-radiostasjon" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "Kunne ikke åpne output fil %1" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Behandling av plateomslag" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "Omslagsgrafikk fra innebygget bilde" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Omslagsgrafikk ble lastet inn automatisk fra %1" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "Fjernet omslagsgrafikk manuelt" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "Har ikke omslagsgrafikk" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "Omslagsgrafikk satt fra %1" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "Omslag fra %1" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "Lag ny Grooveshark-spillpliste" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "Mikse overgang når spor skiftes automatisk" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "Mikse overgang når du skifter spor selv" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "Ctrl+Skift+T" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "Egendefinert" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "Egendefinert bilde:" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "Egendefinerte meldingsinnstillinger" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "Egendefinert radio" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Egendefinert..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "DBus sti" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Dansemusikk" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Laget dato" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Endringsdato" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "Dager" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "S&tandard" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "Demp volum med 4%" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "Demp lydstyrken med prosent" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Demp volumet" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "Standard bakgrunnsbilde" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "Standard" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "Pause mellom visualiseringer" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "Slett" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "Slett Grooveshark-spilleliste" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "Slett nedlastede data" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Slett filer" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Slett fra enhet..." #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Slett fra harddisk..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "Slett avspilte episoder" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "Slett forhåndsinnstilling" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "Slett smart spilleliste" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "Slett de originale filene" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Sletter filer" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "Fjern valgte spor fra avspillingskøen" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "Fjern sporet fra avspillingskøen" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Destinasjon" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Detaljer" #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Enhet" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Egenskaper for enhet" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Enhetsnavn" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Egenskaper for enhet..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Enheter" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Mente du" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "passord for Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "brukernavn for Digitally Imported" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "Koblet direkte til internett" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Katalog" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "Slå av varighet" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "Slå av opprettelse av stemningsstolper" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Deaktivert" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Disk" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "Uregelmessig overførsel" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "Visningsegenskaper" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Vis overlegg-display" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "Sjekk hele biblioteket" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "Ikke konverter musikk" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "Ikke skriv over" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Ikke repetér" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "Ikke vis under Diverse Artister" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "Ikke stokk" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "Ikke stopp!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "Donér" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Dobbelklikk for å åpne" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "Når jeg dobbelklikker en sang, ..." #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "Last ned %n episoder" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "Last ned katalog" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "Last ned episodene til" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "Last ned medlemskap" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "Last ned nye episoder automatisk" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "Lagt til i nedlastingskøen" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Last ned dette albumet" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Last ned dette albumet..." #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "Last ned denne episoden" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "Last ned..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "Laster ned (%1%)..." #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "Laster ned Icecast-katalogen" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "Laster ned Jamendo-katalogen" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "Laster ned Magnatune-katalogen" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "Laster ned Spotify-modul" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "Laster ned metadata" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "Dra for å endre posisjon" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "Dropbo" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "Dynamisk modus er på" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "Dynamisk tilfeldig miks" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "Rediger smart spilleliste..." #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Endre merkelapp \"%1\"..." #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "Endre merkelapp..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "Rediger tagger" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Redigér informasjon om sporet" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "Rediger informasjon om sporet..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Rediger sporinformasjon..." #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Rediger..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "Slå på støtte for Wii-fjernkontroll" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "Slå på equalizer" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "Bruk hurtigtaster bare når Clementine har fokus" #: ../bin/src/ui_globalsearchsettingspage.h:147 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:62 msgid "Enable/disable Last.fm scrobbling" msgstr "Slå av/på scrobbling mot Last.fm" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "Koder-kompleksitet" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "Koder-kvalitet" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "Kodermodus" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "Skriv inn en URL" #: ../bin/src/ui_coverfromurldialog.h:103 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:205 msgid "Enter a filename for exported covers (no extension):" msgstr "Skriv inn et filnavn for eksportert albumgrafikk (uten filetternavn):" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "Gi denne spillelista et nytt navn" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Skriv en artist eller merkelapp for å lytte til Last.fm-radio." #: ../bin/src/ui_globalsearchview.h:209 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:77 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:77 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:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "Skriv inn søkeord her" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "Skriv adressen (URL) til en internett radiostrøm" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "Skriv inn navn på mappa" #: ../bin/src/ui_networkremotesettingspage.h:198 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:87 msgid "Entire collection" msgstr "Hele samlingen" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Feil" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Kunne ikke koble til MTP-enhet" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "Kunne ikke kopiere sanger" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "Kunne ikke slette sanger" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "Kunne ikke laste ned Spotify-modul" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "Kunne ikke laste inn %1" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Kunne ikke laste ned spillelista fra di.fm" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "Kunne ikke behandle %1: %2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "Kunne ikke laste lyd-CD" #: library/library.cpp:63 msgid "Ever played" msgstr "Noensinne spilt av" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "Hvert 10. minutt" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "Hver 12. time" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "Hver 2. time" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "Hvert 20. minut" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "Hver halvtime" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "Hver 6. time" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "Hver time" #: ../bin/src/ui_playbacksettingspage.h:303 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:208 msgid "Existing covers" msgstr "Eksisterende omslag" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "Utvid" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "Utgår den %1" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "Eksportér omslag" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "Eksportér omslag" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "Eksportér nedlastede omslag" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "Eksportér innebygde omslag" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "Eksport fullført" #: ui/albumcovermanager.cpp:786 #, 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:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "Fade ut/inn ved pause/start" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "Ton ut når sporet stoppes" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "Ton inn/ut" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "Toning-varighet" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "Kunne ikke hente katalogen" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "Kunne ikke laste ned podcast" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "Kunne ikke laste inn podcast" #: podcasts/podcasturlloader.cpp:167 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:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "Rask" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "Favoritte" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "Favorittspor" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "Hent manglende omslag" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "Hent automatisk" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "Henting fullført" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "Henter Subsonic-bibliotek" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Kunne ikke hente albumgrafikk" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "Filetternavn" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "Filformat" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Filnavn" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "Filnavn (uten sti)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Filstørrelse" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Filtype" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Filnavn" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Filer" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "Filer som skal kodes" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "Finn sanger i biblioteket, basert på kriteriene du oppgir" #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "Vannmerker sangen" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "Ferdig" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "Første nivå" #: core/song.cpp:328 msgid "Flac" msgstr "FLAC" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Skriftstørrelse" #: ../bin/src/ui_spotifysettingspage.h:213 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:204 msgid "Force mono encoding" msgstr "Tving monolyd-koding" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "Glem enhet" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Skjema" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "Format" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Bilder/sekund" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "Bilder per buffer" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Venner" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "Dypfry" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Full Bass" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "Full Bass + Lys lyd" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "Full lys lyd" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "GStreamer lydmotor" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "Generelt" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Generelle innstillinger" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Sjanger" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "Lag en URL for å dele denne Grooveshark-spillelisten" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "Lag en URL for å dele denne Grooveshark-sangen" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "Henter populære sanger fra Grooveshark" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "Henter kanaler" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "Henter strømmer" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "Gi den et navn:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "Gå" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "Gå til neste flik på spillelista" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "Gå til forrige flik på spillelista" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "Google Disk" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "Hentet %1 av %2 albumbilder (%3 feilet)" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "Merk ikke-eksisterende sanger med grått i mine spillelister" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "Kunne ikke logge inn på Grooveshark" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "Grooveshark-URL for sangen" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "Grooveshark-radio" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "Grooveshark-URL for sange" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "Gruppér biblioteket etter..." #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "Grupper etter" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "Gruppér på albumtittel" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "Gruppér på artistnavn" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "Gruppér på artist og album" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "Gruppér etter Artist/År - Albumnavn" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "Gruppér etter Sjanger/Album" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "Gruppér etter Sjanger/Artist/Album" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "Gruppering" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "HTML-siden inneholdt ingen RSS-feeder." #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "Mellomtjener for HTTP" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "Glad" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "Informasjon om maskinvare" #: ../bin/src/ui_deviceproperties.h:372 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:202 msgid "High" msgstr "Høy" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "Høy (%1 bilder/sekund)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "Høy (1024x1024)" #: internet/subsonicsettingspage.cpp:112 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:310 msgid "Hours" msgstr "Timer" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "Jeg har ikke noen Magnatune-konto" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Ikon" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "Ikoner øverst" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "Identifiserer sangen" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 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:77 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:204 msgid "Ignore \"The\" in artist names" msgstr "Ignorér \"The\" i artistnavn" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Bilder (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "Om %1 dager" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "Om %1 uker" #: ../bin/src/ui_wizardfinishpage.h:86 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/spotifyservice.cpp:360 msgid "Inbox" msgstr "Innboks" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "Inkludér cover i meldingen" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "Inkluder alle sanger" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Ikke-kompatibel Subsonic REST-protokollversjon. Klienten må oppgraderes." #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Ikke-kompatibel Subsonic REST-protokollversjon. Tjeneren må oppgraderes." #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Ufullstendig oppsett. Sjekk at du har fylt ut alle feltene." #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "Øk lydstyrken 4%" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "Øk lydstyrken med prosent" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Øk lydstyrken" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "Indekserer %1" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "Informasjon" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "Sett inn..." #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Installert" #: core/database.cpp:673 msgid "Integrity check" msgstr "Integritetskontrol" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Internett" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "Internettilbydere" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "Ugyldig API-nøkkel" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Ugyldig format" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "Ukjent metode" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "Ugyldige parametere" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "Ugjyldig ressurs" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "Ukjent tjeneste" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "Ugyldig sesjonsnøkkel" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "Ugyldig brukernavn og/eller passord" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "Mest spilte på Jamendo" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "Favorittlista på Jamendo" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "Månedens favoritter på Jamendo" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "Ukas favoritter på Jamendo" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "Jamendo-database" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "Gå til sporet som spilles av nå" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Hold nede knappen i %1 sekund(er)..." #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Hold nede knappen i %1 sekund(er)..." #: ../bin/src/ui_behavioursettingspage.h:193 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:193 msgid "Keep the original files" msgstr "Belhold originalfiler" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "Kattunger" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Språk" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "Laptop/Hodetelefoner" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Storsal" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "Stort albumbilde" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "Stort sidefelt" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "Sist spilt" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "Egendefinert radio på Last.fm: %1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Last.fm-bibliotek: %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "Last.fm-miksradio: %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Last.fm-lokalradio: %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Last.fm-radio: %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Artister liknende %1 fra Last.fm" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Last.fm-taggradio: %1" #: internet/lastfmservice.cpp:437 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:154 msgid "Last.fm password" msgstr "Last.fm-passord" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "Antall avspillinger fra Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Tagger fra Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Last.fm-brukernavn" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Last.fm-wiki" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "Spor med minst stemmer" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "La stå tom for standardvalg. Eksempler: \"/dev/dsp\", \"front\", osv." #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "Venstre" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Lengde" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Bibliotek" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "Avansert biblioteksgruppering" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "Melding om gjennomsyn av biblioteket" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "Søk i biblioteket" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Grenser" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "Finn sanger på Grooveshark som ligner på de du nylig har spilt av" #: ui/equalizer.cpp:123 msgid "Live" msgstr "Live" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Hent" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "Hent albumgrafikk fra URL" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "Hent albumgrafikk fra URL..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "Hent albumbilde fra disk" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "Hent albumgrafikk fra disk..." #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "Åpne spilleliste" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "Åpne spilleliste..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Laster inn Last.fm-radio" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Åpner MTP-enhet" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "Åpner iPod-database" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "Åpner smart spilleliste" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "Åpner sanger" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "Lader lydstrøm" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "Åpner spor" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "Henter informasjon om spor" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "Åpner..." #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "Åpne filer/URLer; erstatt gjeldende spilleliste" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Innlogging" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "Login feilet" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "Long term prediction-profil (LTP)" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "Elsk" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Lav (%1 bilder/sekund)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "Lav (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "Low complexity-profil (LC)" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "Sangtekst" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "Sangtekst fra %1" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3, 96kbps" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4, AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Magnatune-nedlasting" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Magnatune-nedlasting fullført" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "Hovedprofil (MAIN)" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "Kjør på!" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "Gjør spillelista tilgjengelig online" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "Ugyldig svar" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "Manuell proxy-innstilling" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "Manuelt" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "Fabrikant" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "Merk som hørt" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "Merk som ny" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "Krev treff på alle søkeord (OG)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "Treff på hvilket som helst søkeord (ELLER)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "Høyeste bitrate" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "Medium (%1 bilder/sekund)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "Medium (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "Type medlemskap" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "Minimal bitrate" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "Manglende projectM-forhåndsinnstillinger" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "Modell" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "Følg med på endringer i biblioteket" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "Spill av i mono" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "Måneder" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "Stemning" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "Type stemningsstolpe" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "Stemningsstolper" #: library/library.cpp:74 msgid "Most played" msgstr "Mest spilt" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "Monteringspunkt" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "Monteringspunkter" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "Flytt ned" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "Flytt til bibliotek..." #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "Flytt opp" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "Musikk" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Musikkbibliotek" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "Demp" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "Mitt Last.fm-bibliotek" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "Min Last.fm-miksradio" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "Mitt Last.fm-nabolag" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "Min anbefalt radio på Last.fm" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "Min miksradio" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "Musikk" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "Mitt nabolag" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "Min radiostasjon" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "Mine anbefalinger" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Navn" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "Navnevalg" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "Smalbånd (SB)" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "Naboer" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "Nettverk" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "Mellomtjener" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "Tjener på nettet" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "Aldri" #: library/library.cpp:67 msgid "Never played" msgstr "Aldri spilt" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "Begynn aldri avspilling" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "Ny mappe" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "Ny spilleliste" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "Ny smart spilleliste..." #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "Nye sanger" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "Nye spor vil automatisk bli lagt til." #: library/library.cpp:80 msgid "Newest tracks" msgstr "Nyeste spor" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "Neste" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Neste spor" #: core/utilities.cpp:147 msgid "Next week" msgstr "Neste uke" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "Ingen analyse" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "Slå av bagrunnsbilde" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "Ingen omslag å eksportere." #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "Ingen lange blokker" #: playlist/playlistcontainer.cpp:366 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:145 msgid "No short blocks" msgstr "Ikke korte blokker" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "Ingen" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 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:155 msgid "Normal" msgstr "Normal" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "Normal blokktype" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "Ikke tilgjengelig sammen med dynamiske spillelister" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "Ikke tilkoblet" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "Ikke nok innhold" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "Ikke nok tilhengere" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "Ikke nok medlemmer" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "Ikke nok naboer" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Ikke installert" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "Ikke pålogget" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "Ikke montert - dobbelklikk for å montere" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "Meldingstype" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Meldinger" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Nå spilles" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "Forhåndsvisning av notifikasjon" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "OGG FLAC" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 msgid "Only allow connections from the local network" msgstr "" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Bare vis første" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "Opacity" msgstr "Dekkevne" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "Åpne %1 i nettleser" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "Åpne lyd-&CD" #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "Åpne OPML-fil" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "Åpne OPML-fil..." #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "Åpne enhet" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "Åpne fil..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "Åpne i Google Disk" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "Åpne i ny spilleliste" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Åpne..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "Operasjonen feilet" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "Optimalisert for bitrate" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "Optimalisert for kvalitet" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "Innstillinger..." #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "Organisér filer" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "Organisér filer..." #: core/organise.cpp:65 msgid "Organising files" msgstr "Organiserer filer" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "Opprinnelige tagger" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Andre innstillinger" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "Ut" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "Ut-enhet" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "Utputt-innstillinger" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "Utputtmodu" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "Skriv over alle" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "Skriv over eksisterende filer" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "Skriv over bare mindre ~" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "Eier" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "Behandler Jamendo-katalogen" #: ui/equalizer.cpp:124 msgid "Party" msgstr "Fest" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "Passord" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Pause" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "Pause" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Pauset" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "Utøver" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "Pixel" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "Enkelt sidefelt" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Spill" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "Spill artist eller merkelapp" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "Spill artistradio..." #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "Antall ganger spilt av" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "Spill av egendefinert radio..." #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "Hvis stoppet: spill av. Hvis spiller: pause" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "Spill hvis det ikke er noe annet som spilles av for øyeblikket" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "Spill etikettradio..." #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "Spill av ende spor i spillelista" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "Spill av/Pause" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Avspilling" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Innstillinger for avspiller" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "Spilleliste" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "Spillelisten er ferdigspilt" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "Innstillinger for spilleliste" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "Type spilleliste" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "Spillelister" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "Vennligst lukk nettleseren og gå tilbake til Clementine." #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "Modulens status:" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "Podcaster" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Pop" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "Populære sange" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "Populære sanger denne måneden" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "Populære sanger i dag" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "Hvor lenge skal informasjonsvinduet vises" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "Portnummer" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "Lydforsterkning" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "Innstillinger" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "Innstillinger …" #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "Foretrukne albumbilde-filnavn (separert med komma)" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "Foretrukket lydformat" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "Foretrukket bitrate" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "Foretrukket format" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "Premium-lydtype" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "Forhåndsinnstillinger:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "Trykk en tastkombinasjon å bruke til" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "Trykk en tast" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Trykk en tastekombinasjon å bruke til %1..." #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "Skrivebordsmeldinginnstillinger" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "Forhåndsvisning" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "Forrige" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "Forrige spor" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Vis versjonsinformasjon" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "Profil" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "Fremgang" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 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:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "Kvalitet" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "Spør enhet..." #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "Købehandler" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "Legg valgte spor i kø" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "Legg spor i kø" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "Radio (lik loudness for alle spor)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "Radioer" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "Regn" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "Tilfeldig visualisering" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "Gi 0 stjerner til sangen" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "Gi 1 stjerne til sangen" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "Gi 2 stjerner til sangen" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "Gi 3 stjerner til sangen" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "Gi 4 stjerner til sangen" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "Gi 5 stjerner til sangen" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "Poenggiving" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "Vil du virkelig avbryte?" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "Oppfrisk" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "Oppfrisk katalogen" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "Hent kanaler på ny" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "Oppfrisk vennelista" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "Oppfrisk kanallista" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "Oppfrisk bakgrunnslyder" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Reggae" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "Husk Wii-fjernkontroll-bevegelse" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "Husk fra forrige gang" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Fjern" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "Fjern handling" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "Fjern duplikater fra spillelisten" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "Fjern katalog" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "Fjern fra Musikk" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "Fjern fra favoritter" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "Fjern fra spillelisten" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "Fjern spillelister" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "Fjerner sanger fra Musikk" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "Fjerner sanger fra favoritter" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "Gi nytt navn til spillelista \"%1\"" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "Gi nytt navn til Grooveshark-spilleliste" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "Gi nytt navn til spillelista" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "Gi nytt navn til spillelista..." #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "Renummerér sporene i denne rekkefølgen..." #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Repetér" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "Repetér album" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "Gjenta spilleliste" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "Repetér spor" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Erstatt gjeldende spilleliste" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "Erstatt spillelista" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "Erstatt mellomrom med understrek" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "Normalisering" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "Replay Gain-modus" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "Fyll lista igjen" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "Resett" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" msgstr "Resett avspillingsteller" #: 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:206 msgid "Restrict to ASCII characters" msgstr "Begrens til ASCII-tegn" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "Gjenoppta avspilling etter oppstart" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "Henter Musikk fra Grooveshark" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "Henter favorittsanger fra Grooveshark" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "Henter Grooveshark-spillelister" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "Returnér til Clementine" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "Høyre" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "Kjør" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "Mellomtjener for SOCKS" #: internet/subsonicsettingspage.cpp:122 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:202 msgid "Safely remove device" msgstr "Trygg fjerning av enhet" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "Kjør trygg fjerning av enhet etter kopiering" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "Samplingsrate" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "Samplingsrate" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "Lagre .mood-filer i musikkbiblioteket ditt" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "Lagre albumbilde" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "Lagre bilde til disk..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "Lagre bilde" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "Lagre spillelista" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "Lagre spillelista..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "Lagre forhåndsinnstilling" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "Lagre poeng i tagger når mulig" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "Lagre statistikk i filtagger når mulig" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "Lagre denne kanalen i en Internett-flik" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "Lagrer sangstatistikk til filene" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "Lagrer spo" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "Skalerbar samplingrate-profil (SSR)" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "Skalér til størrelse" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "Karakte" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "Fortell last.fm om (\"scrobble\") sangene jeg har lyttet til" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "Søk" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "Søk i Icecast-stasjoner" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "Søk i Jamendo" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Søk i Magnatune" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "Søk i Subsonic" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "Søk etter albumbilder..." #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "Søk etter hva som helst" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "Søk på gpodder.net" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "Søk iTunes" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "Søkemodus" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "Søkeinnstillinger" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "Søkeresultater" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "Søkekriterier" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "Søker på Grooveshark" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "Andre nivå" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "Gå bakover" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "Gå fremove" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "Gå frem-/bakover en viss tidsperiode i sporet" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "Gå til et bestemt tidspunkt i sporet" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "Velg alle" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "Velg ingen" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "Velg bakgrunnsfarge:" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "Velg bakgrunnsbilde" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "Velg det beste treffet" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "Velg forgrunnsfarge:" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "Velg visualiseringer" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "Velg visualiseringer..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "Serienummer" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "Tjener-URL" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "Tjenerdetaljer" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "Tjenesten er utilgjengelig" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Sett %1 to \"%2\"..." #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "Sett lydstyrken til prosent" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "Sett verdi for alle de valgte sporene..." #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Hurtigtast" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "Hurtigtast for %1" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Det finnes allerede en hurtigtast for %1" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Vis" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "Vis display" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "Vis aura rundt gjeldende spor" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "Vis stemningsstolper i panelet for avspillingsfremgang." #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "Vis en skrivebordsmelding som passer til ditt operativsystem" #: ../bin/src/ui_notificationssettingspage.h:442 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:441 msgid "Show a notification when I change the volume" msgstr "Vis informasjonsvinsu når jeg endrer lydstyrke" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "Popp opp informasjon fra systemskuffa" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "Vis en Clementine-spesifikk skrivebordsmelding" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "Vis over statuslinja" #: ui/mainwindow.cpp:460 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:209 msgid "Show cover art in library" msgstr "Vis albumbilder i biblioteket" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "Vis delere" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "Vis i fullskjerm..." #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "Vis i filbehandler..." #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "Vis under Diverse Artister" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "Vis Stemningsstolpe" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "Vis bare duplikate" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "Vis bare filer uten tagger" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "Vis søkeforslag" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "Vis \"Elsk\" og \"Bannlys\" knappene" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "Vis scrobble-knappen i hovedvinduet" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "Vis systemkurvikon" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "Vis hvilke kilder som er på og hvilke som er av" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "Vis/skjul" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Stokk om" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "Stokk om album" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "Stokk alle" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "Stokk om spillelista" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "Stokk om dette albumet" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "Logg in" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "Logg ut" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "Logger på..." #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "Lignende artister" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "Størrelse" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "Størrelse:" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "Gå bakover i spillelista" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "Antall ganger hoppet over" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "Gå fremover i spillelista" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "Lite albumbilde" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "Lite sidefelt" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "Smart spilleliste" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "Smarte spillelister" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Myk" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "Informasjon om sange" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "Info om sangen" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "Sonogram" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "Beklager" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "Sorter alfabetisk etter sjanger" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "Sorter etter sjangerens popularitet" #: ../bin/src/ui_icecastfilterwidget.h:77 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" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "Kilde" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "Kilder" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "Kunne ikke logge på Spotify" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "Spotify-modul" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "Har ikke installert Spotify-modul" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "Standard" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "Har stjerner" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "Begynn på spillelista nå" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "Start koding" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 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:405 #, qt-format msgid "Starting %1" msgstr "Starter %1" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "Starter …" #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "Stasjoner" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Stopp" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "Stopp etter" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "Stopp etter denne sangen" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Stopp avspilling" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "Stopp avspilling etter gjeldende spor" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "Stoppet" #: core/song.cpp:341 msgid "Stream" msgstr "Strøm" #: internet/subsonicsettingspage.cpp:30 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:160 msgid "Streaming membership" msgstr "Streaming-medlemskap" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "Spillelister du abonnerer på" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "Abonnente" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "Subson" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "Lykkes!" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "Skrev %1" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "Foreslåtte tagger" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "Sammendrag" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "Super-høy (%1 bilder/sek)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "Superhøy (2048x2048)" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "Støttede formater" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "Synkronisér statistikk til filene nå" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "Synkroniserer Spotify-innboksen" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "Synkroniserer Spotify-spillelista" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "Synkroniserer spor med sterner mot Spotify" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "Systemfarger" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "Fliker på toppen" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Merkelapp" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "Tagg-henter" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "Merkelappradio" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "Ønsket bitrate" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Tekno" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "Tekstinnstillinger" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Takk til" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Kunne ikke starte kommandoen \"%1\"" #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "Albumgrafikken til sangen som spilles av i øyeblikket" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "Katalogen %1 er ikke gyldig" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "Spillelista '%1' var tom, eller kunne ikke lastes inn" #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "Stedet du spesifiserte, er ikke et bilde!" #: internet/subsonicsettingspage.cpp:98 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:2083 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å ny. Grunnen er følgende nye funksjoner:" #: library/libraryview.cpp:529 msgid "There are other songs in this album" msgstr "Ingen andre sanger i dette albumet" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "Kommunikasjonsproblemer med gpodder.net" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Kunne ikke hente metadata fra Magnatune" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Forstod ikke svaret fra iTunes Store" #: ui/organiseerrordialog.cpp:56 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:389 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:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 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:187 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:174 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:151 msgid "Third level" msgstr "Tredje nivå" #: internet/jamendoservice.cpp:171 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/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "Dette albumet er ikke tilgjengelig i formatet du bad om" #: ../bin/src/ui_deviceproperties.h:381 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:375 msgid "This device supports the following file formats:" msgstr "Denne enheten støtter følgende filformat:" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Enheten vil ikke fungere ordentlig" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "Denne tjenesten er kun for betalende kunder" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "Denne enhetstypen (%1) støttes ikke." #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "Tidsavbrud" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Tittel" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "For å starte Grooveshark-radio bør du først lytte til et par andre Grooveshark-sanger" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "I dag" #: core/globalshortcuts.cpp:59 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:1369 msgid "Toggle queue status" msgstr "Slå av/på køstatus" #: ../bin/src/ui_mainwindow.h:718 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:143 msgid "Tomorrow" msgstr "I morgen" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "For mange videresendinger" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "Favorittspor" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "Totalt antall album:" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "Totalt overført, bytes" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "Totalt antall forespørsler over nettet" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Spor" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "Kod om musikk" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "Logg for omkoder" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "Omkoding" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Koder om %1 filer i %2 tråder" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "Innstillinger for omkoding" #: core/song.cpp:338 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "Turbin" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "Slå av" #: devices/giolister.cpp:161 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "URL(er)" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "Ultrabredt bånd (UWB)" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Kunne ikke laste ned %1 (%2)" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Ukjent" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "Ukjent innholdstype" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Ukjent feil" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "Fjern omslaget" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "Avmeld" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "Fremtidige konserter" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "Oppdater Grooveshark-spilleliste" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "Oppdatér alle podcaster" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "Oppdatér endrede bibliotekkataloge" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "Oppdatér biblioteket når Clementine starte" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "Oppdatér denne podcasten" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "Oppdaterer" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Oppdaterer %1" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "Oppdaterer %1% …" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Oppdaterer bibliotek" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "Bruk" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "Bruk Albumartist-taggen når tilgjengelig" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "Bruk hurtigtaster fra Gnome" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "Bruk normaliserings-metadata hvis tilgjengelig" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "Bruk SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "Bruk Wii-fjernkontroll" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "Bruk egendefinert fargedrakt" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "Bruk egendefinert meldingstype for beskjeder" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "Bruk autentisering" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "Bruk kontrollert bitrate" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "Bruk dynamisk modus" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "Vis meldinger om Wii-fjernkontrollen" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "Bruk \"temporal noise shaping\"" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "Bruk systemstandard" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "Bruk systemets fargedrakt" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "Bruk standard proxy-innstillinger" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "Bruk normalisering" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "Brukt" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "Brukeren %1 har ikke en Grooveshark Anywhere-konto" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "Brukergrensesnit" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Brukernavn" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "Hvis du bruker menyen for å legge til en sang..." #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "Variabel bitrate" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "Diverse artister" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "Versjon %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "Vis" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "Visualiseringsmodus" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "Visualiseringer" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "Innstillinger for visualisering" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "Taledeteksjon" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "Volum %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "WAV" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "Webside" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "Uker" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "Når Clementine starter" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "Når listen er tom..." #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "Hvorfor ikke prøve..." #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "Bredbånd (WB)" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii-fjernkontroll %1: aktivert" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii-fjernkontroll %1: tilkoblet" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii-fjernkontroll %1: lavt batteri (%2%)" #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii-fjernkontroll %1: deaktivert" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii-fjernkontroll %1: frakoblet" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii-fjernkontroll %1: lavt batteri (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "Windows Media, 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "Windows Media audio" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "Uten omslag:" #: library/libraryview.cpp:530 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:2088 msgid "Would you like to run a full rescan right now?" msgstr "Vil du se gjennom hele biblioteket på ny nå?" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "Skriv all statistikk til sangfilene" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "Ugyldig brukernavn og/eller passord" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "År" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "År - Album" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "År" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "I går" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "Du kommer nå til å laste ned følgende album" #: playlist/playlistlistcontainer.cpp:311 #, 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:177 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:172 msgid "You are not signed in." msgstr "Du har ikke logget på." #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "Du er pålogget som %1." #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "Du er pålogget" #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "Du kan velge hvordan sangene i biblioteket er organisert." #: internet/digitallyimportedsettingspage.cpp:46 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/magnatunesettingspage.cpp:53 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:57 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." #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "Du kan dele lyttevaner (\"scrobble\") gratis, men bare betalende abonnenter kan høre Last.fm-radio i Clementine." #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "Du har ikke noen Grooveshark Anywhare-konto." #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Du har ikke noen Spotify Premium-konto." #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "Du har ikke noe aktivt abonnement" #: internet/spotifyservice.cpp:170 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/spotifysettingspage.cpp:158 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:87 msgid "You love this track" msgstr "Du elsker dette sporet" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "Du må gå til Systeminnstillinger og slå på \"Tillat tilgang til hjelpeenheter\" for å bruke globale hurtigtaster i Clementine." #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "Du må starte Clementine på nytt for å bytte språk." #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "Siden du ikke er en Last.fm-abonnent, kan du ikke høre Last.fm-radiokanaler." #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "Din IP-adresse:" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Din Last.fm-brukerinformasjon var ikke riktig" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "Feil med din Magnatune-brukerinformasjon" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "Ditt bibliotek er tomt!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "Dine radiokanaler" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "Dine delte lyttevaner (\"scrobbles\"): %1" #: visualisations/visualisationcontainer.cpp:152 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/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "Feil med din brukerinformasjon" #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Å-A" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Null" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "legg til %n sanger" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "etter" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "siden" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "og" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "automatisk" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "før" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "mellom" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "største først" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "slag per minutt" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "inneholder" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "slått av" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "disk %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "inneholder ikke" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "slutter med" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "er lik" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "gpodder.net" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "gpodder.net-katalog" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "større enn" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "i de siste" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "mindre en" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "lengste først" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "flytt %n sanger" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "nyeste først" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "ikke lik" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "ikke i de siste" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "ikke den" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "eldste først" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "de" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "innstillinger" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "trykk Enter" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "fjern %n sange" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "korteste først" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "Stokkemodus" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "minste først" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "Sortér sanger" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "begynner me" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "stopp" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "spor %1" clementine-1.2.0+dfsg/src/translations/nl.po000066400000000000000000004637161223327513400210600ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # arnaudbienner , 2011 # FIRST AUTHOR , 2010 # Sparkrin , 2013 # Sparkrin , 2011-2012 # TheLastProject , 2012 # PapaCoen , 2012 # valorcurse , 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:07+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr " dagen" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " msec" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " pt" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " seconden" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " nummers" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 albums" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 dagen" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 dagen geleden" #: podcasts/gpoddersync.cpp:79 #, 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:413 #, qt-format msgid "%1 selected of" msgstr "%1 geselecteerd van" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 nummer" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 nummers" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 nummers gevonden" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 nummers gevonden (%2 worden weergegeven)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 nummers" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 overgezet" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimotedev-module" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n mislukt" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n voltooid" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "Aan&gepast" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "&Extra's" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "&Hulp" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "%1 &verbergen" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "&Verbergen…" #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Links" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "&Muziek" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "Gee&n" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "&Afspeellijst" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Afsluiten" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "&Herhaalmodus" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Rechts" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "&Willekeurige modus" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "Kolommen &uitstrekken totdat ze het venster vullen" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "&Hulpmiddelen" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(niet bij alle nummers hetzelfde)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "... en allen die aan Amarok hebben bijgedragen" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "0px" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 dag" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 nummer" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "127.0.0.1" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "40%" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 willekeurige nummers" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "Nu opwaarderen naar Premium" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "Een Grooveshark Anywhere account is vereist." #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "Een Spotify Premium account is vereist." #: ../bin/src/ui_networkremotesettingspage.h:189 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:78 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:153 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:297 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "AAC 128K" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC 64K" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "ALL GLORY TO THE HYPNOTOAD" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "Afbreken" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "Over %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "Over Clementine…" #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "Over Qt…" #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Account gegevens" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "Account gegevens (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Actie" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Activeer/deactiveer Wiiremote" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "Voeg podcast toe" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Radiostream toevoegen" #: ../bin/src/ui_notificationssettingspage.h:425 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:193 msgid "Add action" msgstr "Actie toevoegen" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Nog een radiostream toevoegen…" #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Map toevoegen…" #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "Bestand toevoegen" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "Bestand toevoegen voor conversie." #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "Bestand(en) toevoegen voor conversie." #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Bestand toevoegen…" #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Te converteren bestanden toevoegen" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Map toevoegen" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Map toevoegen…" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Nieuwe map toevoegen…" #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "Voeg podcast toe" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "Voeg podcast toe..." #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Zoekterm toevoegen" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "Album-label toevoegen" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "Albumartiest-label toevoegen" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "Artiest-label toevoegen" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "Score toevoegen" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "Componist-label toevoegen" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "Schijf-label toevoegen" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "Bestandsnaam toevoegen" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "Genre-label toevoegen" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "Groepering-label toevoegen" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "Lengte toevoegen" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "Uitvoerend artiest-label toevoegen" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "Aantal maal afgespeeld toevoegen" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "Waardering toevoegen" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "Aantal maal overgeslagen toevoegen" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "Titel-label toevoegen" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "Nummer-label toevoegen" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "Jaar-label toevoegen" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Radiostream toevoegen…" #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "Aan Grooveshark favorieten toevoegen" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "Aan Grooveshark afspeellijst toevoegen" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "Aan een andere afspeellijst toevoegen" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Aan afspeellijst toevoegen" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "Aan de wachtrij toevoegen" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Wiimotedev-actie toevoegen" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Toevoegen…" #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Deze maand toegevoegd" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Deze week toegevoegd" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Dit jaar toegevoegd" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Vandaag toegevoegd" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Afgelopen drie maanden toegevoegd" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "Toevoegen nummer aan Mijn Muziek" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "Nummer toevoegen aan favorieten" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Geavanceerd groeperen…" #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "Na" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "Na het kopiëren…" #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Album (ideaal volume voor alle nummers)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Albumartiest" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "Albumhoes" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Albuminfo op jamendo.com…" #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Albums met albumhoes" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Albums zonder albumhoes" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Alle bestanden (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "All Glory to the Hypnotoad!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Alle albums" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Alle artiesten" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "Alle bestanden (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Alle afspeellijsten (%1)" #: ui/about.cpp:74 msgid "All the translators" msgstr "Alle vertalers" #: library/library.cpp:84 msgid "All tracks" msgstr "Alle nummers" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "Sta mid/side-encoding toe" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "Bij het origineel" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Hoofdscherm altijd verbergen" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Hoofdscherm altijd weergeven" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "Altijd afspelen" #: internet/spotifyblobdownloader.cpp:60 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:61 msgid "An error occurred loading the iTunes database" msgstr "Er is een fout opgetreden tijdens het laden van de iTunes-database" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Er is een fout opgetreden bij het wegschrijven van metadata naar ‘%1’" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "Er deed zich een onbekende fout voor" #: ui/about.cpp:78 msgid "And:" msgstr "En:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "Boos" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Uiterlijk" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Bestanden/URLs aan afspeellijst toevoegen" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "Aan huidige afspeellijst toevoegen" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "Aan de afspeellijst toevoegen" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "Compressie toepassen om vervorming te voorkomen" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Weet u zeker dat u voorinstelling ‘%1’ wilt wissen?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "Weet u zeker dat u deze afspeellijst wilt wissen?" #: ui/edittagdialog.cpp:769 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:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Artiest" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Artiestinfo" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "Artiestradio" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "Artiestlabels" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "Artiest's initiaal" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Audioformaat" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Aanmelden mislukt" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "Auteur" #: ui/about.cpp:65 msgid "Authors" msgstr "Auteurs" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Automatisch" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Automatisch updaten" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "Automatisch enkelvoudige categorieën in bibliotheekboom openen" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "Beschikbaar" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "Gemiddelde bitrate" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "Gemiddelde afbeeldinggrootte" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "BBC Podcasts" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "Achtergrondstreams" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Achtergrondkleur" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "Achtergrondafbeelding" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Achtergrond-doorzichtigheid" #: core/database.cpp:734 msgid "Backing up database" msgstr "Bezig met het maken van een backup van de database" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "Balans" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Verbannen" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "Balkweergave" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Basic Blue" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "Standaard audio formaat" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Gedrag" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "Beste" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "Biografie van %1" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Bitrate" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "Bitrate" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "Blokweergave" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "Bloktype" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "Vervagen" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "Body" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "Boomweergave" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Bladeren…" #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "Buffer duur" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "Bufferen" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "Maar deze bronnen zijn uitgeschakeld:" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Knoppen" #: core/song.cpp:339 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "CUE-sheet ondersteuning" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "Annuleren" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Albumhoes wijzigen" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Lettergrootte wijzigen…" #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "Herhaalmodus wijzigen" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Sneltoets wijzigen…" #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "Shuffle-modus wijzigen" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "De taal wijzigen" #: ../bin/src/ui_playbacksettingspage.h:330 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:228 msgid "Check for new episodes" msgstr "Zoek naar nieuwe afleveringen" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Zoeken naar updates..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "Kies een naam voor uw slimme-afspeellijst" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Automatisch kiezen" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Kleur kiezen…" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "Lettertype kiezen…" #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Kies uit de lijst" #: smartplaylists/querywizardplugin.cpp:155 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." #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "Kies map waarnaar podcasts gedownload worden" #: ../bin/src/ui_songinfosettingspage.h:188 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:115 msgid "Classical" msgstr "Klassiek" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "Bezig met opschonen" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Wissen" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Afspeellijst wissen" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Clementine fout" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Clementine oranje" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Clementine visualisatie" #: ../bin/src/ui_deviceproperties.h:376 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_boxsettingspage.h:104 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:104 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:104 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_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "Clementine kan muziek afspelen die u op Ubuntu One opgeslagen hebt" #: ../bin/src/ui_notificationssettingspage.h:431 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:250 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:128 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." #: internet/lastfmsettingspage.cpp:110 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 "Clementine kan de status van uw abonnement niet ophalen, omdat er problemen met uw verbinding zijn. Afgespeelde nummers zullen worden gecached en later naar Last.fm verzonden." #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Clementine afbeeldingen weergeven" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "Clementine heeft geen resultaten voor dit bestand gevonden" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "Clementine zal zoeken in:" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Klik hier om muziek toe te voegen" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "Klik om te schakelen tussen resterende duur en totale duur" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "Afspeellijst sluiten" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "Visualisatie sluiten" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "De download wordt afgebroken als u dit venster sluit." #: ui/albumcovermanager.cpp:216 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:116 msgid "Club" msgstr "Club" #: ../bin/src/ui_appearancesettingspage.h:272 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:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Opmerking" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "Labels automatisch voltooien" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "Labels automatisch voltooien…" #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Componist" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "Configureren %1" #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "Grooveshark configureren…" #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Last.fm configureren…" #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "Magnatune configureren…" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Sneltoetsen instellen" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "Configureer Spotify..." #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "Subsonic configureren..." #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "Globaal zoeken instellen..." #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "Bibliotheek configureren…" #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "Podcasts configureren" #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "Configureer..." #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "Wii Remotes met activeer/deactiveer-actie verbinden" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "Apparaat verbinden" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "Met Spotify verbinden" #: internet/subsonicsettingspage.cpp:107 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/subsonicsettingspage.cpp:117 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/" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "Console" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "Constante bitrate" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "Alle muziek converteren" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "Alle muziek die het apparaat niet kan afspelen converteren" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "Kopieer naar klembord" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Naar apparaat kopiëren…" #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Naar bibliotheek kopiëren…" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "Copyright" #: internet/subsonicsettingspage.cpp:81 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:64 #, 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" #: transcoder/transcoder.cpp:432 #, 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:426 #, 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/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "Kan het last.fm-radiostation niet laden" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "Kan uitvoerbestand %1 niet openen" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Albumhoesbeheerder" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "Albumhoes van toegevoegde afbeelding" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Albumhoes automatisch van %1 geladen" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "Albumhoes handmatig teruggezet" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "Albumhoes niet ingesteld" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "Albumhoes ingesteld van %1" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "Albumhoes van %1" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "Nieuwe Grooveshark afspeellijst maken" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "Cross-fade wanneer automatisch van nummer veranderd wordt" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "Cross-fade wanneer handmatig van nummer veranderd wordt" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "Aangepast" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "Aangepaste afbeelding:" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "Instellingen voor aangepaste berichten" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "Aangepaste radio" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Aangepast…" #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "DBus-pad" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Dance" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Aanmaakdatum" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Wijzigingsdatum" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "Dagen" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "Stan&daard" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "Volume met 4% verlagen" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "Verlaag het volume met procent" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Volume verlagen" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "Standaard achtergrondafbeelding" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "Standaardinstellingen" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "Vertraging tussen visualisaties" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "Verwijderen" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "Grooveshark afspeellijst wissen" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "Verwijder gedownloadde gegevens" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Bestanden verwijderen" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Van apparaat verwijderen…" #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Van schijf verwijderen…" #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "Verwijder afgespeelde afleveringen" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "Voorinstelling verwijderen" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "Slimme-afspeellijst verwijderen" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "Oorspronkelijke bestanden verwijderen" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Bestanden worden verwijderd" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "Geselecteerde nummers uit wachtrij verwijderen" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "Nummer uit wachtrij verwijderen" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Bestemming" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Details…" #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Apparaat" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Apparaateigenschappen" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Apparaatnaam" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Apparaateigenschappen…" #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Apparaten" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Bedoelde u" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "Digitally Imported wachtwoord" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "Digitally Imported gebruikersnaam" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "Directe internetverbinding" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Map" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "Notificatie permanent weergeven" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "Schakel het aanmaken van de stemmingsbalk uit" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Uitgeschakeld" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Schijf" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "Overdracht onderbreken" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "Weergaveopties" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Infoschermvenster weergeven" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "De volledige database opnieuw scannen" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "Geen muziek converteren" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "Niet overschrijven" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Niet herhalen" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "Niet in diverse artiesten weergeven" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "Niet willekeurig afspelen" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "Niet stoppen!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "Doneer" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Dubbeklik om te openen" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "Dubbelklikken op een nummer zal…" #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "Download %n afleveringen" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "Download map" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "Download afbeeldingen naar" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "Lidmaatschap downloaden" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "Download nieuwe afleveringen automatisch" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "Download in wachtrij gezet" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Dit album downloaden" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Dit album downloaden…" #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "Download deze aflevering" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "Downloaden…" #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "Bezig met downloaden (%1%)..." #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "Icecast-map aan het downloaden" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "Jamendo-catalogus downloaden" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "Magnatune-catalogus downloaden" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "De Spotify plug-in aan het downloaden" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "Metadata ophalen" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "Sleep om te verplaatsen" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "Dropbox" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "Dynamische-modus ingeschakeld" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "Dynamische random mix" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "Slimme-afspeellijst bewerken…" #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Label ‘%1’ bewerken…" #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "Label bewerken…" #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "Labels bewerken" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Nummerinformatie bewerken" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "Nummerinformatie bewerken…" #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Nummerinformatie bewerken…" #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Bewerken…" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "Ondersteuning voor Wii Remote inschakelen" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "Equalizer inschakelen" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "Sneltoetsen alleen inschakelen wanneer Clementine de focus heeft" #: ../bin/src/ui_globalsearchsettingspage.h:147 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:62 msgid "Enable/disable Last.fm scrobbling" msgstr "Last.fm scrobbling in/uitschakelen" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "Coderingscomplexiteit" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "Kwaliteit encoding-engine" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "Coderings-modus" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "Voer een URL in" #: ../bin/src/ui_coverfromurldialog.h:103 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:205 msgid "Enter a filename for exported covers (no extension):" msgstr "Geef een bestandsnaam voor de geëxporteerde albumhoezen (geen extensie)" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "Voer een nieuwe naam voor deze afspeellijst in" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Voer de naam van een artiest of een label in om naar Last.fm radio te kunnen luisteren." #: ../bin/src/ui_globalsearchview.h:209 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:77 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:77 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:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "Voer hier een zoekterm in" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "Voer de URL van een internetradios-tream in:" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "Geef de naam van de map" #: ../bin/src/ui_networkremotesettingspage.h:198 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:87 msgid "Entire collection" msgstr "Gehele verzameling" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Fout" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Fout tijdens het verbinden met het MTP-apparaat" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "Fout tijdens het kopiëren van de nummers" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "Fout tijdens het verwijderen van de nummers" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "Fout bij het downloaden van de Spotify plug-in" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "Fout bij laden van %1" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Fout bij laden di.fm afspeellijst" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "Fout bij verwerken van %1: %2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "Fout bij het laden van audio-cd" #: library/library.cpp:63 msgid "Ever played" msgstr "Ooit afgespeeld" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "Elke 10 minuten" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "Elke 12 uur" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "Elke 2 uur" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "Elke 20 minuten" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "Elke 30 minuten" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "Elke 6 uur" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "Elk uur" #: ../bin/src/ui_playbacksettingspage.h:303 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:208 msgid "Existing covers" msgstr "Bestaande albumhoezen" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "Aanvullen" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "Verloopt op %1" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "Albumhoezen Exporteren" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "Albumhoezen exporteren" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "Exporteer gedownloade albumhoezen" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "Exporteer albumhoezen in mediabestanden" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "Klaar me exporteren" #: ui/albumcovermanager.cpp:786 #, 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:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "Uitvagen bij pauze / Invagen bij hervatten" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "Uitvagen bij stoppen van een nummer" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "Uitvagen" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "Uitvaagduur" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "Ophalen van de map is mislukt" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "Ophalen van podcasts mislukt" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "Laden van podcast mislukt" #: podcasts/podcasturlloader.cpp:167 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:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "Snel" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "Favorieten" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "Favoriete nummers" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "Ontbrekende albumhoezen ophalen" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "Automatisch ophalen" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "Ophalen voltooid" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "Ophalen van Subsonic bibliotheek" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Fout bij ophalen albumhoes" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "Bestandsextensie" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "Bestandsformaten" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Bestandsnaam" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "Bestandsnaam (zonder pad)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Bestandsgrootte" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Bestandstype" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Bestandsnaam" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Bestanden" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "Te converteren bestanden" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "Vind nummers in uw bibliotheek die met de opgegeven criteria overeenkomen." #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "Uniek patroon uit nummer halen" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "Voltooien" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "Eerste niveau" #: core/song.cpp:328 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Tekengrootte" #: ../bin/src/ui_spotifysettingspage.h:213 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:204 msgid "Force mono encoding" msgstr "Mono-encodering forceren" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "Apparaat vergeten" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Formulier" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "Formaat" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Framerate" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "Frames per buffer" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Vrienden" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "Bevroren" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Maximale bas" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "Maximale bas + hoge tonen" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "Maximale hoge tonen" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "GStreamer audio-engine" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "Algemeen" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Algemene instellingen" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Genre" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "Haal URL op van deze Grooveshark afspeellijst" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "Haal URL op van dit Grooveshark nummer" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "Ophalen van populaire Grooveshark nummers" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "Kanalen ophalen" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "Radiostream ophalen" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "Geef het een naam:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "Ga" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "Ga naar het volgende afspeellijst tabblad" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "Ga naar het vorige afspeellijst tabblad" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, 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:206 msgid "Grey out non existent songs in my playlists" msgstr "Niet-bestaande nummer in de afspeellijst vervagen" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "Grooveshark login fout" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "Grooveshark afspeellijst URL" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "Grooveshark radio" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "Grooveshark nummer URL" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "Bibliotheek groeperen op…" #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "Groeperen op" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "Groeperen op album" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "Groeperen op artiest" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "Groeperen op artiest/album" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "Groeperen op artiest/jaar - album" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "Groeperen op genre/album" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "Groeperen op genre/artiest/album" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "Groepering" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "HTML-pagina bevat geen RSS-feed" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "HTTP-proxy" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "Blij" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "Hardware-informatie" #: ../bin/src/ui_deviceproperties.h:372 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:202 msgid "High" msgstr "Hoog" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "Hoog (%1 fps)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "Hoog (1024x1024)" #: internet/subsonicsettingspage.cpp:112 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:310 msgid "Hours" msgstr "Uur" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "Ik heb geen Magnatune-account" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Pictogram" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "Pictogrammen bovenaan" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "Nummer identificeren" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 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:77 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:204 msgid "Ignore \"The\" in artist names" msgstr "\"The\" in artiestennamen negeren" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Afbeeldingen (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "In %1 dagen" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "In %1 weken" #: ../bin/src/ui_wizardfinishpage.h:86 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/spotifyservice.cpp:360 msgid "Inbox" msgstr "Inbox" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "Albumhoes in de notificatie weergeven" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "Voeg alles toe" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Incompatibele Subsonic REST protocol versie. Client moet upgraden. " #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Incompatibele Subsonic REST protocol versie. Server moet upgraden. " #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Configuratie incompleet, controleer dat alle velden ingevuld zijn." #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "Volume met 4% verhogen" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "Verhoog het volume met procent " #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Volume verhogen" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "Indexeren %1" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "Informatie" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "Invoegen…" #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Geïnstalleerd" #: core/database.cpp:673 msgid "Integrity check" msgstr "Integriteits check" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "Internet bronnen" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "Ongeldige API-sleutel" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Ongeldig formaat" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "Ongeldige methode" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "Ongeldige parameters" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "Ongeldige bron opgegeven" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "Ongeldige service" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "Ongeldige sessiesleutel" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "Ongeldige gebruikersnaam en/of wachtwoord" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "Jamendo, meestbeluisterde nummers" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "Jamendo, beste nummers" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "Jamendo, beste nummers van de maand" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "Jamendo, beste nummers van de week" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "Jamendo database" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "Spring naar het huidige nummer" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Hou de toetsen voor %1 seconde ingedrukt…" #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Hou de toetsen voor %1 seconden ingedrukt…" #: ../bin/src/ui_behavioursettingspage.h:193 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:193 msgid "Keep the original files" msgstr "De originele bestanden behouden" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "Poesjes" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Taal" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "Laptop/koptelefoon" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Grote hal" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "Grote albumhoes" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "Grote zijbalk" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "Laast afgespeeld" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "Aangepaste Last.fm-radio : %1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Last.fm-bibliotheek - %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "Last.fm-radiomix: %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Last.fm-Neighbor Radio - %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Last.fm-radiostation - %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Last.fm - artiesten vergelijkbaar met %1" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Last.fm - tagradio: %1" #: internet/lastfmservice.cpp:437 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:154 msgid "Last.fm password" msgstr "Last.fm wachtwoord" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "Last.fm statistieken" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Last.fm labels" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Last.fm gebruikersnaam" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Last.fm wiki" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "Nummers met laagste waardering" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "Leeglaten voor standaardwaarde. Voorbeelden: ‘/dev/dsp’, ‘front’ etc." #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "Links" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Duur" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Bibliotheek" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "Bibliotheek geavanceerd groeperen" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "Database herscan-melding" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "Database doorzoeken" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Grenzen" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "Luister naar Groovshark nummers op basis van je luister historie" #: ui/equalizer.cpp:123 msgid "Live" msgstr "Live" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Laden" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "Albumhoes van URL laden" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "Albumhoes van URL laden…" #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "Albumhoes van schijf laden" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "Albumhoes van schijf laden…" #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "Afspeellijst laden" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "Afspeellijst laden…" #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Last.fm-radio laden" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "MTP-apparaat laden" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "iPod-database laden" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "Slimme afspeellijst laden" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "Nummers laden" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "Radiostream laden" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "Nummers laden" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "Nummerinformatie laden" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "Laden…" #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "Bestanden/URLs laden, en vervangt de huidige afspeellijst" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Inloggen" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "Inloggen mislukt" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "Lange termijn voorspellingsprofiel (LTP)" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "Mooi" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Laag (%1 fps)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "Laag (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "Lage complexiteit profiel (LC)" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "Songteksten" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "Songtekst van %1" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP3 256K" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Magnatune-download" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Magnatune-download voltooid" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "Normaal profiel (MAIN)" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "Voer uit!" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "Afspeellijst offline beschikbaar maken" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "Foutieve respons" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "Handmatige proxyconfiguratie" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "Handmatig" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "Fabrikant" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "Markeer als beluisterd" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "Markeer als nieuw" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "Match op alle zoektermen (EN)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "Match op een of meer zoektermen (OF)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "Maximale bitrate" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "Gemiddeld (%1 fps)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "Gemiddeld (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "Type lidmaatschap" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "Minimale bitrate" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "Ontbrekende projectM voorinstellingen" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "Model" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "De bibliotheek op wijzigingen blijven controleren" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "Mono afspelen" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "Maanden" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "Stemming" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "Stemmingsbalk stijl" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "Stemmingsbalken" #: library/library.cpp:74 msgid "Most played" msgstr "Meest afgespeeld" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "Koppelpunt" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "Koppelpunten" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "Omlaag verplaatsen" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "Naar bibliotheek verplaatsen…" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "Omhoog verplaatsen" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "Muziek" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Muziekbibliotheek" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "Dempen" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "Mijn last.fm-bibliotheek" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "Mijn Last.fm-mixradio" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "Mijn Last.fm Neighborhood" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "Mijn Last.fm Recommended Radio" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "Mijn Mix Radio" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "Mijn Muziek" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "Mijn buurt" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "Mijn radiostation" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "Mijn aanbevelingen" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Naam" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "Benoemingsopties" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "Langzaam internet" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "Buren" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "Netwerk" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "Netwerk Proxy" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "Netwerk Remote" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "Nooit" #: library/library.cpp:67 msgid "Never played" msgstr "Nooit afgespeeld" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "Nooit afspelen" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "Nieuwe map" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "Nieuwe afspeellijst" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "Nieuwe slimme afspeellijst…" #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "Nieuwe nummers" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "Nieuwe nummers worden automatisch toegevoegd." #: library/library.cpp:80 msgid "Newest tracks" msgstr "Nieuwste nummers" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "Volgende" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Volgend nummer" #: core/utilities.cpp:147 msgid "Next week" msgstr "Volgende week" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "Geen weergave" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "Geen achtergrondafbeelding" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "Geen albumhoezen om te exporteren." #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "Geen lange blokken" #: playlist/playlistcontainer.cpp:366 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:145 msgid "No short blocks" msgstr "Geen korte blokken" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "Geen" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 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:155 msgid "Normal" msgstr "Normaal" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "Normaal blok type" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "Niet beschikbaar tijdens het gebruik van een dynamische afspeellijst" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "Niet verbonden" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "Onvoldoende inhoud" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "Onvoldoende fans" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "Onvoldoende leden" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "Onvoldoende buren" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Niet geïnstalleerd" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "Niet ingelogd" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "Niet aangekoppeld - dubbelklik om aan te koppelen" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "Notificatietype" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Notificaties" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Nu aan het afspelen" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "Voorbeeld infoschermvenster" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 msgid "Only allow connections from the local network" msgstr "" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Alleen de eerste tonen" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "Opacity" msgstr "Doorzichtigheid" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "%1 in de browser openen" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "&Audio-CD openen…" #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "OML bestand openen" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "OML bestand openen..." #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "Apparaat openen" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "Bestand openen..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "In Google Drive openen" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "In een nieuwe afspeellijst openen" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Openen..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "Bewerking is mislukt" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "Optimaliseer voor bitrate" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "Optimaliseer voor kwaliteit" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "Opties…" #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "Bestanden sorteren" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "Bestanden sorteren..." #: core/organise.cpp:65 msgid "Organising files" msgstr "Bestanden sorteren" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "Originele labels" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Overige opties" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "Output" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "Uitvoer apparaat" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "Uitvoeropties" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "Uitvoer plug-in" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "Alles overschrijven" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "Overschrijf bestaande bestanden" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "Overschrijf alleen kleinere" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "Eigenaar" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "Jamendo-catalogus verwerken" #: ui/equalizer.cpp:124 msgid "Party" msgstr "Party" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "Wachtwoord" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Pauze" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "Afspelen pauzeren" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Gepauzeerd" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "Uitvoerend artiest" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "Pixel" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "Normale zijbalk" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Afspelen" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "Artiest of label afspelen" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "Artiestradio afspelen…" #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "Aantal maal afgespeeld" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "Eigen radiostation afspelen…" #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "Afspelen indien gestopt, pauzeren indien afgespeeld" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "Afspelen wanneer niets aan het afspelen is" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "Tagradio afspelen…" #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "De de/ste track in de afspeellijst afspelen" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "Afspelen/pauzeren" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Weergave" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Speler-opties" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "Afspeellijst" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "Afspeellijst voltooid" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "Afspeellijst-opties" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "Afspeellijst type" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "Afspeellijsten" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "Sluit uw browser en keer terug naar Clementine." #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "Plug-in status:" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "Podcasts" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Pop" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "Populaire nummers" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "Populaire nummers van de maand" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "Populaire nummers van vandaag" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "Pop-up duur" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "Poort" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "Voorversterking" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "Voorkeuren" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "Voorkeuren..." #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "Eerste keuze voor bestandsnamen van albumshoezen (gescheiden door komma's)" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "Audioformaat-voorkeur" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "Bitrate voorkeur" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "Voorkeursformaat" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "Premium audio formaat" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "Voorinstelling:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "Druk een toetstencombinatie om te gebruiken" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "Druk een toets" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Druk een toetsencombinatie om voor %1 te gebruiken..." #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "Opties mooi infoschermvenster" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "Voorbeeld" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "Vorige" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "Vorig nummer" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Versie-informatie uitprinten" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "Profiel" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "Voortgang" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 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:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "Kwaliteit" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "apparaat afzoeken..." #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "Wachtrijbeheer" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "Geselecteerde nummers in de wachtrij plaatsen" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "Nummer in de wachtrij plaatsen" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "Radio (gelijk volume voor alle nummers)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "Radio's" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "Regen" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "Willekeurige visualisatie" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "Waardeer huidig nummer met 0 sterren" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "Waardeer huidig nummer met 1 ster" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "Waardeer huidig nummer met 2 sterren" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "Waardeer huidig nummer met 3 sterren" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "Waardeer huidig nummer met 4 sterren" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "Waardeer huidig nummer met 5 sterren" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "Waardering" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "Werkelijk annuleren?" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "Ververs" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "Catalogus verversen" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "Kanalen verversen" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "Vriendenlijst verversen" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "Lijst met stations verversen" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "Lijst met radiostreams verversen" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Reggae" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "Onthou Wii remote zwaai" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "Laatste instelling onthouden" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Verwijderen" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "Actie verwijderen" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "Verwijder dubbelen uit afspeellijst" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "Map verwijderen" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "Verwijder uit Mijn Muziek" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "Uit favorieten verwijderen" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "Uit afspeellijst verwijderen" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "Afspeellijsten verwijderen" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "Verwijderen nummers uit Mijn Muziek" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "Verwijderen nummer uit favorieten" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "Afspeellijst \"%1\" hernoemen" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "Grooveshark afspeellijst hernoemen" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "Afspeellijst hernoemen" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "Afspeellijst hernoemen..." #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "Nummers in deze volgorde een nieuw nummer geven…" #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Herhalen" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "Album herhalen" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "Afspeellijst herhalen" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "Nummer herhalen" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Huidige afspeellijst vervangen" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "Afspeellijst vervangen" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "Vervangt spaties door underscores" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "Replay Gain" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "Replay Gain modus" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "Opnieuw vullen" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "Herstel" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" msgstr "Reset afspeelstatistieken" #: 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:206 msgid "Restrict to ASCII characters" msgstr "Beperken tot ASCII karakters" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "Afspelen hervatten bij opstarten" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "Ophalen Grooveshark Mijn Muziek nummers" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "Ophalen van Groovshark favoriete nummers" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "Ophalen van Grooveshark afspeellijsten" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "Keer terug naar Clementine" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "Rechts" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "Uitvoeren" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "SOCKS proxy" #: internet/subsonicsettingspage.cpp:122 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:202 msgid "Safely remove device" msgstr "Apparaat veilig verwijderen" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "Apparaat veilig verwijderen na het kopiëren" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "Samplerate" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "Samplerate" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "Bewaar .mood bestanden in u muziekbibliotheek" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "Albumhoes opslaan" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "Albumhoes op schijf bewaren…" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "plaatje opslaan" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "Afspeellijst opslaan" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "Afspeellijst opslaan..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "Voorinstelling opslaan" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "Sla waarderingen op in bestand, indien mogellijk" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "Sla statistieken op in bestand, indien mogellijk" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "Deze radiostream in het ‘Internet’-tabblad opslaan" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "Opslaan van statistieken in muziekbestanden" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "Nummers opslaan" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "Schaalbare samplerateprofiel (SSR)" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "Groote schalen" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "Score" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "Scrobble de nummers waar ik naar luister" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "Zoeken" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "Icecast stations doorzoeken" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "Jamendo doorzoeken" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Zoeken op Magnatune" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "Subsonic doorzoeken" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "Naar albumhoezen zoeken…" #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "Naar iets zoeken" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "Doorzoek gpodder.net" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "Doorzoek iTunes" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "Zoekmodus" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "Zoekopties" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "Zoekresultaten" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "Zoek voorwaarden" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "Zoeken in Grooveshark" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "Tweede niveau" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "Achterwaarts zoeken" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "Voorwaarts zoeken" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "Spoel momenteel spelende nummer met een relatieve hoeveelheid door" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "Spoel het momenteel spelende nummer naar een absolute positie door" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "Alles selecteren" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "Niets selecteren" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "Selecteer achtergrond kleur" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "Kies achtergrondafbeelding" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "Selecteer best passende match" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "Selecteer voorgrond kleur" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "Visualisaties kiezen" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "Visualisaties kiezen..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "Serienummer" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "Server URL" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "Server gegevens" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "Service offline" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Stel %1 in op \"%2\"..." #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "Zet het volume op procent" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "Waarde voor alle geselecteerde nummers instellen…" #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Sneltoets" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "Sneltoets voor %1" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Sneltoets voor %1 bestaat reeds" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Weergeven" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "Infoschermvenster weergeven" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "Een oplichtende animatie weergeven op het huidige nummer" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "Toon een stemmingsbalk in de voortgangsbalk" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "Standaardsysteemnotificatie tonen" #: ../bin/src/ui_notificationssettingspage.h:442 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:441 msgid "Show a notification when I change the volume" msgstr "Notificatie weergeven als ik het volume wijzig" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "Pop-up van systeemvak weergeven" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "Mooi infoschermvenster weergeven" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "Boven statusbalk weergeven" #: ui/mainwindow.cpp:460 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:209 msgid "Show cover art in library" msgstr "Albumhoezen in bibliotheek tonen" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "Verdelers tonen" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "Volledig weergeven..." #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "In bestandsbeheer tonen…" #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "In diverse artiesten weergeven" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "Toon stemmingsbalk" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "Alleen dubbelen tonen" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "Nummers zonder labels tonen" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "Toon zoek sugesties" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "Knoppen ‘Mooi’ en ‘Verbannen’ weergeven" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "Toon de scrobble knop in het hoofdvenster" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "Systeemvakpictogram weergeven" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "Toon welke bronnen wel en niet beschikbaar zijn" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "Tonen/verbergen" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Willekeurig" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "Albums willekeurig afspelen" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "Alles willekeurig" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "Afspeellijst schudden" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "Nummers van dit album willekeurig" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "Log in" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "Afmelden" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "Bezig met inloggen...." #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "Vergelijkbare artiesten" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "Groote" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "Groote:" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "Terug in afspeellijst" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "Aantal maal overgeslagen" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "Vooruit in afspeellijst" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "Kleine albumhoes" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "Kleine zijbalk" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "Slimme afspeellijst" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "Slimme afspeellijsten" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Zacht" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "Nummerinformatie" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "Nummerinfo" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "Sonogram" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "Helaas" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "Sorteren op genre (alfabetisch)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "Sorteren op genre (populariteit)" #: ../bin/src/ui_icecastfilterwidget.h:77 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" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "Bron" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "Bronnen" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "Spotify inlogfout" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "Spotify plug-in" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "Spotify plug-in niet geïnstalleerd" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "Standaard" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "Met ster" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "Momenteel spelende afspeellijst starten" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "Converteren starten" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 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:405 #, qt-format msgid "Starting %1" msgstr "%1 wordt gestart" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "Starten…" #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "Stations" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Stoppen" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "Stop na" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "Na dit nummer stoppen" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Afspelen stoppen" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "Na dit nummer stoppen met afspelen" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "Gestopt" #: core/song.cpp:341 msgid "Stream" msgstr "Radiostream" #: internet/subsonicsettingspage.cpp:30 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:160 msgid "Streaming membership" msgstr "Streaming lidmaatschap" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "Geabonneerde afspeellijsten" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "Volgers" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "Succes!" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "%1 met succes weggeschreven" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "Gesuggereerde labels" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "Samenvatting" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "Superhoog (%1 fps)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "Zeer hoog (2048x2048)" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "Ondersteunde formaten" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "Nu statistieken naar bestanden synchoriseren" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "Spotify inbox synchroniseren" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "Spotify afspeellijst synchroniseren" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "Favoriete Spotify-nummers synchroniseren" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "Systeemkleuren" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "Tabs bovenaan" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Label" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "Labels ophalen" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "Tagradio" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "Doelbitrate" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "Tekstopties" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Met dank aan" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Het commando \"%1\" kon niet worden gestart." #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "Albumhoes van het momenteel spelende nummer" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "De map %1 is niet geldig" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "De afspeellijst '%1' was leeg, of kon niet worden geladen." #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "De site die u aanvroeg is geen afbeelding!" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "Er zijn andere nummers in dit album" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "Er is een fout opgetreden tijdens het communiceren met gpodder.net" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Er is een probleem opgetreden bij het ophalen van de metadata van Magnatune" #: podcasts/itunessearchpage.cpp:76 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:56 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:389 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:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 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:187 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:174 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:151 msgid "Third level" msgstr "Derde niveau" #: internet/jamendoservice.cpp:171 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/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "Dit album is niet in het gevraagde formaat beschikbaar" #: ../bin/src/ui_deviceproperties.h:381 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:375 msgid "This device supports the following file formats:" msgstr "Dit apparaat ondsteunt de volgende bestandsformaten:" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Dit apparaat zal niet correct werken" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "Deze stream is alleen voor betalende abonnees" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "Dit type apparaat wordt niet ondersteund: %1" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "Time-out" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Titel" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "Om Grooveshark radio te starten moet je eerst naar andere Grooveshark nummers luisteren" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "Vandaag" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "Mooi infoschermvenster aan/uit" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Volledig scherm aan/uit" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "Wachtrijstatus aan/uit" #: ../bin/src/ui_mainwindow.h:718 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:143 msgid "Tomorrow" msgstr "Morgen" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "Te veel doorverwijzingen" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "Top nummers" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "Totaal aantal albums:" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "Totaal aantal verzonden bytes" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "Totaal aantal netwerk-verzoeken" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Nummer" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "Muziek converteren" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "Conversielog" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "Converteren" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Converteren van %1 bestanden m.b.v. %2 threads" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "Conversieopties" #: core/song.cpp:338 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "Turbine" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "Uitzetten" #: devices/giolister.cpp:161 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "URL(s)" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "Zeer snel internet" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Kan %1 niet downloaden (%2)" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Onbekend" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "Onbekend inhoudstype" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Onbekende fout" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "Albumhoes wissen" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "Uitschrijven" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "Komende concerten" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "Grooveshark afspeellijsten bijwerken" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "Vernieuw alle podcasts" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "Aangepaste databasemappen updaten" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "Bibliotheek bijwerken zodra Clementine gestart wordt" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "Vernieuw deze podcast" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "Bezig met bijwerken" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "%1 bijwerken" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "Bijwerken, %1%…" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Bibliotheek wordt bijgewerkt" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "Gebruik" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "Gebruik Albumartiest label indien beschikbaar" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "Gnome-sneltoetsen gebruiken" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "Replay Gain-metadata gebruiken, als deze beschikbaar is" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "Gebruik SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "Wii Remote gebruiken" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "Gebruik een aangepaste kleuren set" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "Een aangepast bericht voor notificaties gebruiken" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "Authenticatie gebruiken" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "Bitrate management engine gebruiken" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "Dynamische modus gebruiken" #: ../bin/src/ui_wiimotesettingspage.h:188 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:139 msgid "Use temporal noise shaping" msgstr "Gebruik tijdelijke ruisvervorming" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "De systeemstandaard gebruiken" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "Gebruik de standaard kleuren set" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "Globale proxy-instellingen gebruiken" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "Volume normalisatie gebruiken" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "Gebruikt" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "Gebruiker %1 heeft geen Grooveshark Anywhere lidmaadschap" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "Gebruikersinterface" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Gebruikersnaam" #: ../bin/src/ui_behavioursettingspage.h:207 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:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "MP3 (variabele bitrate)" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "Variabele bitrate" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "Diverse artiesten" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "Versie %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "Weergave" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "Visualisatiemodus" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "Visualisaties" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "Visualisatie-instellingen" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "Voice activity detection" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "Volume %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "Website" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "Weken" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "Zodra Clementine wordt gestart" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "Als de lijst leeg is..." #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "Probeer eens...." #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "Snel internet" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii Remote %1: geactiveerd" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii Remote %1: verbonden" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii Remote %1: kritieke accuspanning (%2%) " #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii Remote %1: gedeactiveerd" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii Remote %1: verbinding verbroken" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Remote %1: lage accuspanning (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "Windows Media 128K" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "Windows Media 64K" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "Windows Media-audio" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "Zonder albumhoes:" #: library/libraryview.cpp:530 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:2088 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:151 msgid "Write all songs statistics into songs' files" msgstr "Sla alle statistieken op in muziekbestanden" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "Verkeerde gebruikersnaam of wachwoord." #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "Jaar" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "Jaar - Album" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "Jaar" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "Gisteren" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "U staat op het punt de volgende albums te downloaden" #: playlist/playlistlistcontainer.cpp:311 #, 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:177 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:172 msgid "You are not signed in." msgstr "U bent niet ingelogd." #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "U bent ingelogd als %1." #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "U bent ingelogd." #: ../bin/src/ui_groupbydialog.h:123 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/digitallyimportedsettingspage.cpp:46 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/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "U kunt achtergrondgeluiden tegelijk met andere muziek beluisteren." #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "U kunt gratis tracks scrobblen, maar alleen betalende leden kunnen Last.fm-radio vanuit Clementine streamen." #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "U heeft geen Grooveshark Anywhere account." #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "U heeft geen Spotify Premium account." #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "U heeft geen actief abonnement" #: internet/spotifyservice.cpp:170 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/spotifysettingspage.cpp:158 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:87 msgid "You love this track" msgstr "U vindt dit nummer mooi" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "Om de globale sneltoetsen in Clementine te gebruiken moet u Systeemvoorkeuren openen en de \"Toegang voor assisterende apparaten\" aanzetten." #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "Clementine moet herstart worden als u de taal veranderd." #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "U kunt geen Last.fm radiostations beluisteren, omdat u geen abonnement op Last.fm heeft." #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "Uw IP-adres:" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Uw Last.fm inloggegevens zijn onjuist" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "Uw Magnatune inloggegevens zijn onjuist" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "Uw bibliotheek is leeg!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "Uw radiostreams" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "Uw scrobbles: %1" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Uw systeem heeft geen ondersteuning voor OpenGL, visualisaties kunnen niet weergegeven worden." #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "Uw gebruikersnaam of wachtwoord is niet correct." #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Nul" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "%n nummers toevoegen" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "na" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "geleden" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "en" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "automatisch" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "ervoor" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "tussen" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "grootste eerst" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "bevat" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "uitgeschakeld" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "schijf %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "bevat niet" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "eindigt op" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "is gelijk aan" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "gpodder.net" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "gpodder.net map" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "is groter dan" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "in de laatste" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "minder dan" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "langste eerst" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "Verplaats %n nummers" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "nieuwste eerst" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "niet gelijk" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "niet in de laatste" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "niet op" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "oudste eerst" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "aan" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "opties" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "druk op enter" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "%n nummers verwijderen" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "kortste eerst" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "nummers schudden" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "kleinste eerst" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "nummers sorteren" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "begint met" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "stoppen" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "nummer %1" clementine-1.2.0+dfsg/src/translations/oc.po000066400000000000000000003644211223327513400210410ustar00rootroot00000000000000# 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" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:08+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Occitan (post 1500) (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " mseg" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " segondas" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "" #: podcasts/gpoddersync.cpp:79 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "" #: playlist/playlistmanager.cpp:413 #, qt-format msgid "%1 selected of" msgstr "" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, qt-format msgid "%L1 other listeners" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "" #: transcoder/transcodedialog.cpp:192 #, c-format msgid "%n remaining" msgstr "" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "&Custom" msgstr "&Personalizat" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "&Ajuda" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "Amagar « %1 »" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "Amagar..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "Musica" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Pas cap" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "Lista de lectura" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Quitar" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "Lectura en bocla" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "Mòde aleatòri" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "Aisinas" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "" #: core/utilities.cpp:108 msgid "1 day" msgstr "" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "" #: library/library.cpp:60 msgid "50 random tracks" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "" #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:78 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:153 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "A-Z" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "A prepaus de « %1 »" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "A prepaus de Clementine..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Apondre un flux" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "" #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "" #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Seleccionar un fichièr vidèo..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Apondre un dorsièr" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "" #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Apondre un flux..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Apondre a la lista de lecturas" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Apondre..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "" #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "" #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Totes los albums" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "Totes los fichièrs (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "" #: ui/about.cpp:74 msgid "All the translators" msgstr "" #: library/library.cpp:84 msgid "All tracks" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "" #: internet/spotifyblobdownloader.cpp:60 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:61 msgid "An error occurred loading the iTunes database" msgstr "" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:78 msgid "And:" msgstr "" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Artista" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "L'autentificacion a fracassat" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "" #: ui/about.cpp:65 msgid "Authors" msgstr "Autors" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Color del rèire plan" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "" #: core/database.cpp:734 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Bandir" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "Espectrograma de barras" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Blau estandard" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Compòrtament" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Debit binari" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "" #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "" #: core/song.cpp:339 msgid "CDDA" msgstr "" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "" #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "" #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "" #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Causir automaticament" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "" #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "" #: ui/equalizer.cpp:115 msgid "Classical" msgstr "Classic" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Voidar la lista de lectura" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Irange Clementina" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: internet/lastfmsettingspage.cpp:110 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 "" #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "" #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:116 msgid "Club" msgstr "Club" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Comentari" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "" #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Compositor" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "" #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "" #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "" #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Configurar los acorchis de clavièr" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "" #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "" #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "" #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "" #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:64 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: transcoder/transcoder.cpp:432 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Gestionari de pochetas" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Personalizat..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Dance" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Data de modificacion" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "Per d&efaut" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Reduire lo volum" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "" #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "Escafar un prereglatge" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Destinacion" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Detalhs..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "" #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Dorsièr" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Desactivat" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Disc" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "" #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "" #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "" #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "" #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "" #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "" #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:63 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "Fondut" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Nom del fichièr" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Talha del fichièr" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Tipe de fichièr" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Nom del fichièr" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Fichièrs" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "Primièr nivèl" #: core/song.cpp:328 msgid "Flac" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Formulari" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Amics" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Full Bass" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "Full Treble" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "Motor àudio GStreamer" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Paramètres generals" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Genre" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:43 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Augmentar lo volum" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "" #: core/database.cpp:673 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Sus Internet" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "Clau API pas valabla" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Format incorrècte" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "Paramètres invalids" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "Clau de sesilha invalida" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Large Hall" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "" #: internet/lastfmservice.cpp:437 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:154 msgid "Last.fm password" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Longor" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Bibliotèca" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "" #: ui/equalizer.cpp:123 msgid "Live" msgstr "Live" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Cargar" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "" #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "" #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Cargament de la ràdio Last.fm" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "Cargament del flux" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "" #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "M'agrada fòrça" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "" #: library/library.cpp:74 msgid "Most played" msgstr "" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Discotèca" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "Mut" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Nom" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "Vesins" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "" #: library/library.cpp:67 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:80 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Pista seguenta" #: core/utilities.cpp:147 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "Desactivar l'espectrograma" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:366 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "Pas cap" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "Notificacions" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Notificacions" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "" #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "" #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Dobrir..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "L'operacion a fracassat" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "" #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "" #: core/organise.cpp:65 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Autras opcions" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "Opcions de creacion" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:124 msgid "Party" msgstr "Fèsta" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Pausa" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "Metre en pausa la lectura" #: widgets/osd.cpp:156 msgid "Paused" msgstr "En pausa" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Lectura" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "" #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "" #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "Lectura / pausa" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Sortida" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Opcions del lector" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "Lista de lectura" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "Lista de lectura acabada" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Pop" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "Pre-amp" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "Prereglatge :" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "Pista precedenta" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "Progression" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Reggae" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Suprimir" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Repetir" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "Repetir la lista de lectura" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" 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:206 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "" #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "Enregistrar un prereglatge" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "" #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Acorchi" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Afichar" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:460 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "" #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "" #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "Afichar l'icòna dins la bóstia de miniaturas" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Lectura aleatòria" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "Sonograma" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 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 "" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "" #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Arrestar" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Arrestar la lectura" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "Arrestat" #: core/song.cpp:341 msgid "Stream" msgstr "Flux" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Etiqueta" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "Etiquetar la ràdio" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Mercés a" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "" #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:56 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:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:174 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:151 msgid "Third level" msgstr "" #: internet/jamendoservice.cpp:171 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Títol" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Pista" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "" #: core/song.cpp:338 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "" #: devices/giolister.cpp:161 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "URL(s)" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Desconegut" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Error desconeguda" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "Utilizacion" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "Version %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "Afichatge" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "Volum %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "Quand Clementine avia" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "Annada" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "Annada - Album" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "" #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "" #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "" #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Zèro" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "CD %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "opcions" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "pista %1" clementine-1.2.0+dfsg/src/translations/pa.po000066400000000000000000003605321223327513400210370ustar00rootroot00000000000000# 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" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:07+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Panjabi (Punjabi) (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr "" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "" #: podcasts/gpoddersync.cpp:79 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "" #: playlist/playlistmanager.cpp:413 #, qt-format msgid "%1 selected of" msgstr "" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, qt-format msgid "%L1 other listeners" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "" #: transcoder/transcodedialog.cpp:192 #, c-format msgid "%n remaining" msgstr "" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "&Custom" msgstr "" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "" #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "" #: core/utilities.cpp:108 msgid "1 day" msgstr "" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "" #: library/library.cpp:60 msgid "50 random tracks" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "" #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:78 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:153 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "A-Z" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "" #: core/song.cpp:336 msgid "AIFF" msgstr "" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "" #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "" #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "" #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "" #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "" #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "" #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "" #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "" #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "" #: ui/about.cpp:74 msgid "All the translators" msgstr "" #: library/library.cpp:84 msgid "All tracks" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "" #: internet/spotifyblobdownloader.cpp:60 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:61 msgid "An error occurred loading the iTunes database" msgstr "" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:78 msgid "And:" msgstr "" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "" #: ui/about.cpp:65 msgid "Authors" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "" #: core/database.cpp:734 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "" #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "" #: core/song.cpp:339 msgid "CDDA" msgstr "" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "" #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "" #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "" #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "" #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "" #: ui/equalizer.cpp:115 msgid "Classical" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: internet/lastfmsettingspage.cpp:110 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 "" #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "" #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:116 msgid "Club" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "" #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "" #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "" #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "" #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "" #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "" #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "" #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "" #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:64 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: transcoder/transcoder.cpp:432 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "" #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "" #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "" #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "" #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "" #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "" #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "" #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "" #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "" #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "" #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:63 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "" #: core/song.cpp:328 msgid "Flac" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:43 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "" #: core/database.cpp:673 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "" #: internet/lastfmservice.cpp:437 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:154 msgid "Last.fm password" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "" #: ui/equalizer.cpp:123 msgid "Live" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "" #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "" #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "" #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "" #: core/song.cpp:330 msgid "MPC" msgstr "" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "" #: library/library.cpp:74 msgid "Most played" msgstr "" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "" #: library/library.cpp:67 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:80 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "" #: core/utilities.cpp:147 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:366 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "" #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "" #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "" #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "" #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "" #: core/organise.cpp:65 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:124 msgid "Party" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "" #: widgets/osd.cpp:156 msgid "Paused" msgstr "" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "" #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "" #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" 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:206 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "" #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "" #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:460 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "" #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "" #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 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 "" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "" #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "" #: core/song.cpp:341 msgid "Stream" msgstr "" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "" #: ui/about.cpp:70 msgid "Thanks to" msgstr "" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "" #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:56 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:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:174 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:151 msgid "Third level" msgstr "" #: internet/jamendoservice.cpp:171 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "" #: core/song.cpp:338 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "" #: devices/giolister.cpp:161 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "" #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "" #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "" #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "ਰੋਕੋ" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "" clementine-1.2.0+dfsg/src/translations/pl.po000066400000000000000000004671601223327513400210570ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Bartosz Dotryw , 2013 # Kacper . , 2012-2013 # Kacper . , 2012 # Michał G , 2011 # Michał Ziąbkowski , 2010 # Patryk Wychowaniec , 2011 # Patryk Wychowaniec <>, 2012 # predek , 2013 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-22 12:02+0000\n" "Last-Translator: predek \n" "Language-Team: Polish (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr " dni" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " kb/s" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " pkt" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " sekundy" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " utwory" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 albumów" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 dni" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 dni temu" #: podcasts/gpoddersync.cpp:79 #, 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:413 #, qt-format msgid "%1 selected of" msgstr "%1 zaznaczonych z" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 utwór" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 utwory" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "znaleziono %1 utworów" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "znaleziono %1 utworów (pokazywane %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 ścieżek" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 przesłanych" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: moduł Wiimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n nieudane" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n zakończone" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "&Własny" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "Dodatki" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "Pomoc" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "Ukryj %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "Ukryj..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "Do &lewej" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "Muzyka" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Brak" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "Lista odtwarzania" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Zakończ" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "Tryb powtarzania" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "Do p&rawej" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "Tryb losowy" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "&Rozciągaj kolumny, aby dopasować do okna" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "Narzędzia" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(w zależności od utworu)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "...i wszystkich osób mających wkład w rozwój Amaroka" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "0px" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 dzień" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 ścieżka" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "127.0.0.1" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "40%" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 losowych ścieżek" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "Ulepsz do konta premium" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "Stwórz nowe konto lub zresetuj swoje hasło" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "Potrzebne jest konto Grooveshark Anywhere." #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "Musisz posiadać konto Spotify Premium." #: ../bin/src/ui_networkremotesettingspage.h:189 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:78 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:153 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:297 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "CHWAŁA TOBIE HYPNOROPUCHO" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "Przerwij" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "O programie %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "O Clementine..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "O Qt..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Szczegóły konta" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "Detale konta (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Akcja" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Aktywuj/deaktywuj Wiiremote'a" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "Dodaj podcast" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Dodaj URL" #: ../bin/src/ui_notificationssettingspage.h:425 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:193 msgid "Add action" msgstr "Dodaj akcję" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Dodaj następny strumień..." #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Dodaj katalog..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "Dodaj plik" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "Dodaj plik do transkodera" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "Dodaj plik(i) do transkodera" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Dodaj plik..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Dodaj pliki to transkodowania" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Dodaj katalog" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Dodaj katalog..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Dodaj nowy katalog..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "Dodaj podcast" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "Dodaj podcast..." #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Dodaj kryterium wyszukiwania" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "Dodaj tag albumu" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "Dodaj tag wykonawcy albumu" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "Dodaj tag wykonawcy" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "Dodaj automatyczny wynik piosenki" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "Dodaj tag kompozytora" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "Dodaj tag numeru płyty" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "Dodaj nazwę pliku utworu" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "Dodaj tag rodzaju muzyki" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "Dodaj tag grupowania" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "Dodaj tag długości utworu" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "Dodaj tag wykonawcy" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "Dodaj ilość odtworzeń utworu" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "Dodaj ocenę piosenki" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "Dodaj licznik pominięć" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "Dodaj tag tytułu" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "Dodaj tag numeru utworu" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "Dodaj tag roku" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Dodaj strumień..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "Dodaj do ulubionych Grooveshark" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "Dodaj do list odtwarzania w serwisie Grooveshark" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "Dodaj do innej listy odtwarzania" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Dodaj do listy odtwarzania" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "Kolejkuj ścieżkę" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Dodaj akcję wiimotedeva" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Dodaj..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Dodane w tym miesiącu" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Dodane w tym tygodniu" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Dodane w tym roku" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Dodane dzisiaj" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Dodane przez trzy ostatnie miesiące" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "Dodawanie utworu do Mojej Muzyki" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "Dodawanie piosenki do ulubionych" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Zaawansowane grupowanie..." #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "Po następującej ilości dni:" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "Po skopiowaniu..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Według albumów (najlepsza głośność dla wszystkich ścieżek)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Wykonawca albumu" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "Okładka albumu" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Informacje o albumie na jamendo.com..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Albumy z okładkami" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Albumy bez okładek" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Wszystkie pliki (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "Chwała Tobie Hypnoropucho!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Wszystkie albumy" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Wszyscy wykonawcy" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "Wszystkie pliki (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Wszystkie listy odtwarzania (%1)" #: ui/about.cpp:74 msgid "All the translators" msgstr "Tłumacze" #: library/library.cpp:84 msgid "All tracks" msgstr "Wszystkie ścieżki" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "Zezwól klientowi pobrać muzykę z tego komputera" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "Zezwól na pobieranie" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "Pozwól na kodowanie mid/side" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "Wraz z oryginałami" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Zawsze ukrywaj główne okno" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Zawsze wyświetlaj główne okno" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "Odtwarzaj automatycznie" #: internet/spotifyblobdownloader.cpp:60 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:61 msgid "An error occurred loading the iTunes database" msgstr "Wystąpił błąd podczas ładowania bazy danych iTunes" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Wystąpił błąd podczas zapisu metadanych do '%1'" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "Wystąpił niespodziewany błąd" #: ui/about.cpp:78 msgid "And:" msgstr "I:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "Zdenerwowany" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Wygląd" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Dodaj pliki/adresy URL do listy odtwarzania" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "Dołącz do aktualnej listy odtwarzania" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "Dołącz do listy odtwarzania" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "Skompresuj, aby zapobiec przesterowaniu" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Na pewno chcesz usunąć ustawienie \"%1\"?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "Czy jesteś pewien, że chcesz usunąć tę listę odtwarzania?" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "Na pewno wyzerować statystyki tego utworu?" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Wykonawca" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "O artyście" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "Radio wykonawcy" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "Tagi wykonawcy" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "Inicjały wykonawcy" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Format audio" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Błąd uwierzytelniania" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "Autor" #: ui/about.cpp:65 msgid "Authors" msgstr "Autorzy" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Automatycznie" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Automatyczna aktualizacja" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "Automatycznie rozwiń pojedyncze kategorie w drzewie biblioteki" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "Dostępny" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "Średnia szybkość transmisji" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "Przeciętny rozmiar grafiki" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "Podcasty BBC" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "Uderzenia na minutę" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "Strumienie tła" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Kolor tła" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "Obrazek tła" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Nieprzezroczystość tła" #: core/database.cpp:734 msgid "Backing up database" msgstr "Tworzenie kopii zapasowej bazy danych" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "Balans" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Ignoruj" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "Analizator słupkowy" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Prosty niebieski" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "Podstawowy typ audio" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Tryb" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "Najlepsza" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "Biografia z %1" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Bitrate" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "Bitrate" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "Analizator blokowy" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "Typ bloku" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "Ilość rozmycia" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "Treść" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "Analizator słupkowy 2" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Przeglądaj..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "Długość bufora" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "Buforowanie" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "Lecz ominie poniższe źródła:" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Przyciski" #: core/song.cpp:339 msgid "CDDA" msgstr "CD-Audio" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "obsługa arkuszy CUE" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "Anuluj" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Zmień okładkę" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Zmień wielkość czcionki..." #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "Zmień tryb powtarzania utworów" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Zmień skrót..." #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "Zmień tryb losowania utworów" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Zmień język" #: ../bin/src/ui_playbacksettingspage.h:330 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:228 msgid "Check for new episodes" msgstr "Sprawdzaj, czy są nowe audycje" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Sprawdź aktualizacje..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "Wprowadź nazwę dla inteligentnej listy odtwarzania" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Wybierz automatycznie" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Wybierz kolor..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "Wybierz czcionkę..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Wybierz z listy" #: smartplaylists/querywizardplugin.cpp:155 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ć" #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "Wybierz folder pobierania dla podcastów" #: ../bin/src/ui_songinfosettingspage.h:188 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:115 msgid "Classical" msgstr "Muzyka klasyczna" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "Czyszczenie" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Wyczyść" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Wyczyść listę odtwarzania" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Błąd Clementine" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Pomarańczowy Clementine" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Wizualizacja Clementine" #: ../bin/src/ui_deviceproperties.h:376 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_boxsettingspage.h:104 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:104 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:104 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_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "Clementine może odtwarzać muzykę z Ubuntu One" #: ../bin/src/ui_notificationssettingspage.h:431 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:250 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:128 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." #: internet/lastfmsettingspage.cpp:110 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 "Nie udało się pobrać Twojego statusu subskrybenta z powodu problemów z połączeniem. Odtwarzane utwory zostaną zapamiętane i przesłane do last.fm w dogodnej chwili." #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Przeglądarka obrazów Clementine" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "Clementine nie znalazł wyników dla tego pliku" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "Clementine wyszuka muzykę w następujących miejscach:" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Kliknij, aby dodać jakąś muzykę" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "Przełącz pomiędzy czasem odtwarzania a czasem pozostałym" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "Zamknij listę odtwarzania" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "Zamknij wizualizację" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "Zamknięcie tego okna anuluje pobieranie." #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "Zamknięcie tego okna spowoduje zatrzymanie wyszukiwania okładek albumu." #: ui/equalizer.cpp:116 msgid "Club" msgstr "Klubowa" #: ../bin/src/ui_appearancesettingspage.h:272 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:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Komentarz" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "Automatycznie uzupełnij znaczniki" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "Automatycznie uzupełnij znaczniki..." #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Kompozytor" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "Konfiguruj %1..." #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "Skonfiguruj Grooveshark..." #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Konfiguruj Last.fm..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "Konfiguracja Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Konfiguracja skrótów klawiszowych" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "Konfiguracja Spotify..." #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "Skonfiguruj Subsonic..." #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "Skonfiguruj globalne wyszukiwanie..." #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "Konfiguruj bibliotekę..." #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "Konfiguruj podcasty..." #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "Konfiguruj..." #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "Podłącz urządzenia Wii Remote używając akcji aktywuj/deaktywuj" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "Podłącz urządzenie" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "Połącz z Spotify" #: internet/subsonicsettingspage.cpp:107 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/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Przekroczono limit czasu, sprawdź URL serwera. Przykład: http://localhost:4040/" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "Konsola" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "Stały bitrate" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "Przekonwertuj całą muzykę" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "Przekonwertuj muzykę, której nie może odtworzyć urządzenie" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "Kopiuj do schowka" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Skopiuj na urządzenie..." #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Skopiuj do biblioteki..." #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "Prawa autorskie" #: internet/subsonicsettingspage.cpp:81 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:64 #, 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" #: transcoder/transcoder.cpp:432 #, 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:426 #, 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/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "Nie można wczytać radia last.fm" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "Nie można otworzyć pliku %1" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Menedżer okładek" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "Okładka z osadzonego obrazu" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Okładka wczytana automatycznie z %1" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "Okładka ręcznie wyłączona" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "Brak okładki" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "Źródło okładki: %1" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "Okładki z %1" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "Utwórz nową listę odtwarzania w serwisie Grooveshark" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "Płynne przejście przy automatycznej zmianie ścieżek" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "Płynne przejście przy ręcznej zmianie ścieżek" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "Własne" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "Własny obrazek:" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "Opcje niestandardowych wiadomości" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "Własne radio" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Własny..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "Ścieżka DBus" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Dance" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Data utworzenia" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Data modyfikacji" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "Dni" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "&Domyślny" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "Zmniejsz głośność o 4%" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "Zmniejsz głośność o procentów" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Zmniejsz głośność" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "Domyślny obrazek tła" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "Domyślne" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "Opóźnienie pomiędzy wizualizacjami" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "Usuń" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "Usuń listę odtwarzania w serwisie Grooveshark" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "Usuń pobrane dane" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Usuń pliki" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Usuń z urządzenia..." #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Usuń z dysku..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "Usuń odtworzone odcinki" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "Usuń ustawienie korektora" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "Usuń inteligentną listę odtwarzania" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "Usuń oryginalne pliki" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Usuwanie plików" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "Usuń ścieżki z kolejki odtwarzania" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "Usuń ścieżkę z kolejki odtwarzania" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Miejsce docelowe" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Szczegóły..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Urządzenie" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Ustawienia urządzenia" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Nazwa urządzenia" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Ustawienia urządzenia..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Urządzenia" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Czy chodziło o" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "Hasło Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "Nazwa użytkownika Digitally Imported" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "Bezpośrednie połączenie z Internetem" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Katalog" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "Wyłącz czas" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "Wyłącz generowanie pasków humoru" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Wyłączone" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Płyta" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "DTX" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 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:715 msgid "Do a full library rescan" msgstr "Przeskanuj całą bibliotekę od nowa" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "Nie konwertuj" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "Nie nadpisuj" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Nie powtarzaj" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "Nie pokazuj w różni wykonawcy" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "Nie losuj" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "Nie zatrzymuj!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "Wpłać darowiznę" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Kliknij podwójnie, by otworzyć" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "Podwójne kliknięcie utworu spowoduje..." #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "Ściągnij epizody (%n)" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "Pobierz katalog" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "Pobierz odcinki do" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "Pobierz członkostwo" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "Pobierz nowe odcinki automatycznie" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "Pobieranie w kolejce" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "Pobierz aplikację na Androida" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Pobierz ten album" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Pobierz ten album..." #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "Pobierz ten odcinek" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "Pobierz..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "Pobieranie (%1%)..." #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "Pobieranie katalogu Icecast" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "Pobieranie katalogu Jamendo" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "Pobieranie katalogu Magnatune" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "Pobierz plugin Spotify" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "Pobieranie metadanych" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "Przeciągnij, aby zmienić pozycję" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "Dropbox" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "Tryb dynamiczny włączony" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "Dynamiczny, losowy miks" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "Edytuj inteligentną listę odtwarzania..." #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Edytuj znacznik \"%1\"..." #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "Edytuj znacznik..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "Edytuj znaczniki" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Edytuj informacje o utworze" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "Edytuj informacje o utworze..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Edytuj informacje o utworach..." #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Edytuj..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "Włącz obsługę urządzeń Wii Remote" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "Włącz korektor dźwięku" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "Włącz skróty tylko, gdy Clementine jest aktywny" #: ../bin/src/ui_globalsearchsettingspage.h:147 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:62 msgid "Enable/disable Last.fm scrobbling" msgstr "Włącz/Wyłącz przesyłanie do Last.fm" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "Złożoność kodowania" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "Jakość silnika kodowania" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "Tryb kodowania" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "Wpisz URL" #: ../bin/src/ui_coverfromurldialog.h:103 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:205 msgid "Enter a filename for exported covers (no extension):" msgstr "Wpisz nazwę dla eksportowanych okładek (bez rozszerzenia):" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "Wpisz nową nazwę dla listy odtwarzania" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Wpisz wykonawcę lub znacznik, aby słuchać radia Last.fm." #: ../bin/src/ui_globalsearchview.h:209 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:77 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:77 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:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "Wpisz szukane wyrażenie" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "Dodaj URL radia internetowego:" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "Wprowadź nazwę folderu" #: ../bin/src/ui_networkremotesettingspage.h:198 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:87 msgid "Entire collection" msgstr "Cała kolekcja" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Błąd" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Błąd podczas łączenia z urządzeniem MTP" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "Błąd przy kopiowaniu utworów" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "Błąd przy usuwaniu utworów" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "Plugin Spotify - nieudane pobieranie" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "Błąd wczytywania %1" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Problem podczas ładowania listy odtwarzania di.fm" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "Błąd przetwarzania %1: %2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "Błąd przy wczytywaniu audio CD" #: library/library.cpp:63 msgid "Ever played" msgstr "Odtwarzane choć raz" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "Co 10 minut" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "Co 12 godzin" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "Co 2 godziny" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "Co 20 minut" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "Co 30 minut" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "Co 6 godzin" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "Co godzinę" #: ../bin/src/ui_playbacksettingspage.h:303 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:208 msgid "Existing covers" msgstr "Istniejące okładki" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "Rozwiń" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "Wygasa %1" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "Eksportuj okładki" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "Eksportuj okładki" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "Eksportuj pobrane okładki" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "Eksportuj osadzone okładki" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "Eksportowanie zakończone" #: ui/albumcovermanager.cpp:786 #, 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:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 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:300 msgid "Fade out when stopping a track" msgstr "Przyciszaj ścieżkę, gdy jest zatrzymywana" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "Przejście" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "Czas przejścia" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "Nie udało się pobrać katalogu" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "Nie udało się pobrać podcastów" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "Nie udało się załadować podcastów" #: podcasts/podcasturlloader.cpp:167 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:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "Szybki" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "Ulubione" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "Ulubione ścieżki" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "Pobierz brakujące okładki" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "Pobierz automatycznie" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "Pobieranie ukończone" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "Pobieranie bibliotek Subsonic" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Błąd podczas pobierania okładki" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "Rozszerzenie pliku" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "Formaty pliku" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Nazwa pliku" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "Nazwa pliku (bez ścieżki)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Wielkość pliku" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Typ pliku" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Nazwa pliku" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Pliki" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "Pliki do transkodowania" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "Znajdź ścieżki w swojej bibliotece, które odpowiadają podanym kryteriom." #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "Tworzenie sygnatury utworu" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "Koniec" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "Pierwszy poziom" #: core/song.cpp:328 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Rozmiar czcionki" #: ../bin/src/ui_spotifysettingspage.h:213 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:204 msgid "Force mono encoding" msgstr "Wymuś kodowanie mono" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "Zapomnij o urządzeniu" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Forma" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "Format" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Klatki na sekundę" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "Klatek na bufor" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Przyjaciele" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "Zamrożony" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Pełny bas" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "Pełny bas + soprany" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "Pełne soprany" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "Silnik dźwiękowy GStreamer" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "Ogólne" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Podstawowe ustawienia" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Gatunek" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "URL do udostępnienia tej playlisty z serwisu Grooveshark" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "URL do udostępnienia tej piosenki z serwisu Grooveshark" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "Pobieranie popularnych piosenek z serwisu Grooveshark" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "Pobieranie kanałów" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "Otrzymywanie strumieni" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "Nadaj nazwę:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "Idź" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "Przejdź do kolejnej karty z listą odtwarzania" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "Przejdź do poprzedniej karty z listą odtwarzania" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "Dysk Google" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, 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:206 msgid "Grey out non existent songs in my playlists" msgstr "Usunięte utwory zostaną wyszarzone w listach odtwarzania" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "Błąd logowania do Grooveshark" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "URL playlisty w serwisie Grooveshark" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "Radio Grooveshark" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "URL piosenki w serwisie Grooveshark" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "Grupuj bibliotekę według..." #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "Grupuj według" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "Grupuj według Album" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "Grupuj według Artysta" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "Grupuj według Artysta/Album" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "Grupuj według Artysta/Rok - Album" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "Grupuj według Gatunek/Artysta" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "Grupuj według Gatunek/Artysta/Album" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "Grupowanie" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "Strona HTML nie zawiera żadnego kanału RSS" #: internet/subsonicsettingspage.cpp:135 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:163 msgid "HTTP proxy" msgstr "Pośrednik HTTP (proxy)" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "Szczęśliwy" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "Informacja o urządzeniu" #: ../bin/src/ui_deviceproperties.h:372 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:202 msgid "High" msgstr "Wysoki" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "Dużo (%1 fps)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "Wysoka (1024x1024)" #: internet/subsonicsettingspage.cpp:112 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:310 msgid "Hours" msgstr "Godzin" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "Hypnoropucha" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "Nie posiadam konta w Magnatune" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Ikona" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "Ikony na górze" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "Identyfikowanie utworu" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 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:77 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:204 msgid "Ignore \"The\" in artist names" msgstr "Ignoruj \"The\" w nazwach artystów" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Obrazy (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "W ciągu następnych %1 dni" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "W ciągu następnych %1 tygodni" #: ../bin/src/ui_wizardfinishpage.h:86 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/spotifyservice.cpp:360 msgid "Inbox" msgstr "Skrzynka odbiorcza" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "Dołącz okładkę albumu" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "Dołączaj wszystkie utwory" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Niekompatybilna wersja protokołu Subsonic REST. Klient musi zostać zaktualizowany." #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Niekompatybilna wersja protokołu Subsonic REST. Serwer musi zostać zaktualizowany." #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Niekompletna konfiguracja, upewnij się, że wszystkie pola zostały wypełnione." #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "Zwiększ głośność o 4%" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "Zwiększ głośność o procentów" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Zwiększ głośność" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "Indeksowanie %1" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "Informacja" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "Wstaw..." #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Zainstalowano" #: core/database.cpp:673 msgid "Integrity check" msgstr "Sprawdzanie integralności" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "Usługi internetowe" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "Zły klucz API" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Błędny format" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "Błędna metoda" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "Błędne parametry" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "Nieprawidłowe określenie zasobów" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "Błędna usługa" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "Zły klucz sesji" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "Zła nazwa użytkownika i/lub hasło" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "Najczęściej odsłuchiwane ścieżki na Jamendo" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "Najlepsze ścieżki na Jamendo" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "Najlepsze ścieżki tego miesiąca na Jamendo" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "Najlepsze ścieżki tego tygodnia na Jamendo" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "Baza danych Jamendo" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "Przeskocz do aktualnie odtwarzanej ścieżki" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Przytrzymaj klawisze przez %1 sekundę..." #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Przytrzymaj klawisze przez %1 sekundy..." #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "Pozostań w tle po zamknięciu okna" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "Zachowaj oryginalne pliki" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "Kotki" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Język" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "Laptop/Słuchawki" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Duża hala" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "Duża okładka albumu" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "Duży pasek boczny" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "Ostatnio odtwarzane" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "Własne radio Last.fm: %1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Biblioteka Last.fm - %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "Radio miksów Last.fm - %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Radio sąsiadów na Last.fm - %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Stacja radiowa Last.fm - %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Podobni do %1 artyści z Last.fm" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Radio znacznika Last.fm: %1" #: internet/lastfmservice.cpp:437 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:154 msgid "Last.fm password" msgstr "Hasło Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "Last.fm - ilość odtworzeń" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Tagi Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Użytkownik Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Wiki Last.fm" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "Najmniej lubiane ścieżki" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "Pozostaw puste, by użyć wartości domyślnej. Przykłady: \"/dev/dsp\", \"front\" itd." #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "Lewy" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Długość" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Biblioteka" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "Zaawansowanie grupowanie biblioteki" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "Konieczność odświeżenia biblioteki" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "Poszukiwania biblioteki" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Limity" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "Słuchaj piosenek w serwisie Grooveshark wybieranych na podstawie wcześniejszych odsłuchań" #: ui/equalizer.cpp:123 msgid "Live" msgstr "Na żywo" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Wczytaj" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "Wczytaj okładkę z adresu URL" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "Wczytaj okładkę z adresu URL..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "Wczytaj okładkę z dysku" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "Wczytaj okładkę z dysku..." #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "Wczytaj listę odtwarzania" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "Wczytaj listę odtwarzania..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Wczytywanie radia Last.fm" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Wczytywanie urządzenia MTP" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "Wczytywanie bazy danych iPoda" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "Wczytywanie inteligentnej listy odtwarzania" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "Wczytywanie utworów" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "Wczytywanie strumienia" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "Wczytywanie ścieżek" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "Wczytywanie informacji o utworze" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "Wczytywanie..." #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "Wczytuje pliki/adresy URL, zastępując obecną listę odtwarzania" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Zaloguj się" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "Logowanie nieudane" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "Profil przewidywania długoterminowego (LTP)" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "Dodaj do ulubionych" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Mało (%1 fps)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "Niska (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "Profil niskiej złożoności (LC)" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "Teksty utworów" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "Tekst z %1" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Pobierz z Magnatune" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Pobieranie z Magnatune zakończone" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "Profil główny (MAIN)" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "Zrób tak!" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "Uczyń playlistę dostępną offline" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "Nieprawidłowa odpowiedź" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "Ręczna konfiguracja pośrednika (proxy)" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "Ręcznie" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "Wytwórca" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "Oznacz jako przesłuchany" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "Oznacz jako nowy" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "Porównaj wszystkie warunki (AND/I)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "Porównaj jeden lub więcej warunków (OR/LUB)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "Maksymalny bitrate" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "Umiarkowanie (%1 fps)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "Średnia (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "Typ członkostwa" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "Minimalny bitrate" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "Brak ustawień projectM" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "Model" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "Monitoruj zmiany biblioteki" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "Odtwarzanie mono" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "Miesięcy" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "Humor" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "Styl paska humoru" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "Paski humoru" #: library/library.cpp:74 msgid "Most played" msgstr "Najczęściej odtwarzane" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "Punkt montowania" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "Punkty montowania" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "Przesuń w dół" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "Przenieś do biblioteki..." #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "Przesuń w górę" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "Muzyka" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Biblioteka muzyki" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "Wycisz" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "Moja biblioteka Last.fm" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "Mój radio mix Last.fm" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "Moja okolica Last.Fm" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "Moje rekomendowane radio Last.fm" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "Moje radio miksów" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "Moja Muzyka" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "Moje sąsiedztwo" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "Moje stacje radiowe" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "Moje rekomendacje" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Nazwa" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "Nazwy opcji" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "Wąskie pasmo (NB)" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "Sąsiedzi" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "Sieć" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "Pośrednik sieciowy (proxy)" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "Zdalne sterowanie przez sieć" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "Nigdy" #: library/library.cpp:67 msgid "Never played" msgstr "Jeszcze nie odtwarzane" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "Nie odtwarzaj automatycznie" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "Nowy folder" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "Nowa lista odtwarzania" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "Nowa inteligentna lista odtwarzania..." #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "Nowe utwory" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "Nowe ścieżki będą automatycznie dodane." #: library/library.cpp:80 msgid "Newest tracks" msgstr "Najnowsze ścieżki" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "Dalej" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Następny utwór" #: core/utilities.cpp:147 msgid "Next week" msgstr "W następnym tygodniu" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "Bez analizatora" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "Brak obrazka tła" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "Brak okładek do wyodrębnienia" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "Bez długich bloków" #: playlist/playlistcontainer.cpp:366 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:145 msgid "No short blocks" msgstr "Bez krótkich bloków" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "Brak" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 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:155 msgid "Normal" msgstr "Neutralny" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "Zwykły typ bloku" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "Niedostępne podczas używania inteligentnej listy odtwarzania" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "Nie podłączono" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "Za mało zawartości" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "Za mało fanów" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "Za mało użytkowników" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "Za mało sąsiadów" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Nie zainstalowano" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "Niezalogowany" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "Nie zamontowano - kliknij dwukrotnie, aby zamontować" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "Typ powiadomień" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Powiadomienia" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Teraz odtwarzane" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "Podgląd OSD" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "Krycie" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "Otwórz %1 w przeglądarce" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "Otwórz audio CD" #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "Otwórz plik OPML" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "Otwórz plik OPML..." #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "Otwórz urządzenie" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "Otwórz plik..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "Otwórz w Dysku Google" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "Otwórz w nowej liście odtwarzania" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Otwórz..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "Operacja nieudana" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "Optymalizuj pod względem szybkości transmisji (bitrate)" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "Optymalizuj pod względem jakości" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "Opcje" #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "Uporządkuj pliki" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "Uporządkuj pliki..." #: core/organise.cpp:65 msgid "Organising files" msgstr "Porządkowanie plików" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "Aktualne znaczniki" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Inne opcje" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "Wyjście" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "Urządzenie wyjściowe" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "Opcje wyjścia" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "Wtyczka wyjścia" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "Nadpisz wszystkie" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "Nadpisz istniejące pliki" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "Nadpisz tylko mniejsze" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "Właściciel" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "Parsowanie katalogu Jamendo" #: ui/equalizer.cpp:124 msgid "Party" msgstr "Impreza" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "Hasło" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Pauza" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "Wstrzymaj odtwarzanie" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Zatrzymane" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "Wykonawca" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "Piksel" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "Zwykły pasek boczny" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Odtwarzaj" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "Odtwarzaj Wykonawcę lub Znacznik" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "Odtwarzaj radio wykonawcy..." #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "Ilość odtworzeń" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "Odtwarzaj własne radio..." #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "Odtwarzaj, gdy zatrzymane; zatrzymaj, gdy odtwarzane" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "Odtwarzaj jeśli nic nie jest aktualnie odtwarzane" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "Odtwarzaj radio znacznika..." #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "Odtwórz ścieżkę na liście odtwarzania" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "Odtwarzaj/wstrzymaj" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Odtwarzanie" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Opcje odtwarzacza" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "Lista odtwarzania" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "Lista odtwarzania zakończona" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "Opcje listy odtwarzania" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "Typ listy odtwarzania" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "Listy odtwarzania" #: ../data/oauthsuccess.html:36 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:214 msgid "Plugin status:" msgstr "Stan wtyczki:" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "Podcasty" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Pop" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "Popularne piosenki" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "Popularne w tym miesiącu" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "Popularne dziś" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "Czas powiadomienia" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "Port" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "Wzmocnienie" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "Ustawienia" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "Ustawienia..." #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "Szukaj okładek w plikach zawierających w nazwie (oddziel przecinkami):" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "Preferowany format audio" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "Preferowana jakość" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "Preferowany format" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "Typ audio dla konta premium" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "Ustawienie:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "Ustaw kombinację przycisków dla" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "Naciśnij klawisz" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Naciśnij kombinację klawiszy dla %1" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "Opcje ładnego OSD (menu ekranowego)" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "Podgląd" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "Wstecz" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 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:131 msgid "Profile" msgstr "Profil" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "Postęp" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 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:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "Jakość" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "Odpytywanie urządzenia..." #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "Menedżer kolejki odtwarzania" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "Kolejkuj wybrane ścieżki" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "Kolejkuj ścieżkę" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "Radio (równa głośność dla wszystkich ścieżek)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "Radia" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "Deszcz" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "Losowa wizualizacja" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "Ocena utworu: 0" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "Ocena utworu: 1" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "Ocena utworu: 2" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "Ocena utworu: 3" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "Ocena utworu: 4" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "Ocena utworu: 5" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "Ocena" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "Na pewno anulować?" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "Przekroczono limit przekierowań, sprawdź konfigurację serwera" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "Odśwież" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "Odśwież katalog" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "Odśwież kanały" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "Odśwież listę znajomych" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "Odśwież listę stacji" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "Odśwież strumienie" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Reggae" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "Pamiętaj ruchy pilota" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "Zapamiętaj z ostatniego razu" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Usuń" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "Usuń akcję" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "Usuń duplikaty z playlisty" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "Usuń katalog" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "Usuń z Mojej Muzyki" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "Usuń z ulubionych" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "Usuń z listy odtwarzania" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "Usuń listę odtwrzania" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "Usuń listy odtwarzania" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "Usuwanie utworów z Mojej Muzyki" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "Usuwanie utworów z ulubionych" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "Zmień nazwę listy odtwarzania \"%1\"" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "Zmień nazwę playlisty w serwisie Grooveshark" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "Zmień nazwę listy odtwarzania" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "Zmień nazwę listy odtwarzania..." #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "Ponumeruj utwory według tej kolejności..." #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Powtarzaj" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "Powtarzaj album" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "Powtarzaj listę odtwarzania" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "Powtarzaj utwór" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Zastąp aktualną listę odtwarzania" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "Zastąp listę odtwarzania" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "Zamień spacje na podkreślniki" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "Replay Gain" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "Tryb Replay Gain" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "Stwórz ponownie" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "Wymagaj kodu uwierzytelniającego" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "Resetuj" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" msgstr "Wyzeruj licznik odtworzeń" #: 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:206 msgid "Restrict to ASCII characters" msgstr "Ogranicz do znaków ASCII" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "Wznów odtwarzanie przy uruchamianiu programu" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "Pobieranie Mojej Muzyki z Grooveshark" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "Pobieranie ulubionych piosenek z serwisu Grooveshark" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "Pobieranie list odtwarzania z serwisu Grooveshark" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "Powróć do Clementine" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "Prawy" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "Uruchom" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "Pośrednik (proxy) SOCKS" #: internet/subsonicsettingspage.cpp:122 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:202 msgid "Safely remove device" msgstr "Bezpiecznie usuń urządzenie" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "Bezpiecznie usuń urządzenie po kopiowaniu" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "Próbkowanie" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "Próbkowanie" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "Zapisz pliki .mood w swojej bibliotece" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "Zapisz okładkę albumu" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "Zapisz okładkę na dysk..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "Zapisz obraz" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "Zapisz listę odtwarzania" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "Zapisz listę odtwarzania..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "Zapisz ustawienia korektora" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "Zapisz oceny w tagach kiedy to możliwe" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "Zapisz statystyki w tagach kiedy to możliwe" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "Zapisz ten strumień w zakładce Internet" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "Zapisywanie statystyk do plików" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "Zapisywanie utworów" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "Profil skalowalnego próbkowania (SSR)" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "Wielkość po przeskalowaniu" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "Wynik" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "Wysyłaj informacje o utworach, których słucham" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "Szukaj" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "Przeszukaj stacje Icecast" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "Przeszukaj Jamendo" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Przeszukaj Magnatune" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "Przeszukaj Subsonic" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "Szukaj okładek..." #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "Wpisz dowolną frazę" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "Przeszukaj gpodder.net" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "Przeszukaj iTunes" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "Tryb wyszukiwania" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "Opcje wyszukiwania" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "Wyniki wyszukiwania" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "Kryteria wyszukiwania" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "Wyszukiwanie w serwisie Grooveshark" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "Drugi poziom" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "Przewiń wstecz" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "Przewiń w przód" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "Przesuń obecnie odtwarzaną ścieżkę o względną wartość" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "Przesuń obecnie odtwarzaną ścieżkę do określonej pozycji" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "Zaznacz wszystko" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "Odznacz wszystkie" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "Wybierz kolor tła:" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "Wybierz obrazek tła" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "Wybierz najlepsze dopasowanie" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "Wybierz kolor pierwszoplanowy:" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "Wybierz wizualizacje" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "Wybierz wizualizacje..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "Numer seryjny" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "Adres URL serwera" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "Szczegóły serwera" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "Usługa niedostępna" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Ustaw %1 na \"%2\"..." #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "Ustaw głośność na procent" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "Ustaw wartość dla wszystkich zaznaczonych utworów..." #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "Ustawienia" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Skrót" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "Skrót dla %1" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Skrót dla %1 już istnieje" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Pokaż" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "Pokaż OSD" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "Pokaż animację podświetlenia aktualnie odtwarzanej ścieżki" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "Pokaż pasek humoru na pasku statusu ścieżki" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "Pokaż natywne powiadomienia środowiska graficznego" #: ../bin/src/ui_notificationssettingspage.h:442 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:441 msgid "Show a notification when I change the volume" msgstr "Pokaż powiadomienie, gdy zmieniam głośność" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "Pokaż popup z ikony w tacce systemowej" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "Pokazuj ładne OSD (menu ekranowe)" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "Pokaż ponad paskiem stanu" #: ui/mainwindow.cpp:460 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:209 msgid "Show cover art in library" msgstr "Pokazuj okładki w bibliotece" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "Pokaż separatory" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "Pokaż w pełnej wielkości..." #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "Pokaż w menadżerze plików..." #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "Pokaż w różni wykonawcy" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "Pokaż pasek humoru" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "Pokaż tylko duplikaty" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "Pokaż tylko nieoznaczone" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "Pokazuj sugestie" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "Pokaż przyciski \"Dodaj do ulubionych\" i \"Ignoruj\"" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "Pokaż przycisk scrobblingu w głównym oknie" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "Pokaż ikonkę w tacce systemowej" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "Wyświetl listę włączonych i wyłączonych źródeł" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "Pokaż/Ukryj" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Losuj" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "Losuj albumy" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "Losuj wszystko" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "Wymieszaj listę odtwarzania" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "Losuj utwory w tym albumie" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "Zaloguj" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "Wyloguj" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "Logowanie..." #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "Podobni wykonawcy" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "Wielkość" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "Wielkość:" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "Przeskocz wstecz w liście odtwarzania" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "Ilość przeskoczeń utworu" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "Przeskocz w przód w liście odtwarzania" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "Mała okładka albumu" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "Mały pasek boczny" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "Inteligentna lista odtwarzania" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "Inteligentne listy odtwarzania" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Miękki" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "Informacje o utworze" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "O utworze" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "Sonogram" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "Przepraszamy" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "Sortuj według gatunku (alfabetycznie)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "Sortuj według gatunku (według popularności)" #: ../bin/src/ui_icecastfilterwidget.h:77 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" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "Źródło" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "Źródła" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "Nieudane logowanie do Spotify" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "Wtyczka Spotify" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "Nie zainstalowano pluginu Spotify" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "Standardowy" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "Oznaczone gwiazdką" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "Rozpocznij aktualnie odtwarzaną listę" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "Rozpocznij transkodowanie" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 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:405 #, qt-format msgid "Starting %1" msgstr "Uruchamianie %1" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "Uruchamianie..." #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "Stacje" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Zatrzymaj" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "Zatrzymaj po" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "Zatrzymaj po tym utworze" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Zatrzymaj odtwarzanie" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "Zatrzymaj odtwarzanie po obecnej ścieżce" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "Zatrzymano" #: core/song.cpp:341 msgid "Stream" msgstr "Strumień" #: internet/subsonicsettingspage.cpp:30 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:160 msgid "Streaming membership" msgstr "Strumieniowanie członkostwa" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "Subskrybowane listy odtwarzania" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "Subskrybenci" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "Suckes!" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "Pomyślnie zapisano %1" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "Sugerowane znaczniki" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "Podsumowanie" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "Bardzo dużo (%1 fps)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "Super wysoka (2048x2048)" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "Obsługiwane formaty" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "Zsynchronizuj statystyki z plikami" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "Synchronizowanie skrzynki Spotify" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "Synchronizowanie playlisty Spotify" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "Synchronizowanie utworów oznaczonych gwiazdką na Spotify" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "Kolory systemowe" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "Zakładki na górze" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Znacznik" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "Uzupełnianie znaczników" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "Radio znacznika" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "Docelowy bitrate" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "Opcje tekstu" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Podziękowania dla" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Nie można było uruchomić komendy \"%1\"." #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "Okładka albumu odtwarzanego utworu" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "Katalog %1 jest nieprawidłowy" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "Lista odtwarzania \"%1\" była pusta lub nie można było jej wczytać." #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "Wybrany adres nie jest obrazem!" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "Na tym albumie są inne utwory" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "Wystąpił problem z komunikacją z serwisem gpodder.net" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Wystąpił problem podczas pobierania metadanych z Magnatune" #: podcasts/itunessearchpage.cpp:76 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:56 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:389 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:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 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:187 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:174 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:151 msgid "Third level" msgstr "Trzeci poziom" #: internet/jamendoservice.cpp:171 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/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "Ten album nie jest dostępny w żądanym formacie" #: ../bin/src/ui_deviceproperties.h:381 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:375 msgid "This device supports the following file formats:" msgstr "To urządzenie obsługuje następujące formaty plików:" #: devices/devicemanager.cpp:566 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:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "Strumień wyłącznie dla płacących subskrybentów" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "Ten typ urządzenia nie jest obsługiwany: %1" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "Przekroczony limit czasu" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Nazwa" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "Aby utworzyć radio w serwisie Grooveshark, musisz najpierw przesłuchać kilka piosenek" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "Dzisiaj" #: core/globalshortcuts.cpp:59 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:1369 msgid "Toggle queue status" msgstr "Przełącz stan kolejki" #: ../bin/src/ui_mainwindow.h:718 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:143 msgid "Tomorrow" msgstr "Jutro" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "Zbyt wiele przekierowań" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "Top utworów" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "W sumie albumów:" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "Całkowita ilość przesłanych w bajtach" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "Całkowita ilość zapytań sieciowych" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Utwór" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "Transkoduj muzykę" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "Dziennik transkodera" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "Konwersja" #: transcoder/transcoder.cpp:312 #, 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:54 msgid "Transcoding options" msgstr "Opcje konwersji" #: core/song.cpp:338 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "Turbina" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "Wyłącz" #: devices/giolister.cpp:161 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "URL" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "Hasło Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "Nazwa użytkownika Ubuntu One" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "Bardzo szerokie pasmo (UWB)" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Nie udało się pobrać %1 (%2)" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "nieznany" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "Nieznany content-type" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Nieznany błąd" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "Usuń okładkę" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "Anuluj subskrypcję" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "Nadchodzące koncerty" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "Uaktualnij listę odtwarzania w serwisie Grooveshark" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "Uaktualnij wszystkie podcasty" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "Odśwież zmienione katalogi biblioteki" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "Odświeżaj bibliotekę przy uruchomieniu Clementine" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "Uaktualnij ten podcast" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "Aktualizacja" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Odświeżanie %1" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "Odświeżanie %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Aktualizowanie biblioteki" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "Użycie" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "Używaj tagu \"Wykonawca albumu\" jeżeli jest dostępny" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "Używaj skrótów klawiaturowych Gnome" #: ../bin/src/ui_playbacksettingspage.h:310 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:129 msgid "Use SSLv3" msgstr "Użyj SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "Używaj Wii Remote" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "Użyj własnego zestawu kolorów" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "Użyj niestandardowej wiadomości dla powiadomień" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "Użyj zdalnego sterowania" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "Użyj uwierzytelniania" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "Użyj silnika zarządzania przepływnością" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "Użyj trybu automatycznego" #: ../bin/src/ui_wiimotesettingspage.h:188 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:139 msgid "Use temporal noise shaping" msgstr "Użyj chwilowego kształtowania szumu" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "Użyj domyślnych ustawień systemowych" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "Użyj systemowego zestawu kolorów" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "Użyj systemowych ustawień proxy" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "Używaj wyrównywania głośności" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "Użyto" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "Użytkownik %1 nie posiada konta Grooveshark Anywhere" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "Interfejs użytkownika" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Użytkownik" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "Dodanie utworu z menu kontekstowego powoduje..." #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "Zmienny bitrate" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "Różni wykonawcy" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "Wersja %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "Pokaż" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "Tryb wizualizacji" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "Wizualizacje" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "Ustawienia wizualizacji" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "Wykrywanie aktywności głosowej" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "Głośność %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "Ostrzeż mnie kiedy zamknę zakładkę listy odtwarzania" #: core/song.cpp:337 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "Strona internetowa" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "Tygodni" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "Podczas startu Clementine" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "Jeżeli lista wyników jest pusta..." #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "Czemu by nie spróbować..." #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "Szerokie pasmo (WB)" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii Remote %1: aktywowany" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii Remote %1: połączony" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii Remote %1: krytyczny poziom baterii (%2%) " #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii Remote %1: dezaktywowany" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii Remote %1: rozłączony" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Remote %1: niski poziom baterii (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "Windows Media audio" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "Bez okładek:" #: library/libraryview.cpp:530 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:2088 msgid "Would you like to run a full rescan right now?" msgstr "Czy chcesz teraz rozpocząć odświeżanie biblioteki?" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "Zapisz wszystkie statystyki w plikach muzycznych" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "Zły login lub hasło." #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "Rok" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "Rok - Album" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "Lat" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "Wczoraj" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "Zaraz pobierzesz następujące albumy" #: playlist/playlistlistcontainer.cpp:311 #, 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:177 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:172 msgid "You are not signed in." msgstr "Nie jesteś zalogowany/a." #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "Jesteś zalogowany/a jako %1." #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "Jesteś zalogowany/a" #: ../bin/src/ui_groupbydialog.h:123 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/digitallyimportedsettingspage.cpp:46 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/magnatunesettingspage.cpp:53 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:57 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." #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "Dane o słuchanych utworach można wysyłać za darmo, ale tylko płacący subskrybenci mogą odtwarzać radio Last.fm za pomocą Clementine." #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "Nie masz konta Grooveshark Anywhere." #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Nie masz konta Spotify Premium." #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "Nie posiadasz aktywnej subskrypcji" #: internet/spotifyservice.cpp:170 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/spotifysettingspage.cpp:158 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:87 msgid "You love this track" msgstr "Kochasz tę ścieżkę" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "Musisz włączyć Preferencje systemowe i zaznaczyć \"Włącz dostęp do urządzeń wspomagających\", by używać skrótów globalnych w Clementine." #: ../bin/src/ui_behavioursettingspage.h:200 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." #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "Nie będziesz miał możliwości odtwarzania radia Last.fm ponieważ nie jesteś subskrybentem." #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "Twój adres IP:" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Niepoprawne dane konta last.fm" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "Niepoprawne dane konta Magnatune" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "Biblioteka jest pusta!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "Twoje strumienie radiowe" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "Przesłane utwory: %1" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "W Twoim systemie brakuje wsparcia dla OpenGL, wizualizacje są niedostępne." #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "Nazwa użytkownika lub hasło niepoprawne." #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Zero" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "dodaj %n utworów" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "po" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "temu" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "i" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "automatycznie" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "przed" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "pomiędzy" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "najpierw największe" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "uderzeń na minutę" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "zawiera" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "wyłączony" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "płyta %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "nie zawiera" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "kończy się na" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "jest równy" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "gpodder.net" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "katalog gpodder.net" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "większy niż" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "w ostatnich" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "mniejszy niż" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "najpierw najdłuższe" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "przenieś utwory: %n" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "najpierw najnowsze" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "nie wynosi" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "oprócz ostatnich" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "nie w" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "najpierw najstarsze" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "w dniu" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "opcje" #: ../bin/src/ui_networkremotesettingspage.h:203 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:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "usuń %n utworów" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "najpierw najkrótsze" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "losuj utwory" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "najpierw najmniejsze" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "sortuj utwory" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "zaczyna się na" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "zatrzymaj" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "utwór %1" clementine-1.2.0+dfsg/src/translations/pt.po000066400000000000000000004665741223327513400210770ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # salmora8 , 2013 # arnaudbienner , 2011 # arnaudbienner , 2011 # FIRST AUTHOR , 2010 # salmora8 , 2013 # Sérgio Marques , 2011-2013 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-09-16 09:00+0000\n" "Last-Translator: Sérgio Marques \n" "Language-Team: Portuguese (http://www.transifex.com/projects/p/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:39 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 lista 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 gravadas aqui" #: ../bin/src/ui_podcastsettingspage.h:246 msgid " days" msgstr " dias" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " pt" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " segundos" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " faixas" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 álbuns" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 dias" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 dias atrás" #: podcasts/gpoddersync.cpp:79 #, 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:413 #, qt-format msgid "%1 selected of" msgstr "selecionada(s) %1 de" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 faixa" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 faixas" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 faixas encontradas" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 faixas encontradas (a exibir %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 faixas" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 transferidas" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Módulo Wiimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n falha(s)" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n concluída(s)" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "&Personalizado" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "&Extras" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "&Ajuda" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "&Ocultar %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "&Ocultar..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Esquerda" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "&Música" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Nenhum" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "&Lista de reprodução" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Sair" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "Modo de &repetição" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Direita" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "Modo de des&ordenação" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "Ajustar &colunas à janela" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "&Ferramentas" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(diferente em todas as faixas)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "... e a todos os colaboradores do Amarok" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "0 px." #: core/utilities.cpp:108 msgid "1 day" msgstr "1 dia" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 faixa" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "127.0.0.1" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "40%" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 faixas aleatórias" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "Atualizar para a versão Premium" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "Criar uma conta ou redefinir a senha" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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 avaliações das faixas 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "Requer uma conta Grooveshark Anywhere" #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "Requer uma conta Spotify Premium" #: ../bin/src/ui_networkremotesettingspage.h:189 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:78 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:153 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:297 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "ALL GLORY TO THE HYPNOTOAD" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "Abortar" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "Sobre o %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "Sobre o Clementine..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "Sobre o Qt..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Detalhes da conta" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "Detalhes da conta (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Ação" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Ativar/desativar Wiiremote" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "Adicionar podcast" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Adicionar emissão" #: ../bin/src/ui_notificationssettingspage.h:425 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:193 msgid "Add action" msgstr "Adicionar uma ação" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Adicionar outra emissão..." #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Adicionar diretório..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "Adicionar ficheiro" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "Adicionar ficheiro ao conversor" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "Adicionar ficheiro(s) ao conversor" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Adicionar ficheiro..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Adicionar ficheiros a converter" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Adicionar pasta" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Adicionar pasta..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Adicionar nova pasta..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "Adicionar podcast" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "Adicionar podcast..." #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Adicionar termo de procura" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "Adicionar álbum" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "Adicionar artista do álbum" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "Adicionar artista" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "Adicionar avaliação automaticamente" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "Adicionar compositor" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "Adicionar número do disco" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "Adicionar nome do ficheiro" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "Adicionar género" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "Adicionar grupo" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "Adicionar duração" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "Adicionar intérprete" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "Adicionar número de reproduções" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "Adicionar avaliação" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "Adicionar reproduções ignoradas" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "Adicionar título" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "Adicionar número da faixa" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "Adicionar ano" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Adicionar emissão..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "Adicionar aos favoritos Grooveshark" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "Adicionar às listas de reprodução Grooveshark" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "Adicionar noutra lista de reprodução" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Adicionar à lista de reprodução" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "Adicionar à fila de reprodução" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Adicionar uma ação wiimotedev" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Adicionar..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Adicionadas este mês" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Adicionadas esta semana" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Adicionadas este ano" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Adicionadas hoje" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Adicionadas no espaço de três meses" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "Adicionar faixas às Minhas músicas" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "Adicionar faixa aos favoritos" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Agrupamento avançado..." #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "Após " #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "Depois de copiar..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Álbum" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Álbum (volume ideal para todas as faixas)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Artista do álbum" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "Capa do álbum" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Informações do álbum em jamendo.com..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Álbuns com capas" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Álbuns sem capas" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Todos os ficheiros (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "All Glory to the Hypnotoad!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Todos os álbuns" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Todos os artistas" #: ui/albumcoverchoicecontroller.cpp:47 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:74 msgid "All the translators" msgstr "Todos os tradutores" #: library/library.cpp:84 msgid "All tracks" msgstr "Todas as faixas" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "Permitir que um cliente transfira faixas deste computador." #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "Permitir transferências" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "Permitir codificação mid/side" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "Juntamente aos originais" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Ocultar sempre a janela principal" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Mostrar sempre a janela principal" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "Iniciar sempre a reprodução" #: internet/spotifyblobdownloader.cpp:60 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:61 msgid "An error occurred loading the iTunes database" msgstr "Ocorreu um erro ao carregar a base de dados iTunes" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Ocorreu um erro ao gravar os detalhes em \"%1\"" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "Ocorreu um erro desconhecido." #: ui/about.cpp:78 msgid "And:" msgstr "E:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "Chateado" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Aspeto" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Juntar ficheiros/URLs à lista de reprodução" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "Juntar à lista de reprodução atual" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "Juntar à lista de reprodução" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "Aplicar compressão para impedir a distorção" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Tem a certeza de que quer eliminar \"%1\"?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "Tem a certeza de que quer eliminar esta lista de reprodução?" #: ui/edittagdialog.cpp:769 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:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Artista" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Info do artista" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "Rádio do artista" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "\"Tags\" do artista" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "Iniciais do artista" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Formato áudio" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Falha ao autenticar" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "Autor" #: ui/about.cpp:65 msgid "Authors" msgstr "Autores" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Automático" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Atualização automática" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "Na coleção em árvore, abrir automaticamente as categorias individuais" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "Disponível" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "Taxa de dados média" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "Tamanho médio" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "Podcasts BBC" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "Em segundo plano" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Cor do fundo" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "Imagem de fundo" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Opacidade do fundo" #: core/database.cpp:734 msgid "Backing up database" msgstr "A copiar base de dados" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "Equilíbrio" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Banir" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "Barras" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Azul" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "Serviço básico" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Comportamento" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "Melhor" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "Biografia de %1" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Taxa de dados" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "Taxa de dados" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "Blocos" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "Tipo de bloco" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "Valor" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "Conteúdo" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "Boom" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Procurar..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "Duração da memória" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "A colocar em memória..." #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "Mas estas fontes estão inativas:" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Botões" #: core/song.cpp:339 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "Suporte a ficheiros CUE" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "Cancelar" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Alterar capa do álbum" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Alterar tamanho da letra..." #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "Alterar modo de repetição" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Alterar atalho..." #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "Alterar modo de desordenação" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Alterar o idioma" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "A alteração a esta preferência produzirá efeito nas faixas seguintes" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "Procurar novos episódios" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Procurar atualizações..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "Escolha o nome da lista de reprodução inteligente" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Escolher automaticamente" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Escolha a cor..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "Escolha o tipo de letra..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Escolher da lista" #: smartplaylists/querywizardplugin.cpp:155 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" #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "Escolha o diretório para guardar os podcasts" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Escolha os sítios web em que o Clementine deve procurar as letras das faixas" #: ui/equalizer.cpp:115 msgid "Classical" msgstr "Clássica" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "Eliminação" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Limpar" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Limpar lista de reprodução" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Erro do Clementine" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Laranja" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Visualização Clementine" #: ../bin/src/ui_deviceproperties.h:376 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 que copiou para o dispositivo" #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "O Clementine pode reproduzir as faixas enviadas para o serviço Box" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "O Clementine pode reproduzir as faixas enviadas para o Dropbox" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "O Clementine pode reproduzir as faixas enviadas para o Google Drive" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "O Clementine pode reproduzir as faixas enviadas para o Ubuntu One" #: ../bin/src/ui_notificationssettingspage.h:431 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:250 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:128 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." #: internet/lastfmsettingspage.cpp:110 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 "O Clementine não consegue obter o estado da sua subscrição, pois existem problemas na ligação. As faixas reproduzidas serão colocadas em cache e posteriormente enviadas para a last.fm" #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Visualizador de imagens do Clementine" #: ../bin/src/ui_trackselectiondialog.h:206 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:210 msgid "Clementine will find music in:" msgstr "O Clementine vai procurar as faixas em:" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Clique aqui para adicionar músicas" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "Clique para alternar entre tempo restante e tempo total" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "Fechar lista de reprodução" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "Fechar visualização" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "Se fechar esta janela, irá cancelar a transferência" #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "Se fechar esta janela, irá parar a procura das capas de álbum" #: ui/equalizer.cpp:116 msgid "Club" msgstr "Clube" #: ../bin/src/ui_appearancesettingspage.h:272 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:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Comentário" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "Preencher detalhes automaticamente" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "Preencher detalhes automaticamente..." #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Compositor" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "Configurar %1..." #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "Configurar Grooveshark..." #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Configurar Last.fm..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "Configurar Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Configurar atalhos" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "Configurar Spotify..." #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "Configurar Subsonic..." #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "Configurar a procura global..." #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "Configurar coleção..." #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "Configurar podcasts..." #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "Configurar..." #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "Ligar a Wii Remotes utilizando a ação ativar/desativar" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "Ligar dispositivo" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "Ligar ao Spotify" #: internet/subsonicsettingspage.cpp:107 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/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Ligação expirada. Verifique o URL. Por exemplo: http://localhost:4040/" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "Consola" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "Taxa de dados constante" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "Converter todas as faixas" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "Converter quaisquer faixas não reconhecidas pelo dispositivo" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "Copiar para a área de transferência" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Copiar para o dispositivo..." #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Copiar para a coleção..." #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "Direitos de autor" #: internet/subsonicsettingspage.cpp:81 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:64 #, 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" #: transcoder/transcoder.cpp:432 #, 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:426 #, 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/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "Não foi possível abrir a rádio last.fm" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "Não foi possível abrir o ficheiro %1" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Gestor de capas" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "Capa de álbum a partir de uma imagem" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Capa de álbum existente em %1" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "Capa de álbum desativada manualmente" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "Capa de álbum não definida" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "Capa de álbum em %1" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "Capas de álbum em %1" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "Criar lista de reprodução Grooveshark" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "Sobreposição ao mudar automaticamente de faixas" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "Sobreposição ao mudar manualmente de faixas" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Seta para baixo" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Seta para cima" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "Personalizar" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "Imagem personalizada" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "Definições personalizadas" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "Rádio personalizada" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Personalizar..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "Caminho DBus" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Dança" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Data de criação" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Data de modificação" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "Dias" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "Pa&drão" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "Diminuir volume em 4%" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "Diminuir volume em porcento" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Diminuir volume" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "Imagem de fundo padrão" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "Padrões" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "Atraso entre visualizações" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "Eliminar" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "Eliminar lista de reprodução Grooveshark" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "Eliminar dados transferidos" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Eliminar ficheiros" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Eliminar do dispositivo..." #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Eliminar ficheiros do disco..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "Eliminar episódios reproduzidos" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "Eliminar pré-ajustes" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "Eliminar lista de reprodução inteligente" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "Eliminar ficheiros originais" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "A eliminar ficheiros" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "Retirar da fila as faixas selecionadas" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "Retirar esta faixa da fila" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Destino" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Detalhes..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Dispositivo" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Propriedades do dispositivo" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Nome do dispositivo" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Propriedades do dispositivo..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Dispositivos" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Será que queria dizer" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "Senha Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "Utilizador Digitally Imported" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "Ligação direta à internet" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Diretório" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "Desativar" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "Desativar barra de estado de espírito" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Inativa" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Disco" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "Transmissão intermitente" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 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:715 msgid "Do a full library rescan" msgstr "Reanalisar coleção" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "Não converter quaisquer faixas" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "Não substituir" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Não repetir" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "Não mostrar em vários artistas" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "Não desordenar" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "Não parar!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "Donativos" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Duplo clique para abrir" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "Ao clicar duas vezes numa faixa..." #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "Transferir %n episódios" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "Diretório de transferências" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "Transferir episódios para" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "Transferência" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "Transferir novos episódios automaticamente" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "Transferência colocada na fila" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "Transferir a aplicação Android" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Transferir este álbum" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Transferir este álbum..." #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "Transferir este episódio" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "Transferir..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "A transferir (%1%)..." #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "A transferir o diretório Icecast" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "A transferir o catálogo Jamendo" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "A transferir o catálogo Magnatune" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "A transferir o suplemento Spotify" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "A transferir dados" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "Arraste para posicionar" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "Dropbox" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "O modo dinâmico está ativo" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "Combinação aleatória dinâmica" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "Editar lista de reprodução inteligente..." #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Editar \"%1\"..." #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "Editar \"tag\"..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "Editar detalhes" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Editar informações da faixa" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "Editar informações da faixa..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Editar informações das faixas..." #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Editar..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "Ativar suporte a Wii Remote" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "Ativar equalizador" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "Apenas ativar os atalhos se o Clementine estiver evidenciado" #: ../bin/src/ui_globalsearchsettingspage.h:147 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 procura. Os resultados serão exibidos por esta ordem." #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "Ativar/desativar o envio last.fm" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "Complexidade da codificação" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "Qualidade da codificação" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "Tipo de codificação" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "Introduza o URL" #: ../bin/src/ui_coverfromurldialog.h:103 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:205 msgid "Enter a filename for exported covers (no extension):" msgstr "Introduza o nome das capas exportadas (sem extensão):" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "Introduza o nome para esta lista de reprodução" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Introduza um artista ou \"tag\" para ouvir a rádio last.fm" #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Introduza os termos para procurar as faixas no computador e na Internet" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Introduza os termos de pesquisa para procurar os podcasts no iTunes" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Introduza os termos de procura para os podcasts do gpodder.net" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "Introduza aqui os termos da procura" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "Introduza o URL da rádio na Internet:" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "Introduza o nome da pasta" #: ../bin/src/ui_networkremotesettingspage.h:198 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:87 msgid "Entire collection" msgstr "Toda a coleção" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Erro" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Erro ao ligar ao dispositivo MTP" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "Erro ao copiar faixas" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "Erro ao eliminar faixas" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "Erro ao transferir o suplemento" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "Erro ao carregar %1" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Erro ao carregar a lista de reprodução di.fm" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "Erro ao processar %1: %2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "Erro ao carregar o CD áudio" #: library/library.cpp:63 msgid "Ever played" msgstr "Reproduzida alguma vez" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "A cada 10 minutos" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "A cada 12 horas" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "A cada 2 horas" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "A cada 20 minutos" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "A cada 30 minutos" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "A cada 6 horas" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "Todas as horas" #: ../bin/src/ui_playbacksettingspage.h:303 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:208 msgid "Existing covers" msgstr "Capas existentes " #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "Expandir" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "Termina em %1" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "Exportar capas" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "Exportar capas" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "Exportar capas transferidas" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "Exportar capas incorporadas" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "Exportação terminada" #: ui/albumcovermanager.cpp:786 #, 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:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "Redução/aumento gradual de volume ao pausar/retomar" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "Silêncio progressivo ao parar uma faixa" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "Desvanecimento" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "Duração" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "Erro ao obter o diretório" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "Erro ao obter os podcasts" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "Erro ao carregar o podcast" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "Erro ao processar o XML desta fonte RSS" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "Rápida" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "Favoritos" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "Faixas preferidas" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "Obter capas em falta" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "Obter automaticamente" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "Obtencão concluída" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "A obter a coleção Subsonic" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Erro ao obter a capa do álbum" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "Extensão do ficheiro" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "Formatos de ficheiro" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Nome do ficheiro" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "Nome do ficheiro (sem caminho)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Tamanho do ficheiro" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Tipo de ficheiro" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Nome do ficheiro" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Ficheiros" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "Ficheiros a converter" #: smartplaylists/querywizardplugin.cpp:90 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" #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "A procurar identificadores" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "Terminar" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "Primeiro nível" #: core/song.cpp:328 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Tamanho de letra" #: ../bin/src/ui_spotifysettingspage.h:213 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:204 msgid "Force mono encoding" msgstr "Forçar codificação mono" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "Ignorar dispositivo" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Formulário" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "Formato" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Taxa de imagens" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "Imagens por memória" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Amigos" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "Estático" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Graves" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "Graves e Agudos" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "Agudos" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "Sistema de áudio GStreamer" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "Geral" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Definições gerais" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Género" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "Obter URL para partilhar esta lista de reprodução Grooveshark" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "Obter URL para partilhar esta faixa Grooveshark" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "A obter músicas populares do Grooveshark" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "A obter canais" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "A obter emissões" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "Nome:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "Procurar" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "Ir para o separador seguinte" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "Ir para o separador anterior" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, 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:206 msgid "Grey out non existent songs in my playlists" msgstr "Nas listas de reprodução, escurecer as faixas inexistentes" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "Erro de autenticação no Grooveshark" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "URL da lista de reprodução Grooveshark" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "Rádio Grooveshark" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "URL da faixa Grooveshark" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "Agrupar coleção por..." #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "Agrupar por" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "Agrupar por álbum" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "Agrupar por artista" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "Agrupar por artista/álbum" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "Agrupar por artista/ano - álbum" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "Agrupar por género/álbum" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "Agrupar por género/artista/álbum" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "Grupo" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "A página HTML não possui fontes RSS" #: internet/subsonicsettingspage.cpp:135 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:163 msgid "HTTP proxy" msgstr "Proxy HTTP" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "Contente" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "Informações do equipamento" #: ../bin/src/ui_deviceproperties.h:372 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:202 msgid "High" msgstr "Alta" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "Alta (%1 ips)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "Alta (1024x1024)" #: internet/subsonicsettingspage.cpp:112 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:310 msgid "Hours" msgstr "Horas" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "Não tenho uma conta Magnatune" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Ícone" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "Ícones no topo" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "A identificar faixa" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 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:77 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:204 msgid "Ignore \"The\" in artist names" msgstr "Ignorar \"The\" no nome do artista" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Imagens (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "No espaço de %1 dia(s)" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "No espaço de %1 semana(s)" #: ../bin/src/ui_wizardfinishpage.h:86 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/spotifyservice.cpp:360 msgid "Inbox" msgstr "Caixa de entrada" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "Incluir capa do álbum na notificação" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "Incluir todas as faixas" #: internet/subsonicsettingspage.cpp:90 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/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Versão incompatível do protocolo Subsonic REST. Tem que atualizar o servidor." #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Configuração incompleta. Verifique se todos os campos estão preenchidos." #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "Aumentar volume em 4%" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "Aumentar volume em porcento" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Aumentar volume" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "A indexar %1" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "Informações" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "Inserir..." #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Instalado" #: core/database.cpp:673 msgid "Integrity check" msgstr "Verificação de integridade" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "Serviços na Internet" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "Chave API inválida" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Formato inválido" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "Método inválido" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "Parâmetros inválidos" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "Recurso especificado inválido" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "Serviço inválido" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "Chave de sessão inválida" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "Senha e/ou utilizador inválido" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "As faixas mais ouvidas no Jamendo" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "As melhores faixas do Jamendo" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "As melhores faixas do mês no Jamendo" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "As melhores faixas da semana no Jamendo" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "Base de dados Jamendo" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "Ir para a faixa em reprodução" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Manter botões por %1 segundo..." #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Manter botões por %1 segundos..." #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "Executar em segundo plano ao fechar a janela" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "Manter os ficheiros originais" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "Gatinhos" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Idioma" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "Portátil/Auscultadores" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Sala ampla" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "Capa de álbum grande" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "Barra lateral grande" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "Última reprodução" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "Rádio personalizada last.fm: %1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Coleção last.fm - %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "Rádio combinada last.fm - %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Rádio do vizinho last.fm - %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Estação de rádio last.fm - %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Artistas semelhantes a %1 na last.fm" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "\"Tag\" da rádio last.fm: %1" #: internet/lastfmservice.cpp:437 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:154 msgid "Last.fm password" msgstr "Senha last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "Número de reproduções last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "\"Tags\" last.fm" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Utilizador last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Wiki last.fm" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "Faixas favoritas (mas pouco)" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "Deixar em branco para as predefinições. Exemplos: \"/dev/dsp\", \"front\", etc..." #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "Esquerda" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Duração" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Coleção" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "Agrupamento avançado da coleção" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "Aviso de análise da coleção" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "Procurar na coleção" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Restrições" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "Ouvir músicas Grooveshark com base nas reproduzidas anteriormente" #: ui/equalizer.cpp:123 msgid "Live" msgstr "Ao vivo" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Carregar" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "Carregar capa de álbum do URL" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "Carregar capa de álbum do URL..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "Carregar capa de álbum no disco rígido" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "Carregar capa de álbum no disco..." #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "Carregar lista de reprodução" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "Carregar lista de reprodução..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "A carregar rádio last.fm" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "A carregar dispositivo MTP" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "A carregar base de dados iPod" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "A carregar lista de reprodução inteligente" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "A carregar faixas" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "A carregar emissão" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "A carregar faixas" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "A carregar informação das faixas" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "A carregar..." #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "Carregar ficheiros/URLs, substituindo a lista de reprodução atual" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Iniciar sessão" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "Falha ao iniciar sessão" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "Perfil para predição (LTP)" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "Gosto" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Baixa (%1 ips)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "Baixa (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "Perfil de baixa complexidade (LC)" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "Letras musicais" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "Letras musicais de %1" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Transferência Magnatune" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Transferência Magnatune concluída" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "Perfil principal (MAIN)" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "Make it so!" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "Tornar lista de reprodução disponível localmente" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "Resposta inválida" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "Configuração manual de proxy" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "Manualmente" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "Fabricante" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "Marcar como reproduzido" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "Marcar como novo" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "Coincidir com cada termo de procura (E)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "Coincidir com um ou mais termos de procura (OU)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "Taxa de dados máxima" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "Média (%1 ips)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "Média (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "Tipo de adesão" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "Taxa de dados mínima" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "Pré-ajustes projectM em falta" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "Modelo" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "Monitorizar alterações na coleção" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "Reprodução em mono" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "Meses" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "Estado de espírito" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "Estilo" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "Barras de estado de espírito" #: library/library.cpp:74 msgid "Most played" msgstr "Mais reproduzidas" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "Ponto de montagem" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "Pontos de montagem" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "Mover para baixo" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "Mover para a coleção..." #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "Mover para cima" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "Música" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Coleção de músicas" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "Sem áudio" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "A minha coleção last.fm" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "A minha combinação de rádios last.fm" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "A minha vizinhança last.fm" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "As rádios last.fm recomendadas" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "A minha rádio combinada" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "Minhas músicas" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "A minha vizinhança" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "A minha estação de rádio" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "As minhas recomendações" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Nome" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "Opções de nomeação" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "Banda estreita (NB)" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "Vizinhos" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "Rede" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "Proxy de rede" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "Rede remota" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "Nunca" #: library/library.cpp:67 msgid "Never played" msgstr "Nunca reproduzidas" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "Nunca iniciar a reprodução" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "Nova pasta" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "Nova lista de reprodução" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "Nova lista de reprodução inteligente..." #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "Novas faixas" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "As novas faixas serão adicionadas automaticamente" #: library/library.cpp:80 msgid "Newest tracks" msgstr "Faixas recentes" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "Seguinte" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Faixa seguinte" #: core/utilities.cpp:147 msgid "Next week" msgstr "Na próxima semana" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "Sem analisador" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "Sem imagem de fundo" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "Nenhuma capa para exportar." #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "Sem blocos longos" #: playlist/playlistcontainer.cpp:366 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Sem ocorrências. Limpe a caixa de procura para mostrar toda a lista de reprodução" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "Sem blocos curtos" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "Nenhum" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 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:155 msgid "Normal" msgstr "Normal" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "Bloco normal" #: playlist/playlistsequence.cpp:170 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:107 msgid "Not connected" msgstr "Não ligado" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "Conteúdo insuficiente" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "Fãs insuficientes" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "Membros insuficientes" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "Vizinhos insuficientes" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Não instalado" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "Sessão não iniciada" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "Não montado. Clique duas vezes para montar" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "Tipo de notificação" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Notificações" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "A reproduzir" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "Antevisão da notificação" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "Opacidade" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "Abrir %1 no navegador" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "&Abrir CD áudio" #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "Abrir um ficheiro OPML" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "Abrir um ficheiro OPML..." #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "Abrir dispositivo" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "Abrir ficheiro..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "Abrir no Google Drive" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "Abrir numa nova lista de reprodução" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Abrir..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "Falha na operação" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "Otimizar para taxa de dados" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "Otimizar para qualidade" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "Opções..." #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "Organizar ficheiros" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "Organizar ficheiros..." #: core/organise.cpp:65 msgid "Organising files" msgstr "Organizando ficheiros" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "Detalhes originais" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Outras opções" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "Destino" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "Dispositivo" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "Opções de saída" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "Sistema de som" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "Substituir tudo" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "Substituir ficheiros existentes" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "Substituir apenas as pequenas" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "Proprietário" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "Analisando o catálogo Jamendo" #: ui/equalizer.cpp:124 msgid "Party" msgstr "Festa" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "Senha" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Pausa" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "Pausar a reprodução" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Em pausa" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "Intérprete" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "Pixel" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "Barra lateral simples" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Reproduzir" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "Reproduzir artista ou \"tag\"" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "Reproduzir rádio do artista..." #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "Número de reproduções" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "Reproduzir rádio personalizada..." #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "Reproduzir se parado, pausar se em reprodução" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "Reproduzir, se não existir qualquer faixa em reprodução" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "Reproduzir \"tag\" da rádio..." #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "Reproduzir a .ª faixa na lista de reprodução" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "Reproduzir/Pausar" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Reprodução" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Opções do reprodutor" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "Lista de reprodução" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "Lista de reprodução terminada" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "Opções da lista de reprodução" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "Tipo de lista de reprodução" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "Listas de reprodução" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "Feche o navegador e volte ao Clementine" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "Estado:" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "Podcasts" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Pop" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "Músicas populares" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "Músicas populares do mês" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "Músicas populares de hoje" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "Duração do alerta" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "Porta" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "Amplificador" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "Preferências" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "Preferências..." #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "Nomes preferidos para as capas de álbum (separados por vírgulas)" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "Formato áudio preferido" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "Taxa de dados preferencial" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "Formato preferido" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "Serviço Premium" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "Pré-ajuste:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "Prima a combinação a utilizar para" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "Prima uma tecla" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Prima a combinação a utilizar para %1..." #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "Opções da notificação" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "Antevisão" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "Anterior" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 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:131 msgid "Profile" msgstr "Perfil" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "Evolução" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 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:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "Qualidade" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "A consultar dispositivo..." #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "Gestor da fila" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "Colocar em fila as faixas selecionadas" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "Colocar esta faixa na fila" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "Faixa (volume igual para todas as faixas)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "Rádios" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "Chuva" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "Visualização aleatória" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "Atribuir 0 estrelas à faixa atual" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "Atribuir 1 estrela à faixa atual" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "Atribuir 2 estrelas à faixa atual" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "Atribuir 3 estrelas à faixa atual" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "Atribuir 4 estrelas à faixa atual" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "Atribuir 5 estrelas à faixa atual" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "Avaliação" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "Realmente cancelar?" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "Limite de redirecionamento excedido. verifique a configuração do servidor." #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "Atualizar" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "Atualizar catálogo" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "Atualizar canais" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "Atualizar lista de amigos" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "Atualizar lista de estações" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "Atualizar emissões" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Reggae" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "Lembrar cadência do Wii remote" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "Lembrar última opção" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Remover" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "Remover ação" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "Remover duplicados da lista de reprodução" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "Remover pasta" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "Remover das Minhas músicas" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "Remover dos favoritos" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "Remover da lista de reprodução" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "Remover lista de reprodução" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "Remover listas de reprodução" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "A remover faixas das Minhas músicas" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "A remover faixas dos favoritos" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "Mudar nome da lista de reprodução \"%1\"" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "Mudar nome da lista de reprodução Grooveshark" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "Mudar nome da lista de reprodução" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "Mudar nome da lista de reprodução..." #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "Renumerar as faixas por esta ordem..." #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Repetir" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "Repetir álbum" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "Repetir lista de reprodução" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "Repetir faixa" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Substituir lista de reprodução atual" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "Substituir lista de reprodução" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "Substituir espaços por \"underscores\"" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "Consistência (Replay Gain)" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "Modo Replay Gain" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "Preencher novamente" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "Requer código de autenticação" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "Reiniciar" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" msgstr "Reiniciar número de contagens" #: 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:206 msgid "Restrict to ASCII characters" msgstr "Restringir a caracteres ASCII" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "Retomar reprodução ao iniciar" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "A obter faixas das Minhas músicas Grooveshark" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "A obter músicas favoritas do Grooveshark" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "A obter as listas de reprodução do Grooveshark" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "Voltar ao Clementine" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "Direita" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "Executar" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "Proxy SOCKS" #: internet/subsonicsettingspage.cpp:122 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 poder resolver alguns problemas." #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "Remover dispositivo em segurança" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "Depois de copiar, remover dispositivo em segurança" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "Frequência" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "Frequência" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "Gravar ficheiros .mood na coleção de faixas" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "Gravar capa de álbum" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "Gravar capa de álbum no disco..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "Gravar imagem" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "Gravar lista de reprodução" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "Gravar lista de reprodução..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "Gravar pré-ajustes" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "Se possível, gravar avaliação nos detalhes do ficheiro" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "Se possível, gravar estatísticas nos detalhes do ficheiro" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "Gravar esta emissão no separador Internet" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "Gravar estatísticas nos ficheiros" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "A gravar faixas" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "Perfil de taxa de amostragem ajustável (SSR)" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "Escala" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "Pontuação" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "Enviar as faixas que eu oiço" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "Procurar" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "Procurar estações Icecast" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "Procurar no Jamendo" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Pesquisar no Magnatune" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "Procurar no Subsconic" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "Procurar capas de álbuns..." #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "Procurar algo" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "Procurar no gpodder.net" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "Procurar no iTunes" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "Modo de procura" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "Opções de procura" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "Resultados da procura" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "Termos de procura" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "A procurar no Grooveshark" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "Segundo nível" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "Recuar" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "Avançar" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "Avançar um tempo relativo na faixa atual" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "Avançar para uma posição absoluta na faixa atual" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "Todas" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "Nenhuma" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "Escolha a cor de fundo:" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "Selecione a imagem de fundo" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "Selecione os prováveis" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "Escolha a cor do texto:" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "Selecione as visualizações" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "Selecione as visualizações..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "Número de série" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "URL do servidor" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "Detalhes do servidor" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "Serviço desligado" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Definir %1 para \"%2\"..." #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "Ajustar volume para por cento" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "Utilizar valor para todas as faixas selecionadas..." #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "Definições" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Atalho" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "Atalho para %1" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Já existe um atalho para %1" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Mostrar" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "Mostrar notificação" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "Mostrar animação na faixa reproduzida" #: ../bin/src/ui_appearancesettingspage.h:293 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:434 msgid "Show a native desktop notification" msgstr "Mostrar notificação do ambiente de trabalho" #: ../bin/src/ui_notificationssettingspage.h:442 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:441 msgid "Show a notification when I change the volume" msgstr "Mostrar notificação quando eu altero o volume" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "Mostrar alerta na área de notificação" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "Mostrar notificação personalizada" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "Mostrar acima da barra de estado" #: ui/mainwindow.cpp:460 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:209 msgid "Show cover art in library" msgstr "Mostrar capa de álbum na coleção" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "Mostrar separadores" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "Ver imagem em ecrã completo..." #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "Mostrar no gestor de ficheiros..." #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "Mostrar em vários artistas" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "Mostrar barra de estado de espírito" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "Mostrar apenas as repetidas" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "Mostrar apenas faixas sem detalhes" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "Mostrar sugestões" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "Mostrar os botões \"Gosto\" e \"Banir\"" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "Mostrar, na janela principal, o botão para \"Enviar\"" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "Mostrar ícone na área de notificação" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "Mostrar estado das fontes (ativas ou inativas)" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "Mostrar/Ocultar" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Desordenar" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "Desordenar álbuns" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "Desordenar tudo" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "Desordenar lista de reprodução" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "Desordenar faixas deste álbum" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "Iniciar sessão" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "Terminar sessão" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "A iniciar sessão..." #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "Artistas semelhantes" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "Tamanho" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "Tamanho:" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "Recuar na lista de reprodução" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "Reproduções ignoradas" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "Avançar na lista de reprodução" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "Capa de álbum pequena" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "Barra lateral pequena" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "Lista de reprodução inteligente" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "Listas de reprodução inteligentes" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Suave" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "Rock suave" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "Informações da faixa" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "Info da faixa" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "Sonograma" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "Desculpe" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "Organizar por género (alfabeticamente)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "Organizar por género (popularidade)" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Sort by station name" msgstr "Organizar pelo nome da 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" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "Fonte" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "Fontes" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "Erro de autenticação Spotify" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "Suplemento Spotify" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "Suplemento Spotify não instalado" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "Padrão" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "Com estrela" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "Iniciar lista de reprodução atual" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "Iniciar conversão" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Escreva algo na caixa de procura para preencher a lista de resultados" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "A iniciar %1" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "A iniciar..." #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "Estações" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Parar" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "Parar após" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "Parar após esta faixa" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Parar reprodução" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "Parar reprodução após a faixa atual" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "Parado" #: core/song.cpp:341 msgid "Stream" msgstr "Emissão" #: internet/subsonicsettingspage.cpp:30 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:160 msgid "Streaming membership" msgstr "Emissão" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "Listas de reprodução subscritas" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "Subscritores" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "Bem sucedido!" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "Escrito com sucesso %1" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "Detalhes sugeridos" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "Resumo" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "Ultra (%1 ips)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "Muito alta (2048x2048)" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "Formatos suportados" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "Sincronizar estatísticas dos ficheiros" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "A sincronizar caixa de entrada Spotify" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "A sincronizar lista de reprodução Spotify" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "A sincronizar faixas Spotify assinaladas" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "Cores do sistema" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "Separadores no topo" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "\"Tag\"" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "Obtenção de detalhes" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "Marcar rádio" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "Taxa de dados" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "Opções de texto" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Obrigado a" #: ui/globalshortcutssettingspage.cpp:175 #, 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:282 msgid "The album cover of the currently playing song" msgstr "A capa de álbum da faixa em reprodução" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "O diretório %1 é inválido" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "A lista de reprodução \"%1\" está vazia ou não pôde ser carregada" #: smartplaylists/searchtermwidget.cpp:330 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 que indicou não existe!" #: ui/coverfromurldialog.cpp:82 msgid "The site you requested is not an image!" msgstr "O sítio que indicou não é uma imagem!" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "Existem outras faixas neste álbum" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "Ocorreu um erro ao comunicar com gpodder.net" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Ocorreu um problema ao obter os metadados Magnatune" #: podcasts/itunessearchpage.cpp:76 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:56 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:389 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 de que quer continuar?" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 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:187 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:174 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:151 msgid "Third level" msgstr "Terceiro nível" #: internet/jamendoservice.cpp:171 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 de que quer continuar?" #: internet/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "Este álbum não está disponível no formato solicitado" #: ../bin/src/ui_deviceproperties.h:381 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:375 msgid "This device supports the following file formats:" msgstr "Este dispositivo tem suporte aos seguintes formatos:" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "O dispositivo não vai funcionar corretamente" #: devices/devicemanager.cpp:567 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 dispositivo iPod, mas você compilou o Clementine sem suporte a libgpod" #: devices/devicemanager.cpp:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Esta opção pode ser alterada nas preferências" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "Só os assinantes têm acesso a esta emissão" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "Este tipo de dispositivo não é suportado: %1" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "Tempo limite" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Título" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "Para reproduzir uma rádio Grooveshark, deve reproduzir algumas músicas primeiro" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "Hoje" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "Alternar notificação" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Trocar para ecrã completo" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "Trocar o estado da fila" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "Alternar envio" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Alternar a visibilidade da notificação" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "Amanhã" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "Demasiados reencaminhamentos" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "As melhores faixas" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "Total de álbuns:" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "Total de dados transferidos" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "Total de pedidos efetuados" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Faixa" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "Conversão de ficheiros" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "Registo do conversor" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "Conversão" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "A converter %1 ficheiros com %2 processos" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "Opções" #: core/song.cpp:338 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "Turbina" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "Desligar" #: devices/giolister.cpp:161 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "URL(s)" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "Senha Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "Utilizador Ubuntu One" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "Bando ultra larga (UWB)" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Incapaz de transferir %1 (%2)" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Desconhecido" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "Conteúdo desconhecido" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Erro desconhecido" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "Sem capa" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "Cancelar subscrição" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "Próximos eventos" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "Atualizar lista de reprodução Grooveshark" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "Atualizar todos os podcasts" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "Atualizar pastas alteradas" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "Atualizar coleção ao iniciar o Clementine" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "Atualizar este podcast" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "Atualização" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "A atualizar %1" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "A atualizar %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "A atualizar coleção" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "Utilização" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "Se disponível, utilizar os detalhes Artista do álbum" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "Utilizar teclas de atalho Gnome" #: ../bin/src/ui_playbacksettingspage.h:310 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:129 msgid "Use SSLv3" msgstr "Utilizar SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "Utilizar Wii Remote" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "Utilizar cores personalizadas" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "Utilizar notificações personalizadas" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "Utilizar controlo remoto de rede" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "Utilizar autenticação" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "Utilizar mecanismo de gestão de dados" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "Utilizar modo dinâmico" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "Utilizar notificações, para reportar o estado do Wii Remote" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "Utilizar modelação de ruído" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "Utilizar definições do sistema" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "Utilizar cores do sistema" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "Utilizar definições do sistema" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "Utilizar normalização de volume" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "Utilizado" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "O utilizador %1 não tem uma conta Grooveshark Anywhere" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "Interface de utilizador" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Utilizador" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "Ao utilizar o menu para adicionar uma faixa..." #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "Taxa de dados variável" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "Vários artistas" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "Versão %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "Ver" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "Modo de visualização" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "Visualizações" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "Definições das visualizações" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "Deteção de voz" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "Disco %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "Avisar ao fechar um separador de lista de reprodução" #: core/song.cpp:337 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "Sítio web" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "Semanas" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "Ao iniciar o Clementine" #: ../bin/src/ui_librarysettingspage.h:204 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 contenham uma destas palavras\nSe não existirem ocorrências, o Clementine utilizará a maior imagem do diretório" #: ../bin/src/ui_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "Se a lista estiver vazia..." #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "Porque não tentar..." #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "Banda larga (WB)" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii Remote %1: ativo" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii Remote %1: ligado" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii Remote %1: bateria em estado crítico (%2%)" #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii Remote %1: inativo" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii Remote %1: desligado" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Remote %1: bateria fraca (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "Windows Media Áudio" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "Sem capa:" #: library/libraryview.cpp:530 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:2088 msgid "Would you like to run a full rescan right now?" msgstr "Pretende executar a nova análise?" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "Gravar todas as estatísticas nos detalhes dos ficheiros" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "Nome de utilizador ou senha inválido(a)." #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "Ano" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "Ano - álbum" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "Anos" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "Ontem" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "Está prestes a transferir os seguintes álbuns" #: playlist/playlistlistcontainer.cpp:311 #, 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:177 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:172 msgid "You are not signed in." msgstr "Sessão não iniciada." #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "Iniciou sessão como %1." #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "Sessão iniciada" #: ../bin/src/ui_groupbydialog.h:123 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/digitallyimportedsettingspage.cpp:46 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 escutar as emissões com uma qualidade superior e sem anúncios" #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "Pode ouvir as emissões em segundo plano, em simultâneo com outras faixas" #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "Pode enviar as suas faixas gratuitamente, mas só os assinantes conseguem ouvir as rádios da last.fm através do Clementine" #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "Você não tem uma conta Grooveshark Anywhere" #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Você não tem uma conta Spotify Premium" #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "Não tem uma subscrição ativa" #: internet/spotifyservice.cpp:170 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 senha na caixa de diálogo de definições" #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Terminou a sessão no Spotify. Reintroduza a sua senha" #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "Você gosta desta faixa" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "Precisa de iniciar as preferências do sistema e escolher \"Ativar acesso de apoio a dispositivos\", para utilizar os atalhos globais do Clementine" #: ../bin/src/ui_behavioursettingspage.h:200 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" #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "Você só conseguirá ouvir as estações last.fm, se possuir uma assinatura" #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "O seu endereço IP:" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Os seus dados last.fm são inválidos" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "Os seus dados Magnatune são inválidos" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "A coleção está vazia!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "As suas emissões de rádio" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "Os seus envios: %1" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "O seu sistema não possui suporte a OpenGL e as visualização não estão disponíveis" #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "Utilizador e/ou senha inválida" #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Nulo" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "adicionar %n faixas" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "depois" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "atrás" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "e" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "automático" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "antes" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "entre" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "a maior primeiro" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "contém" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "inativa" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "disco %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "não contém" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "termina com" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "igual a" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "gpodder.net" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "Diretório gpodder.net" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "maior que" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "no(s) último(s)" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "menor que" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "a mais longa primeiro" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "mover %n faixas" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "a mais recente primeiro" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "não igual a" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "não nos últimos" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "não ligado" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "a mais antiga primeiro" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "em" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "opções" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "ou processar o código QR!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "prima enter" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "remover %n faixas" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "a mais curta primeiro" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "desordenar faixas" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "a mais pequena primeiro" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "ordenar faixas" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "inicia com" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "parar" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "faixa %1" clementine-1.2.0+dfsg/src/translations/pt_BR.po000066400000000000000000004702051223327513400214440ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # salmora8 , 2013 # amiltonpc , 2013 # bedi1982 , 2012 # FIRST AUTHOR , 2010 # Israel IsraeLins , 2012 # aramaicus , 2013 # Marco Tulio Costa , 2012 # rcpp , 2013 # salmora8 , 2012 # Weiller Cardoso <>, 2012-2013 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-09-15 04:16+0000\n" "Last-Translator: amiltonpc \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/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:39 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 favoritar a lista de reprodução clicando no ícone estrela, próximo ao nome da lista de reprodução\n\nLista de reproduções favoritadas serão salvas aqui" #: ../bin/src/ui_podcastsettingspage.h:246 msgid " days" msgstr "dias" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " pt" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " segundos" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " músicas" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 álbuns" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 dias" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 dias atrás" #: podcasts/gpoddersync.cpp:79 #, 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:413 #, qt-format msgid "%1 selected of" msgstr "%1 selecionado(s) de" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 música" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 músicas" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 músicas encontradas" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 músicas encontradas (Exibindo %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 faixas" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 transferido" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Modulo do dispositivo Wiimote" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n falhou" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n finalizado" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "&Personalizado" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "Extras" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "&Ajuda" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "&Ocultar %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "&Ocultar..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Esquerda" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "Música" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Nenhum" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "Lista de Reprodução" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Sair" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "&Mode de Repetição" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Direita" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "Modo aleatório" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "&Esticar colunas para ajustar a janela" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "&Ferramentas" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(diferentes em várias músicas)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "...todos que contribuíram com o Amarok" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "0px" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 dia" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 faixa" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "127.0.0.1" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "40%" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 faixas aleatórias" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "Atualizar para versão Premium" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "Criar uma nova conta ou redefinir sua senha" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "É necessário ter uma conta Grooveshark Anywhere." #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "É necessária uma conta Premium Spotify." #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "Somente um cliente pode se conectar, se o código correto for inserido." #: smartplaylists/wizard.cpp:78 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:153 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:297 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "TODA A GLÓRIA PARA O HYPNOTOAD" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "Abortar" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "Sobre %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "Sobre o Clementine..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "Sobre o Qt..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Detalhes da conta" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "Detalhes da Conta (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Ação" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Ativar/desativar Wiiremote" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "Adicionar Podcast" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Adicionar transmissão" #: ../bin/src/ui_notificationssettingspage.h:425 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:193 msgid "Add action" msgstr "Adicionar ação" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Adicionar outro canal..." #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Adicionar diretório..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "Adicionar Arquivo" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "Adicionar arquivo para conversor" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "Adicionar arquivo(s) para conversor" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Adicionar arquivo..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Adicionar arquivos para converter" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Adicionar pasta" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Adicionar pasta..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Adicionar nova pasta..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "Adicionar Podcast" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "Adicionar Podcast..." #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Adicionar termo para busca" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "Adicionar tag álbum da música" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "Adicionar à música a tag artista do álbum" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "Adicionar a tag artista da música" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "Adicionar avaliação automática da faíxa" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "Adicionar a tag compositor da música" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "Adicionar a tag disco da música" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "Adicionar o nome do arquivo da música" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "Adicionar a tag gênero da música" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "Adicionar músicas por agrupamento da tag" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "Adicionar a tag duração da música" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "Adicionar músicas por tag do artista" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "Adicionar contagem a reprodução da música" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "Adicionar avaliar faixa " #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "Adicionar contador de pular música" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "Adicionar a tag título da música" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "Adicionar a tag faixa da música" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "Adicionar a tag ano da música" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Adicionar transmissão..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "Adicionar às favoritas do Grooveshark" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "Adicionar à lista de reprodução Grooveshark" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "Adicionar à outra lista de reprodução" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Adicionar à lista de reprodução" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "Adicionar à fila" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Adicionar ação de dispositivo wiimote" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Adicionar..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Adicionado(s) este mês" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Adicionado(s) esta semana" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Adicionado(s) este ano" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Adicionado(s) hoje" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Adicionado(s) há três meses" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "Adicionando música à Minha Música" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "Adicionando música aos favoritos" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Organização avançada..." #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "Depois" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "Depois de copiar..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Álbum" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Álbum (volume ideal para todas as faixas)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Artista do álbum" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "Capa do Álbum" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Informação do álbum no jamendo.com..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Álbuns com capas" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Álbuns sem capas" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Todos os arquivos (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "Toda a Glória para o Hypnotoad!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Todos os álbuns" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Todos os artistas" #: ui/albumcoverchoicecontroller.cpp:47 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:74 msgid "All the translators" msgstr "Todos os tradutores" #: library/library.cpp:84 msgid "All tracks" msgstr "Todas as faixas" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "Permitir cliente baixar musicas deste computador." #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "Permitir downloads" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "Permitir codificação mid/side" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "Juntamente com os originais" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Sempre ocultar a janela principal" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Sempre exibir a janela principal" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "Sempre começar tocando" #: internet/spotifyblobdownloader.cpp:60 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:61 msgid "An error occurred loading the iTunes database" msgstr "Ocorreu um erro no carregamento do banco de dados do iTunes" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Ocorreu um erro de escrita de metadados para '%1'" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "Um erro não especificado ocorreu." #: ui/about.cpp:78 msgid "And:" msgstr "e:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "Bravo" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Aparência" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Acrescentar arquivos/sites para a lista de reprodução" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "Adicionar à lista de reprodução atual" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "Anexar ao fim da lista de reprodução" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "Aplicar compressão para prevenir picos" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Tem certeza que deseja apagar a pré-regulagem \"%1\" ?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "Tem certeza que você quer excluir esta lista de reprodução?" #: ui/edittagdialog.cpp:769 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:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Artista" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Sobre o Artista" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "Rádio do artista" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "Tags do artista" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "Inicial do artista" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Formato de áudio" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Falha na autenticação" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "Autor" #: ui/about.cpp:65 msgid "Authors" msgstr "Autores" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Automático" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Atualização automática" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "Abrir categorias únicas da árvore da biblioteca automaticamente" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "Disponível" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "Taxa de bits média" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "Tamanho médio de imagem" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "Podcasts BBC" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "Sons de fundo" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Cor de fundo" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "Imagem de fundo" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Opacidade de fundo" #: core/database.cpp:734 msgid "Backing up database" msgstr "Cópia do banco de dados" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "Balança" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Não curti" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "Barra" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Azul básico" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "Tipo de Áudio básico" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Comportamento" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "Melhor" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "Biografia de %1" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Taxa de bits" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "Taxa de Amostragem" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "Analizador de bloco" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "Tipo de bloco" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "Quantidade borrão" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "Conteúdo" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "Explosão" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "Caixa" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Procurar..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "Duração do buffer" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "Armazenando em buffer" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "Mas estes recursos estão desabilitados:" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Botões" #: core/song.cpp:339 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "Suporte a lista CUE" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "Cancelar" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Alterar capa" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Mudar tamanho da letra..." #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "Alterar modo de repetição" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Mudar atalho..." #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "Alterar modo aleatório" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Alterar idioma" #: ../bin/src/ui_playbacksettingspage.h:330 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:228 msgid "Check for new episodes" msgstr "Procurar por novos episódios" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Procurar por atualizações..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "Escolha um nome para sua lista inteligente" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Escolher automaticamente" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Escolher cor..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "Escolher fonte..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Escolher da lista" #: smartplaylists/querywizardplugin.cpp:155 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á." #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "Escolha a pasta de download de podcasts" #: ../bin/src/ui_songinfosettingspage.h:188 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:115 msgid "Classical" msgstr "Clássica" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "Limpando" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Limpar" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Limpar lista de reprodução" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Erro no Clementine" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Clementine Laranja" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Visualização Clementine" #: ../bin/src/ui_deviceproperties.h:376 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_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine pode tocar música que você enviou para Caixa" #: ../bin/src/ui_dropboxsettingspage.h:104 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:104 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_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "O Clementine pode tocar música que você transferiu para o Ubuntu One" #: ../bin/src/ui_notificationssettingspage.h:431 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:250 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:128 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." #: internet/lastfmsettingspage.cpp:110 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 "Clementine não pôde obter o status de sua assinatura já que há problemas com a sua conexão. Faixas reproduzidas serão armazenadas em cache e depois enviadas para o Last.fm." #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Visualizador de imagens do Clementine" #: ../bin/src/ui_trackselectiondialog.h:206 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:210 msgid "Clementine will find music in:" msgstr "O Clementine irá buscar música em:" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Clique aqui para adicionar algumas músicas" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "Clique para alternar entre tempo restante e tempo total" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "Fechar lista de reprodução" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "Fechar visualização" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "Fechar esta janela cancelará o download" #: ui/albumcovermanager.cpp:216 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:116 msgid "Club" msgstr "Clube" #: ../bin/src/ui_appearancesettingspage.h:272 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:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Comentário" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "Completar tags automaticamente" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "Preencher tags automaticamente..." #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Compositor" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "Configurar %1..." #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "Configurar Grooveshark..." #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Configurar Last.fm..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "Configurar Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Configurar atalhos" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "Configurar Spotify..." #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "Configurar Subsonic..." #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "Configurar busca global..." #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "Configurar biblioteca..." #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "Configurar podcasts" #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "Configurar..." #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "Conectar controles remotos do Wii usando ação de ativar/desativar" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "Conectar dispositivo" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "Conectando ao Spotify" #: internet/subsonicsettingspage.cpp:107 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/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Conexão expirou, verifique a URL do servidor. Exemplo: http://localhost:4040/" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "Painel" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "Taxa de bits constante" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "Converter todas as músicas" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "Converter qualquer música que o dispositivo não puder tocar" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "Copiar para a área de transferência" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Copiar para o dispositivo..." #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Copiar para biblioteca..." #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "Copyright" #: internet/subsonicsettingspage.cpp:81 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:64 #, 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" #: transcoder/transcoder.cpp:432 #, 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:426 #, 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/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "Não foi possível carregar a estação de rádio do last.fm" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "Não foi possível abrir o arquivo de saída %1" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Gerenciador de capas" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "Capa do album da imagem inserida" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "A capa foi carregada automaticamente a partir de %1" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "Capa manualmente removida" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "Capa não definida" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "Capa configurada de %1" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "Capas do %1" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "Criar uma nova lista de reprodução Grooveshark" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "Transição suave quando mudar de faixa automaticamente" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "Transição suave quando mudar de faixa manualmente" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "Personalizado" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "Imagem personalizada:" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "Configurações de mensagem personalizada" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "Rádio personalizada" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Personalizado..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "Caminho do DBus" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Dance" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Data de criação" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Data de modificação" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "Dias" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "&Padrão" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "Diminuir volume em 4%" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "Diminuir o volume por porcentagem " #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Diminuir volume" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "Imagem de fundo padrão" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "Padrões" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "Intervalo entre visualizações" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "Apagar" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "Excluir lista de reprodução Grooveshark" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "Apagar dados baixados" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Excluir arquivos" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Apagar do dispositivo..." #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Apagar do disco..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "Apagar episódios reproduzidos" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "Apagar pré-regulagem" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "Apagar lista inteligente" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "Apagar os arquivos originais" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Apagando arquivos" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "Retirar faixas selecionadas da fila" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "Retirar faixa da fila" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Destino" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Detalhes..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Dispositivo" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Propriedades do dispositivo" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Nome do dispositivo" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Propriedades do dispositivo..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Dispositivos" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Você quis dizer" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "Senha Digitally imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "Usuário Digitally importado" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "Conexão direta à Internet" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Diretório" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "Desativar duração" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "Desabilitar criação da moodbar." #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Desativado" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Disco" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "Transmissão descontínua" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 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:715 msgid "Do a full library rescan" msgstr "Reescanear por completo a biblioteca" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "Não converter nenhuma música" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "Não substituir" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Não repetir" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "Não exibir em vários artistas" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "Não embaralhar" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "Não parar!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "Doar" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Clique duplo para abrir" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "Clique duplo em uma música irá..." #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "Baixar %n episódios" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "Pasta de download" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "Baixar episódios para" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "Conta de download" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "Baixar automaticamente novos episódios" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "Download na fila" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "Baixar o aplicativo Android" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Baixar este álbum" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Baixar este álbum..." #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "Baixar este episódio" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "Baixar..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "Baixando (%1%)" #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "Baixando diretório Icecast" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "Baixando catálogo do Jamendo" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "Baixando catálogo da Magnatune" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "Baixando plugin Spotify" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "Baixando metadados" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "Arraste para reposicionar" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "Dropbox" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "Modo dinâmico ligado" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "Mix aleatório dinâmico" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "Editar lista de reprodução inteligente..." #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Editar tag \"%1\"..." #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "Editar tag..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "Editar tag" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Editar informações da faixa" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "Editar informações da faixa..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Editar informações da faixa..." #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Editar..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "Habilitar suporte a controle remoto do Wii" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "Habilitar equalizador" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "Habilitar atalhos só quando o Clementine tiver foco" #: ../bin/src/ui_globalsearchsettingspage.h:147 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:62 msgid "Enable/disable Last.fm scrobbling" msgstr "Ativar/Desativar Last.fm scrobbling" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "Complexidade de codificação" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "Qualidade da codificação" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "Modo de codificação" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "Digite uma URL" #: ../bin/src/ui_coverfromurldialog.h:103 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:205 msgid "Enter a filename for exported covers (no extension):" msgstr "Digite um nome de arquivo para capas exportadas (sem extensão):" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "Digite um novo nome para esta lista" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Digite um artista ou tag para começar a ouvir a rádio Last.fm." #: ../bin/src/ui_globalsearchview.h:209 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:77 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:77 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:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "Digite os termos da pesquisa aqui" #: ../bin/src/ui_addstreamdialog.h:114 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:171 msgid "Enter the name of the folder" msgstr "Digite o nome da pasta" #: ../bin/src/ui_networkremotesettingspage.h:198 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:87 msgid "Entire collection" msgstr "Toda a coletânia" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Erro" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Erro ao conectar ao dispositivo MTP" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "Erro ao copiar músicas" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "Erro ao apagar músicas" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "Erro ao baixar o plugin Spotify" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "Erro carregando %1" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Erro carregando a lista de reprodução: di.fm" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "Erro processando %1:%2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "Erro ao carregar o CD de áudio" #: library/library.cpp:63 msgid "Ever played" msgstr "Já reproduzido" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "A cada 10 minutos" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "A cada 12 horas" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "A cada 2 horas" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "A cada 20 minutos" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "A cada 30 minutos" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "A cada 6 horas" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "A cada hora" #: ../bin/src/ui_playbacksettingspage.h:303 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:208 msgid "Existing covers" msgstr "Capas existentes" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "Expandir" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "Expira em %1" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "Exportar Capas" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "Exportar capas" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "Exportar capas baixadas" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "Exportar capas embutidas" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "Exportação terminou" #: ui/albumcovermanager.cpp:786 #, 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:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "Desvanecer ao pausar / Voltar gradualmente ao retomar" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "Diminuir o som gradativamente quando terminar uma faixa" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "Diminuindo" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "Duração da dimunuição" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "Falha ao acessar o diretório" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "Falha ao acessar os podcasts" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "Falha ao abrir o podcast" #: podcasts/podcasturlloader.cpp:167 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:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "Rápida" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "Favoritos" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "Faixas preferidas" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "Buscar as capas que faltam" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "Buscar automaticamente" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "Atualização concluída" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "Buscando biblioteca Subsonic" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Erro ao buscar a capa" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "Extensão de arquivo" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "Formatos de arquivo" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Nome de arquivo" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "Nome do arquivo (sem pasta)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Tamanho do arquivo" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Tipo de arquivo" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Nome do arquivo" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Arquivos" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "Arquivos para converter" #: smartplaylists/querywizardplugin.cpp:90 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." #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "Registrando a música" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "Finalizar" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "Primeiro nível" #: core/song.cpp:328 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Tamanho da fonte" #: ../bin/src/ui_spotifysettingspage.h:213 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:204 msgid "Force mono encoding" msgstr "Forçar codificação em mono" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "Esquecer dispositivo" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Formulário" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "Formato" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Quadros por segundo" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "Quadros por buffer" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Amigos" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "Congelado" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Graves" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "Graves + Agudos" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "Muito Agudo" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "Mecanismo de áudio GStreamer" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "Geral" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Configurações gerais" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Gênero" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "Obter uma URL para compartilhar esta lista de reprodução do Grooveshark" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "Obter uma URL para compartilhar esta música do Grooveshark" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "Recuperando lista das músicas populares Grooveshark" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "Adquirindo canais" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "Recebendo transmissões" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "Nome da transmissão:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "Ir" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "Ir até a aba do próximo playlist" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "Ir até a aba lista de reprodução anterior" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, 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:206 msgid "Grey out non existent songs in my playlists" msgstr "Acinzentar músicas inexistentes da minha lista de reprodução" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "Erro ao logar no Grooveshark" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "URL da lista de reprodução do Grooveshark" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "Rádio Grooveshark" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "URL da música Grooveshark" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "Organizar Biblioteca por..." #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "Organizar por" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "Organizar por Álbum" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "Organizar por Artista" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "Organizar por Artista/Álbum" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "Organizar por Artista/Ano do Álbum" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "Organizar por Gênero/Álbum" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "Organizar por Gênero/Artista/Álbum" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "Agrupamento" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "A página HTML não contém nenhum RSS" #: internet/subsonicsettingspage.cpp:135 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:163 msgid "HTTP proxy" msgstr "Proxy HTTP" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "Feliz" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "Informação de hardware" #: ../bin/src/ui_deviceproperties.h:372 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:202 msgid "High" msgstr "Alta" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "Alto (%1 fps)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "Alta (1024x1024)" #: internet/subsonicsettingspage.cpp:112 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:310 msgid "Hours" msgstr "Horas" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "Eu não tenho uma conta no Magnatune" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Ícone" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "Ícones acima" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "Identificando música" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 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:77 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:204 msgid "Ignore \"The\" in artist names" msgstr "Ignorar o \"The\" em nomes de artistas" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Imagens (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "Em %1 dias" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "Em %1 semanas" #: ../bin/src/ui_wizardfinishpage.h:86 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/spotifyservice.cpp:360 msgid "Inbox" msgstr "Caixa de entrada" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "Incluir capa do álbum na notificação" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "Incluir todas as músicas" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Versão do protocolo Subsonic REST incompatível. Cliente deve atualizar." #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Versão do protocolo Subsonic REST incompatível. Servidor deve atualizar." #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Configuração incompleta, assegure que todos os campos estão preenchidos." #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "Aumentar volume em 4%" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "Aumentar o volume por porcentagem " #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Aumentar volume" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "Indexando %1" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "Informação" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "Inserir..." #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Instalado" #: core/database.cpp:673 msgid "Integrity check" msgstr "Verificar integridade" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "Dados da Internet" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "Chave API inválida" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Formato inválido" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "Método inválido" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "Parâmetros inválidos" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "Recurso especificado inválido" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "Serviço inválido" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "Chave de sessão inválida" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "Usuário e/ou senha inválido(s)" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "Faixas mais ouvidas do Jamendo" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "Faixas principais no Jamendo" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "Faixas principais no Jamendo este mês" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "Faixas principais no Jamendo esta semana" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "Banco de dados Jamendo" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "Pular para a faixa em execução" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Manter botões por %1 segundo..." #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Manter botôes por %1 segundos..." #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "Continuar executando quando a janela é fechada" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "Manter arquivos originais" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "Gatinhos" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Idioma" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "Notebook / fones de ouvido" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Salão Grande" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "Capa grande de álbum" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "Barra lateral grande" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "Última reprodução" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "Rádio personalizada do Last.fm: %1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Biblioteca Last.fm - %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "Rádio mista do last.fm: %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Rádio do vizinho no Last.fm - %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Estação de Rádio Last.fm - %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Artistas Last.fm Similares a %1" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Tag de Rádio do Last.fm: %1" #: internet/lastfmservice.cpp:437 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:154 msgid "Last.fm password" msgstr "Senha do Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "Número de reproduções do last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Tags do Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Nome de usuário do Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Wiki do last.fm" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "Faixas menos preferidas" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "Deixe em branco por padrão. Exemplos: \"/dev/dsp\", \"front\", etc." #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "Esquerda" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Duração" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Biblioteca" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "Organização avançada de biblioteca" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "Aviso de reescaneamento da biblioteca" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "Busca na biblioteca" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Limites" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "Ouvir músicas Grooveshark com base no que você ouviu anteriormente" #: ui/equalizer.cpp:123 msgid "Live" msgstr "Ao vivo" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Carregar" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "Carregar capa da URL" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "Carregar capa da URL..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "Carregar capa do disco" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "Carregar capa do disco..." #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "Carregar lista de reprodução" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "Carregar lista de reprodução..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Carregando rádio Last.fm" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Carregando dispositivo MTP" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "Carregando banco de dados do iPod" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "Carregando lista de reprodução inteligente" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "Carregando músicas" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "Carregando transmissão" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "Carregando faixas" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "Carregando informações da faixa" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "Carregando..." #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "Carregar arquivos/sites, substiuindo a lista de reprodução atual" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Login" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "Falha ao conectar" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "Perfil de previsão a longo prazo (LTP)" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "Curtir" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Baixo (%1 fps)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "Baixa (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "Perfil de baixa complexidade (LC)" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "Letras de música" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "Letras de %1" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Download do Magnatune" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Download do Magnatune finalizado" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "Menu perfil (PRINCIPAL)" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "Agora!" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "Tornar lista de reprodução disponível offline" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "Resposta inválida" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "Configuração manual de proxy" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "Manualmente" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "Fabricante" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "Marcar como ouvida" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "Marcar como nova" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "Buscar por todos os termos de pesquisa juntos (E)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "Buscar um ou mais termos de pesquisa (OU)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "Taxa de bits máxima" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "Médio (%1 fps)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "Média (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "Tipo de conta" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "Taxa de bits mínima" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "Pré-definições do projectM faltando" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "Modelo" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "Vigiar mudanças na biblioteca" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "Saída Mono" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "Meses" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "Modo" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "Estilo da moodbar" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "Moodbars" #: library/library.cpp:74 msgid "Most played" msgstr "Mais tocadas" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "Ponto de montagem" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "Pontos de montagem" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "Para baixo" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "Mover para biblioteca..." #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "Para cima" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "Música" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Biblioteca de Músicas" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "Mudo" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "Minha biblioteca no Last.fm" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "Minha Rádio Mix do Last.fm" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "Minha Vizinhança no Last.fm" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "Minha Rádio de Recomendações no Last.fm" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "Minha Rádio Mix" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "Minha Música" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "Minha Vizinhança" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "Minha Estação de Rádio" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "Minhas Recomendações" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Nome" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "Opções de nomes" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "Banda baixa (NB)" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "Vizinhos" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "Conexão de rede" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "Proxy da Rede" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "Rede Remota" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "Nunca" #: library/library.cpp:67 msgid "Never played" msgstr "Nunca tocado" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "Nunca iniciar tocando" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "Nova pasta" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "Nova lista de reprodução" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "Nova lista de reprodução inteligente..." #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "Novas músicas" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "Novas faixas serão adicionadas automaticamente." #: library/library.cpp:80 msgid "Newest tracks" msgstr "Faixas mais recentes" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "Próximo" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Próxima faixa" #: core/utilities.cpp:147 msgid "Next week" msgstr "Próxima semana" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "Sem visualização" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "Sem imagem de fundo" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "Não há capas para exportar." #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "Sem blocos longos" #: playlist/playlistcontainer.cpp:366 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:145 msgid "No short blocks" msgstr "Sem blocos curtos" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "Nenhum" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 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:155 msgid "Normal" msgstr "Normal" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "Tipo de blocos normal" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "Não disponível enquanto uma lista dinâmica estiver em uso" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "Desconectado" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "Conteúdo insuficiente" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "Fãs insuficientes" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "Sem membros o bastante" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "Sem vizinhos o bastante" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Não instalado" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "Não logado" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "Não montado - clique duas vezes para montar" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "Tipo de notificação" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Notificações" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Reproduzindo Agora" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "Pré-visualização de informações na tela" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "Opacidade" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "Abrir %1 no browser" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "Abrir CD de &áudio..." #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "Abrir arquivo OPML" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "Abrir arquivo OPML..." #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "Abrir dispositivo" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "Abrir arquivo..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "Abrir no Google Drive" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "Abrir em nova lista de reprodução" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Abrir..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "A operação falhou" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "Otimizar por taxa de bits" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "Otimizar por qualidade" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "Opções..." #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "Organizar Arquivos" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "Organizar arquivos..." #: core/organise.cpp:65 msgid "Organising files" msgstr "Organizando arquivos" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "Tags originais" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Outras opções" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "Saída" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "Dispositivo de saída" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "Opções de Saída" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "Plugin de saída" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "Substituir tudo" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "Sobrescrever arquivos existentes" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "Substituir apenas os menores" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "Dono" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "Analisando catálogo do Jamendo" #: ui/equalizer.cpp:124 msgid "Party" msgstr "Festa" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "Senha" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Pausar" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "Pausar reprodução" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Pausado" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "Artista" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "Pixel" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "Barra lateral simples" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Reproduzir" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "Reproduzir Artista ou Tag" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "Reproduzir rádio do artista..." #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "Número de reproduções" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "Tocar rádio personalizada..." #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "Reproduzir se estiver parado, pausar se estiver tocando" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "Tocar se não houver nada tocando" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "Reproduzir rádio tag..." #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "Tocar a ª faixa da lista" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "Reproduzir/pausar" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Reproduzir" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Opções do player" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "Lista de Reprodução" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "A lista de reprodução terminou" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "Opções da lista de reprodução" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "Tipo de lista de reprodução" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "Listas de reprodução" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "Por favor, feche seu navegador e volte ao Clementine" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "Status do plugin:" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "Podcasts" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Pop" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "Músicas Populares" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "Músicas populares do mês" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "Músicas populares do dia" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "Duração do aviso" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "Porta" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "Pré-amplificação" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "Preferências" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "Preferências..." #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "Nomenclatura para arquivos de capa (separado por vírgulas)" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "Formato de áudio preferido" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "Taxa de bits preferida" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "Formato preferido" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "Áudio Premium" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "Pré-regulagem:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "Pressione uma combinação de botões para usar para" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "Pressione uma tecla" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Pressione uma combinação de teclas para %1..." #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "Opções de aviso estilizado" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "Pré-visualização" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "Anterior" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 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:131 msgid "Profile" msgstr "Perfil" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "Andamento" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 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:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "Qualidade" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "Consultando dispositivo..." #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "Gerenciador de Fila" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "Colocar as faixas selecionadas na fila" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "Colocar a faixa na fila" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "Rádio (volume igual para todas as faixas)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "Rádios" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "Chuva" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "Visualização aleatória" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "Classificar a música atual com 0 estrelas" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "Classificar a música atual com 0 estrela" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "Classificar a música atual com 2 estrelas" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "Classificar a música atual com 3 estrelas" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "Classificar a música atual com 4 estrelas" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "Classificar a música atual com 5 estrelas" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "Avaliação" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "Deseja realmente cancelar?" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "Limite de redirecionamento excedeu, verifique a configuração do servidor." #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "Atualizar" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "Atualizar catálogo" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "Atualizar canais" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "Atualizar lista de amigos" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "Atualizar lista de estações" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "Atualizar transmissões" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Reggae" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "Lembrar balanço do Wiimote" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "Lembrar a última vez" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Remover" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "Remover ação" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "Remover duplicados da lista de reprodução" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "Remover pasta" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "Remover de Minha Música" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "Remover dos favoritos" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "Remover da lista de reprodução" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "Remover lista de reprodução" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "Remover listas de reprodução" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "Removendo músicas de minha música" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "Removendo músicas dos favoritos" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "Renomear a lista de reprodução \"%1\"" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "Renomear lista de reprodução Grooveshark" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "Renomear lista de reprodução" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "Renomear lista de reprodução..." #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "Renumerar faixas nesta ordem..." #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Repetir" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "Repetir um álbum" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "Repetir lista de reprodução" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "Repetir uma faixa" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Substituir lista de reprodução atual" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "Substituir a lista de reprodução" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "Substituir espaços com sublinhados" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "Replay Gain" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "Modo ReplayGain" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "Repovoar" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "Exigir código de autenticação" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "Redefinir" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" msgstr "Limpar contador de reprodução" #: 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:206 msgid "Restrict to ASCII characters" msgstr "Restringir a caracteres ASCII" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "Retomar a reprodução ao iniciar" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "Recuperando Minhas Músicas do Grooveshark" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "Recuperando lista das músicas favoritas Grooveshark" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "Recuperando listas de reprodução Grooveshark" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "Voltar ao Clementine" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "Direita" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "Executar" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "Proxy SOCKS" #: internet/subsonicsettingspage.cpp:122 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:202 msgid "Safely remove device" msgstr "Remover o dispositivo com segurança" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "Remover o dispositivo com segurança após copiar" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "Taxa de amostragem" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "Taxa de amostragem" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "Salvar arquivos .mood na sua biblioteca musical." #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "Salvar capa do álbum" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "Gravar capa para o disco..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "Salvar imagem" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "Salvar lista de reprodução" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "Salvar lista de reprodução..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "Salvar pré-regulagem" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "Salvar classificações em tags de arquivos quando possível" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "Salvar estatísticas em tags de arquivos quando possível" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "Salvar esta transmissão na aba de Internet" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "Salvando estatísticas de músicas em arquivos de músicas" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "Gravando faixas" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "Perfil evolutivo taxa de amostragem (SSR)" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "Tamanho de escala" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "Pontuação" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "Adicionar ao meu perfil os dados das músicas que eu ouvir" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "Pesquisar" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "Pesquisar estações do Icecast" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "Pesquisar Jamendo" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Pesquisar Magnatune" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "Pesquisa Subsonic" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "Procurar por capas dos álbuns..." #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "Busca por qualquer coisa" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "Procurar gpodder.net" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "Procurar no iTunes" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "Modo de pesquisa" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "Opções de pesquisa" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "Resultados da busca" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "Termos de pesquisa" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "Procurando no Grooveshark" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "Segundo nível" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "Voltar" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "Avançar" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "Avançar na faixa atual por um tempo relativo" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "Avançar na faixa atual para uma posição absoluta" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "Selecionar Tudo" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "Desmarcar Tudo" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "Selecione uma cor de fundo:" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "Escolha uma imagem de fundo" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "Selecionar o melhor resultado possível" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "Selecione uma cor de frente:" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "Selecionar visualizações" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "Selecione as visualizações..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "Número de série" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "URL do Servidor" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "Detalhes do servidor" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "Serviço indisponível" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Mudar %1 para \"%2\"..." #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "Mudar volume para por cento" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "Mudar o valor para todas as faixas selecionadas..." #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "Configurações" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Atalho" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "Atalho para %1" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Já existe um atalho para %1" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Exibir" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "Mostrar aviso na tela" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "Mostrar animação na faixa atual" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "Exibir a moodbar na barra de progresso." #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "Mostrar notificação nativa do sistema" #: ../bin/src/ui_notificationssettingspage.h:442 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:441 msgid "Show a notification when I change the volume" msgstr "Mostrar notificação quando mudar o volume" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "Mostrar uma notificação na área de notificação" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "Mostrar aviso estilizado na tela" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "Mostrar acima da barra de status" #: ui/mainwindow.cpp:460 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:209 msgid "Show cover art in library" msgstr "Mostrar capa na biblioteca" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "Mostrar divisores" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "Exibir em tamanho real..." #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "Mostrar no navegador de arquivos..." #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "Exibir em vários artistas" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "Exibir moodbar" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "Mostrar somente os duplicados" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "Mostrar somente os sem tag" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "Exibir sugestões de busca" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "Exibir os botões \"Curtir\" e \"Não curti\"" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "Mostrar o botão scrobble na janela principal" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "Exibir ícone na área de notificação" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "Exibir quais fontes estão habilitadas ou não." #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "Mostrar/Ocultar" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Aleatória" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "Embaralhar albuns" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "Embaralhar tudo" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "Embaralhar lista de reprodução" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "Embaralhar faixas dos albuns" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "Cadastrar" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "Sair" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "Conectando..." #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "Artistas similares" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "Tamanho" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "Tamanho:" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "Pular para a música anterior da lista" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "Número de pulos" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "Pular para a próxima música da lista" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "Capa pequena de álbum" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "Barra lateral compacta" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "Lista de reprodução inteligente" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "Listas de reprodução inteligentes" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Suave" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "Informações da Música" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "Sobre a Música" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "Sonograma" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "Desculpe" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "Organizar por gênero (alfabeticamente)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "Organizar por gênero (popularidade)" #: ../bin/src/ui_icecastfilterwidget.h:77 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" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "Fonte" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "Fontes" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "Erro ao conectar no Spotify" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "Plugin Spofity" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "Plugin Spofity não instalado" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "Padrão" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "Favoritos" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "Iniciar a lista que está em execução" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "Começar conversão" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 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:405 #, qt-format msgid "Starting %1" msgstr "Iniciando %1" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "Iniciando..." #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "Estações" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Parar" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "Parar depois" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "Parar depois desta música" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Parar reprodução" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "Parar reprodução depois da música atual" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "Parado" #: core/song.cpp:341 msgid "Stream" msgstr "Transmissão" #: internet/subsonicsettingspage.cpp:30 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:160 msgid "Streaming membership" msgstr "Conta de transmissão multimídia" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "Listas de reprodução inscritas" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "Seguidores" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "Êxito!" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "%1 gravado com sucesso" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "Tags sugeridas" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "Resumo" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "Super alto (%1 fps)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "Super alta (2048x2048)" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "Formatos suportados" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "Sincronizar as estatísticas de arquivos agora" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "Sincronizando caixa de entrada do Spotify" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "Sincronizando listas de reprodução do Spotify" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "Sincronizando faixas favoritas do Spotify" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "Cores do Sistema" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "Mostrar abas no topo" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Tag" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "Buscador de tag" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "Tag da rádio" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "Taxa de bits alvo" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "Opções de texto" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Agradecimentos a" #: ui/globalshortcutssettingspage.cpp:175 #, 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:282 msgid "The album cover of the currently playing song" msgstr "A capa do álbum da música atual" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "O diretório %1 não é válido" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "A lista de reprodução '%1' está vazia ou não pode ser carregada." #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "O site que você pediu não é uma imagem!" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "Há outras músicas neste álbum" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "Houve um problema com a comunicação com o gpodder.net" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Houve um problema ao buscar os metadados do Magnatune" #: podcasts/itunessearchpage.cpp:76 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:56 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:389 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:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 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:187 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:174 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:151 msgid "Third level" msgstr "Terceiro nível" #: internet/jamendoservice.cpp:171 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/magnatunedownloaddialog.cpp:175 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_deviceproperties.h:381 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:375 msgid "This device supports the following file formats:" msgstr "Este dispositivo suporta os seguintes formatos de arquivo:" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Este dispositivo não funcionará corretamente" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Essa opção pode ser alterada nas preferências de \"Comportamento\"" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "Este canal é apenas para assinantes" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "Este tipo de dispositivo não é suportado: %1" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "Tempo limite" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Tí­tulo" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "Para iniciar a Rádio Grooveshark, você deve primeiro ouvir algumas outras músicas Grooveshark" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "Hoje" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "Ativar/desativar Pretty OSD" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Ativar/desativar tela cheia" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "Mudar status da fila" #: ../bin/src/ui_mainwindow.h:718 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:143 msgid "Tomorrow" msgstr "Amanhã" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "Muitos redirecionamentos" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "Faixas Top." #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "Total de albuns:" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "Total de bytes transferido" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "Total de requisições de rede feitas" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Faixa" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "Converter Música" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "Log do conversor" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "Conversão" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Convertendo %1 arquivos usando %2 núcleos" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "Opção de conversão" #: core/song.cpp:338 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "Turbina" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "Desligar" #: devices/giolister.cpp:161 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "Site(s)" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "Senha Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "Nome de usuário Ubuntu One" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "Banda ultralarga (UWB)" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Não foi possível baixar %1 (%2)" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Desconhecido" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "Tipo de conteúdo desconhecido" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Erro desconhecido" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "Capa não fixada" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "Desinscrever" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "Próximos shows" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "Atualizar lista de reprodução Grooveshark" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "Atualizar todos os podcasts" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "Atualizar pastas da biblioteca modificadas" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "Atualizar a biblioteca quando o Clementine iniciar" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "Atualizar este podcast" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "Atualizando" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Atualizando %1" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "Atualizando %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Atualizando biblioteca" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "Utilização" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "Usar tag artista-álbum quando disponível" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "Usar teclas de atalho do Gnome" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "Usar metadados Replay Gain, se estiver disponível" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "Usar SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "Usar Wiimote" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "Usar cores personalizadas" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "Usar uma mensagem personalizada para notificações" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "Usar um controle remoto de rede" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "Usar autenticação" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "Configurar taxa de bits" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "Usar modo dinâmico" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "Usar notificações para avisar o status do Wiimote" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "Usar padronização de ruídos temporais" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "Usar padrão do sistema" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "Usar cores do sistema" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "Usar configurações de proxy do sistema" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "Usar normalização de volume" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "Usado" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "Usuário %1 não tem uma conta Grooveshark Anywhere" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "Interface" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Nome de usuário" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "Usar o menu para adicionar uma música irá..." #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "MP3 com VBR" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "Taxa de bits variável" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "Vários artistas" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "Versão %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "Exibir" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "Modo de visualização" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "Visualizações" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "Configurações de visualização" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "Detecção de atividade de voz" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "Volume %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "Avisar-me quando fechar uma guia de lista de reprodução" #: core/song.cpp:337 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "Website" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "Semanas" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "Quando o Clementine iniciar" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "Quando a lista está vazia..." #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "Por que não tentar..." #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "Banda larga (WB)" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii Remote %1: ativado" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii Remote %1: conectado" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii Remote %1: bateria crítica (%2%) " #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii Remote %1: desativado" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii Remote %1: desconectado" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Remote %1: bateria fraca (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "Áudio do Windows Media" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "Sem capas:" #: library/libraryview.cpp:530 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:2088 msgid "Would you like to run a full rescan right now?" msgstr "Gostaria de realizar um reescaneamento completo agora?" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "Escrever todas as estatísticas de músicas em arquivos de canções" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "Nome de usuário ou senha incorreta." #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "Ano" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "Ano - Álbum" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "Anos" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "Ontem" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "Você fará o download dos seguintes álbuns" #: playlist/playlistlistcontainer.cpp:311 #, 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:177 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:172 msgid "You are not signed in." msgstr "Você não está logado." #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "Você está logado como %1." #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "Você está logado." #: ../bin/src/ui_groupbydialog.h:123 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/digitallyimportedsettingspage.cpp:46 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/magnatunesettingspage.cpp:53 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:57 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." #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "Você pode obter os nomes das faixas de graça, mas apenas assinantes podem ouvir rádio da Last.fm do Clementine." #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "Você não tem uma conta Grooveshark Anywhere." #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Você não tem uma conta Spotify Premium." #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "Você não possui um cadastro ativo." #: internet/spotifyservice.cpp:170 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/spotifysettingspage.cpp:158 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:87 msgid "You love this track" msgstr "Você curtiu essa faixa" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "Você precisa acessar as Preferências de Sistema e habilitar a opção \"Ativar acesso para dispositivos assistivos\" para utilizar os atalhos globais no Clementine." #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "Você precisará reiniciar o Clementine se mudar o idioma." #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "Você não poderá escutar a rádio Last.fm se você não for um assinante Last.fm" #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "Seu endereço de IP:" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Suas credencias do Last.fm estavam incorretas" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "Suas credenciais do Magnatune estão incorretas" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "Sua biblioteca está vazia!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "Seus canais de rádio" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "Seus scrobbles: %1" #: visualisations/visualisationcontainer.cpp:152 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/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "Usuário e/ou senha inválidos" #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Zero" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "Adicionar %n músicas" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "após" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "atrás" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "e" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "automático" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "antes" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "entre" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "maiores primeiro" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "contém" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "desabilitado" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "disco %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "não contém" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "termina com" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "iguais" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "gpodder.net" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "Diretório gpodder.net" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "maior que" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "nos últimos" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "menor que" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "mais longas primeiro" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "mover %n músicas" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "mais novas primeiro" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "não equivale" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "não no final" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "desligado" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "mais antigas primeiro" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "ligado" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "opções" #: ../bin/src/ui_networkremotesettingspage.h:203 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:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "Remover %n músicas" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "mais curtas primeiro" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "músicas aleatórias" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "menores primeiro" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "Classificação das músicas" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "começa com" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "parar" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "faixa %1" clementine-1.2.0+dfsg/src/translations/ro.po000066400000000000000000004273641223327513400210660ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # arnaudbienner , 2011 # AzuraMeta , 2011 # whycaxtsr , 2013 # FIRST AUTHOR , 2010 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:07+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Romanian (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr "kbps" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr "ms" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr "pct" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " secunde" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " melodii" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 albume" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 zile" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 zile în urmă" #: podcasts/gpoddersync.cpp:79 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 liste de redare (%2)" #: playlist/playlistmanager.cpp:413 #, qt-format msgid "%1 selected of" msgstr "%1 selectat din" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 melodie" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 melodii" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 melodii găsite" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 melodii găsite (se afișează %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 melodii" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 transferat" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: modul Wiimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n eșuat" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n finalizat" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "&Personalizat" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "&Extra" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "&Ajutor" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "Ascunde %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "&Ascunde..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "La &stânga" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "&Muzică" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Nespecificat" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "&Listă de redare" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Ieși" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "Mod repetitiv" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "La &dreapta" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "Mod &aleator" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "&Îngustează coloanele pentru a se potrivi în fereastră" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "&Unelte" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(diferit în cadrul mai multor melodii)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "...și tuturor contribuitorilor Amarok" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 zi" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 melodie" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 de melodii aleatoare" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "Upgradează la Premium acum" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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 începe cu%, de exemplu:% artist %album %titlu \n\n

Dacă încadrați secțiuni de text care conțin un jeton cu bucle-acolade, această secţiune va fi ascunsă dacă jetonul este gol." #: internet/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "Este necesar un cont Grooveshark Anywhere." #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "Este necesar un cont Spotify Premium." #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:78 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 biblioteca ta. Există diferite tipuri de liste de redare inteligente care oferă moduri diferite de selectare melodii." #: smartplaylists/querywizardplugin.cpp:153 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:297 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "GLORIE HYPNOTOADULUI" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "Despre %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "Despre Clementine..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "Despre Qt..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Detalii cont" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "Detalii cont (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Acțiune" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Activează/dezactivează telecomanda Wii" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Adaugă flux" #: ../bin/src/ui_notificationssettingspage.h:425 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:193 msgid "Add action" msgstr "Adaugă o acțiune" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Adaugă alt flux..." #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Adaugă dosar..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "Adaugă fisier" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Adaugă fișier..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Adaugă fișiere pentru transcodat" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Adaugă dosar" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Adăugă dosar..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Adaugă un dosar nou..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Adaugă termen de căutare" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "Adaugă tagul de album al melodiei" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "Adaugă tagul album de artist al melodiei" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "Adaugă tagul de artist al melodiei" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "Adaugă tagul de compozitor al melodiei" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "Adaugă tagul de disc al melodiei" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "Adaugă tagul de gen al melodiei" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "Adaugă tagul de lungime al melodiei" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "Adaugă numărul de ascultări al melodiei" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "Adaugă de câte ori am sărit peste melodie" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "Adaugă tagul de titlu al melodiei" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "Adaugă tagul de pistă al melodiei" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "Adaugă tagul de an al melodiei" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Adaugă flux..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "Adaugă la favoritele Grooveshark" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "Adaugă la listele de redare Grooveshark" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "Adaugă la altă listă de redare" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Adaugă în lista de redare" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "Adaugă la coadă" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Adaugă o acțiune pentru wiimotedev" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Adaugă..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Adăugat luna aceasta" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Adăugat săptămâna aceasta" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Adăugat anul acesta" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Adăugat azi" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Adăugat în ultimele trei luni" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "Adăugare melodie la favorite" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Grupare avansată..." #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "După copiere..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Album (volum ideal pentru toate piesele)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Artistul albumului" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Informații despre album de la jamendo.com..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Albume cu coperți" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Albume fără coperți" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Toate fișierele (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "Glorie Hypnotoadului!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Toate albumele" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Toți artiștii" #: ui/albumcoverchoicecontroller.cpp:47 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:74 msgid "All the translators" msgstr "Toți traducătorii" #: library/library.cpp:84 msgid "All tracks" msgstr "Toate melodiile" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "Permite codarea mijloc/părți" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "Lângă originale" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Ascunde întotdeauna fereastra principală" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Arată întotdeauna fereastra principală" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "Începe redarea întotdeauna" #: internet/spotifyblobdownloader.cpp:60 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "Este necesara activarea unui plugin pentru utlizarea Spotify in Clementine. Doriți să fie descărcat si instalat acum?" #: devices/gpodloader.cpp:61 msgid "An error occurred loading the iTunes database" msgstr "A apărut o eroare la încărcarea bazei de date iTunes" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "A apărut o eroare la scrierea metadata '%1'" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:78 msgid "And:" msgstr "Și:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Aspect" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Adaugă fișiere/URL-uri în lista de redare" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "Adaugă în lista de redare curentă" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "Adaugă în lista de redare" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "Alicați compresia pentru a preveni tăierea" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Sigur doriți să ștergeți presetarea \"%1\"?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "Sigur doriți să ștergeți această listă de redare?" #: ui/edittagdialog.cpp:769 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:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Artist" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Info artist" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "Radioul artistului" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "Etichetele artistului" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "Inițiala artistului" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Format audio" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Autentificarea a eșuat" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "" #: ui/about.cpp:65 msgid "Authors" msgstr "Autori" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Auto" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Încărcare automată" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "Deschide automat categorii singure din bibliotecă" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "Disponibil" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "Rată de biți medie" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "Dimensiunea medie a imaginii" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "Fluxuri de fundal" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Culoare de fundal" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Opacitatea fundalului" #: core/database.cpp:734 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Blochează" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "Analizator cu bare" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Albastru de bază" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Comportament" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "Optim" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "Biografie de la %1" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Rată de biți" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "Rată de biți" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "Analizator cu blocuri" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "Tip bloc" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "Corp" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "Analizator cu brațe" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Navighează..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Butoane" #: core/song.cpp:339 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "CUE placa suport" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "Anulare" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Schimbă imaginea coperții" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Schimbă dimensiunea fontului..." #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "Schimba modul repetiție" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Schimbă scurtătura..." #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "Schimbă modul amestecare" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Schimbă limba" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Verifică după actualizări..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "Alegeți un nume pentru lista de redare inteligentă" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Alege automat" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Alege culoarea..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "Alege font..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Alegeți din listă" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Alegeți cum va fi sortată lista de redare și câte melodii va conține." #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:188 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:115 msgid "Classical" msgstr "Clasică" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Golește" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Golește lista de redare" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Eroare Clementine" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Portocaliu Clementine" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Vizualizare Clementine" #: ../bin/src/ui_deviceproperties.h:376 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 copiata la acest dispozitiv într-un format pe care îl poate juca." #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "Clementine poate afișa un mesaj când se schimbă melodia." #: ../bin/src/ui_podcastsettingspage.h:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine nu a putut încărca nici un projectM vizualizări. Verificaţi dacă aţi instalat corect Clementine." #: internet/lastfmsettingspage.cpp:110 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 "Clementine nu a putut verifica statusul abonamentului tău pentru că sunt probleme cu conexiunea ta. Melodiile ascultate vor fi salvate și trimise la Last.fm mai târziu." #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Vizualizator de imagini Clementine" #: ../bin/src/ui_trackselectiondialog.h:206 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:210 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Clic aici pentru a adăuga niște muzică" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "Click aici pentru a comuta între timpul rămas şi durata totală" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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 "Închidere" #: playlist/playlisttabbar.cpp:54 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "Închide vizualizarea" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "Închiderea acestei ferestre va anula descărcarea." #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "Se va opri căutarea pentru coperti de albume la închiderea acestei ferestre." #: ui/equalizer.cpp:116 msgid "Club" msgstr "Club" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Listă separată prin virgulă de clasă:nivel, nivel este 0-3" #: playlist/playlist.cpp:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Comentariu" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "Completează etichetele automat" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "Taguri complete în mod automat ..." #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Compozitor" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "" #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "Configureză Grooveshark ..." #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Configurează Last.fm..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "Configurează Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Configurează scurtături" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "Configurare Spotify..." #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "Configurează biblioteca..." #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "" #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "Configurează..." #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "Conectează telecomenzile Wii folosind active / acţiune deactive" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "Conectează un dispozitiv" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "Se conectează la Spotify" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "Rată de biți constantă" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "Convertește toată muzica" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "Convertește muzica pe care nu o poate reda dispozitivul" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "Copiază în clipboard" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Copiază pe dispozitiv..." #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Copiază în bibliotecă..." #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:64 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Nu este posibilă crearea elementului GStreamer \"%1\" - asiguraţi-vă că aveţi toate plugin-urile necesare GStreamer instalat" #: transcoder/transcoder.cpp:432 #, 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 muxer de %1, verifică dacă ai instalat plugin-uri corecte GStreamer" #: transcoder/transcoder.cpp:426 #, 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 encoder pentru %1, verifică dacă ai instalat plugin-uri corecte GStreamer" #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "Nu s-a putut încărca postul de radio last.fm" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "Nu s-a putut deschide fișierul de ieșire %1" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Gestionar de coperți" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "Coperta din imagine încorporată" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Coperta încarcată de la %1" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "Deselectează manual coperta" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "Coperta nu este stabilită" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "Copertă stabilită de la %1" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "Coperte din %1" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "Creează o nouă listă de redare Grooveshark" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "Cross-fade la schimbarea automată a pieselor" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "Cross-fade la schimbarea manuală a pieselor" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "Personalizat" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "Setări mesaj personalizat" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "Radio personalizat" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Personalizat..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "DBus path" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Dance" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Data creării" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Data modificării" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "Zile" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "&Implicit" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "Reduce volumul cu 4%" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Redu volumul" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "Implicite" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "Întârziere între vizualizări" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "Șterge listă de redare Grooveshark" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Șterge fișiere" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Șterge de pe dispozitiv..." #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Șterge de pe disc..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "Șterge preconfigurarea" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "Șterge lista de redare inteligentă" #: ../bin/src/ui_organisedialog.h:194 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:1363 msgid "Dequeue selected tracks" msgstr "Elimină melodiile selectate din coadă" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "Elimină melodie din coadă" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Destinaţie" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Detalii..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Dispozitiv" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Proprietățile dispozitivului" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Numele dispozitivului" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Dispozitiv de proprietăți..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Dispozitive" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Aţi vrut să spuneți" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "Parolă Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "Nume de utilizator Digitally Imported" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "Conexiune directă la Internet" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Dosar" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "Dezactivează durată" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Dezactivat" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Disc" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "Transmisie discontinuă" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "Afișează opțiunile" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "Efectuează o scanare completa la librăriei" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "Nu converti muzică" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Nu repeta" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "Nu arăta în artiști diferiți" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "Nu amesteca" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "Nu opri!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Dublu clic pentru a deschide" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "Dublu clic pe o melodie va..." #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "Descarcă dosarul" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "Descarcă apartenență" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Descarcă acest album" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Descarcă acest album..." #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "Descărcare..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "Descărcare dosarul Icecast" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "Descărcare catalog Jamendo" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "Descărcare catalog Magnatune" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "Se descarcă pluginul Spotify" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "Descărcare metadata" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "Trage pentru a repoziționa" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "Modul dinamic este pornit" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "Mix aleator dinamic" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "Editare listă de redare inteligentă..." #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Modifică etichetă \"%1\"..." #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "Modifică etichetă..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "Modifica etichete" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Modifică informații melodie" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "Modifică informații melodie..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Modifică informații melodii..." #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Modifică..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "Activare Wii Remote support" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "Activare egalizator" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "Activează comenzi rapide numai atunci când clementine este focalizat" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "Efectuează o scanare completă a bibliotecii" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "Complexitate codare" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "Calitate motor de codare" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "Mod codare" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "Introduce un URL pentru a descărca de pe internet:" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "Introduce un nume nou pentru această listă de redare" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Introduce un artist or tag pentru a demara ascultarea la Last.fm radio." #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "Introduceți aici termenii de căutat" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "Introduceți URL-ul unui flux radio de pe internet:" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "Toată colecția" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Eroare" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Eroare conectare dispozitiv MTP" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "Eroare copiere melodii" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "Eroare ștergere melodii" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "Eroare la descărcarea pluginului Spotify" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "Eroare încărcare %1" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Eroare la încărcarea liste de redare last.fm" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "Eroare procesare %1: %2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "Eroare la încărcarea CD-ului audio" #: library/library.cpp:63 msgid "Ever played" msgstr "Redate vreodată" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Excepție între melodiile de pe același album sau în aceeași filă CUE" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "Extinde" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "Expiră pe %1" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "Fade out la oprirea unei piese" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "Durată fade" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "Rapidă" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "Favorite" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "Melodii favorite" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "Obține copertele lipsă" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "Obține automat" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "Descărcare completă" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Eroare la obținerea coperții de album" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "Extensie fișier" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "Formate de fișier" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Nume fișier" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "Nume fișier (fără cale)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Dimensiune fișier" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Tip fișier" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Nume de fișier" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Fișiere" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "Fișiere pentru transcodare" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "Căutați melodii în biblioteca dvs. care se potrivesc cu criteriile pe care le specificaţi." #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "Amprentare melodie" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "Sfârșit" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "Primul nivel" #: core/song.cpp:328 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Dimensiunea fontului" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Din motive de licență, suportul pentru Spotify este într-un plugin separat." #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "Forțează codarea mono" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "Omite dispozitivul" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Formular" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "Format" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Rată de cadre" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Prieteni" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Bass complet" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "Bas complet" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "Note înalte complete" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "Motor audio GStreamer" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Setări generale" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Gen" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "Obținere melodii populare Grooveshark" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "Se preiau canalele" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "Obținere fluxuri" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "Dați-i un nume:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "Mergi la fila listei de redare următoare" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "Mergi la fila listei de redare precedente" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "Colorează în gri melodiile inexistente în listele de redare" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "Eroare la logarea in Grooveshark" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "Radio Grooveshark" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "URL-ul melodiei Grooveshark" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "Grupează Bibliotecă după..." #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "Grupează după" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "Grupează după album" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "Grupează după artist" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "Grupează după artist/album" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "Grupează după artist/an - album" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "Grupează după gen/album" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "Grupează după gen/artist/album" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "Proxy HTTP" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "Informații hardware" #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "Informațiile hardware sunt disponibile numai în timp ce dispozitivul este conectat." #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "Ridicată" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "Înalt (%1 fps)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "Înalt (1024x1024)" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "Ore" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "Nu am un cont Magnatune" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Iconiță" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "Iconițe în partea de sus" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "Identificare melodie" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 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 și melodiile copiate ale acestuia nu pot lucra." #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "Ignoră \"The\" in numele artistilor" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Imagini (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "În modul dinamic, melodii noi vor fi alese și adăugate la lista de redare de fiecare dată când se termină o melodie." #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "Inbox" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "Includeți album de artă în notificare" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "Includeți toate melodiile" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "Crește volumul cu 4%" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Crește volumul" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "Informații" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "Introduce..." #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Instalat" #: core/database.cpp:673 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "Cheie API invalidă" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Format invalid" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "Metodă invalidă" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "Parametri invalizi" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "Resursă specificată este nevalidă" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "Serviciu invalid" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "Cheie de sesiune invalidă" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "Nume de utilizator și/sau parolă incorect(e)" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "Cele mai ascultate melodii Jamendo" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "Melodii de top Jamendo" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "Jamendo melodii de top ale lunii" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "Jamedo melodii de top ale săptămănii" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "Jamendo bază de date" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "Salt la melodia în curs de redare" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Mențineți butoanele pentru %1 secundă..." #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Păstrează butoane pentru %1 seconde..." #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "Mențineți rularea în fundal atunci când fereastra este închisă" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "Mențineți fișierele originale" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "Pisoi" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Limbă" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "Laptop/Căști" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Sală mare" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "Copertă de album mare" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "Bară laterală mare" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "Ultimele redate" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "Radio Last.fm personalizat: %1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Bibliotecă Last.fm - %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "Radio Last.fm mix - %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Radio vecin Last.fm - %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Post de radio Last.fm - %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Artiști Last.fm similari cu %1" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Radio Last.fm etichetat: %1" #: internet/lastfmservice.cpp:437 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:154 msgid "Last.fm password" msgstr "Parolă Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "Număr de redări Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Etichete Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Nume utilizator Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Wiki Last.fm" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "Melodiile cel mai puțin preferate" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "Lăsați necompletat pentru implicit. Exemple: \"/ dev /dsp\", \"front\", etc." #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Durată" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Bibliotecă" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "Grupare avansată bibliotecă" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "Căutare bibliotecă" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Limite" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "" #: ui/equalizer.cpp:123 msgid "Live" msgstr "În direct" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Încărcare" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "Încarcă copertă de la URL" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "Încarcă copertă de la URL..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "Încarcă copertă de pe disc" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "Încarcă coperta pentru disc..." #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "Încarcă listă de redare" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "Încarcă listă de redare..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Se încarcă radio Last.fm" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Încarcare dispozitiv MTP" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "Încărcare bază de date iPod" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "Încărcare listă de redare inteligentă" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "Încărcare melodii" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "Se încarcă fluxul" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "Încărcare melodii" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "Încărcare info melodii" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "Încărcare..." #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "Încarcă fișiere/URL-uri, înlocuind lista de redare curentă" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Logare" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "Profil de predicție pe termen lung (LTP)" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "Iubește" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Scăzut (%1 fps)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "Profil de complexitate redusă (LC)" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "Versuri" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "Versuri de pe %1" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Descărcare Magnatune" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Descărcarea Magnatune completă" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "Profil principal (MAIN)" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "Configurare proxy manuală" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "Producător" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "Caută toți termenii (ȘI)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "Caută unul sau mai mulți termeni (SAU)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "Rata de biți maximă" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "Mediu (%1 fps)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "Mediu (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "Rata de biți minimă" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "Model" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "Monitorizează biblioteca pentru schimbări" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "Luni" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "" #: library/library.cpp:74 msgid "Most played" msgstr "Redate cel mai mult" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "Punct de montură" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "Puncte de montură" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "Mută in jos" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "Mută în bibliotecă..." #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "Mută in sus" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Biblioteca audio" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "Mut" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "Biblioteca mea Last.fm" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "Vecinătatea mea Last.fm" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "Recomandările mele Last.fm" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "Vecinătatea mea" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "Postul meu de radio" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "Recomandările mele" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Nume" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "Opțiuni de numire" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "Bandă îngustă (NB)" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "Vecini" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "Rețea" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "Proxy de Rețea" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "Niciodată" #: library/library.cpp:67 msgid "Never played" msgstr "Niciodată redate" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "Nu începe redarea niciodată" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "Listă de redare nouă" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "Listă de redare inteligentă nouă..." #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "Melodii noi" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "Melodii noi vor fi adăugate automat." #: library/library.cpp:80 msgid "Newest tracks" msgstr "Cele mai noi melodii" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "Următoarea" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Melodia următoare" #: core/utilities.cpp:147 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "Niciun analizator" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "Fără blocuri lungi" #: playlist/playlistcontainer.cpp:366 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "Fără blocuri scurte" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "Niciunul" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "Tip normal de bloc" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "Indisponibil în timpul folosirii unei liste de redare dinamice" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "Neconectat" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "Nu este destul conținut" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "Nu sunt destui fani" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "Nu sunt destui membri" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "Nu sunt destui vecini" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Neinstalat" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "Tipul notificării" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Notificări" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Ascultă Acum" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "Previzualizare OSD" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 msgid "Only allow connections from the local network" msgstr "" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Arată numai primele" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "Opacity" msgstr "" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "Deschide %1 in browser" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "Deschide CD &audio..." #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "Deschide dispozitiv" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "Deschide fișier..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "Deschide în listă de redare nouă" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Deschide..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "Operația a eșuat" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "Optimizează pentru rată de biți" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "Optimizează pentru calitate" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "Opțiuni..." #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "Organizează Fișiere" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "Organizează fișiere..." #: core/organise.cpp:65 msgid "Organising files" msgstr "Organizare fișiere" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "Taguri originale" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Alte opțiuni" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "Opțiuni ieșire" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "Suprascrie fișierele existente" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "Procesare catalog Jamendo" #: ui/equalizer.cpp:124 msgid "Party" msgstr "Petrecere" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "Parolă" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Pauză" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "Întrerupe redarea" #: widgets/osd.cpp:156 msgid "Paused" msgstr "În pauză" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "Bară laterală simplă" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Redă" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "Ascultă Artist sau Tag" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "Ascultă radio artist..." #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "Număr ascultări" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "" #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "Redă dacă este oprit, întrerupe dacă se redă" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "Redă numai dacă nu se redă deja ceva" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "Ascultă radio tag..." #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "Redă melodia a a din lista de redare" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "Rulează/Pauză" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Redare" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Opțiuni player" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "Listă de redare" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "Listă de redare terminată" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "Opțiuni listă de redare" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "Tipul listei de redare" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "Liste de redare" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "Status plugin:" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Pop" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "Melodii populare" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "Melodiile populare ale lunii" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "Melodii populare azi" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "Durata afișării" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "Port" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "Preamplificare" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "Preferinţe" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "Preferinţe..." #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "Nume preferate pentru fișierele coperți (separate prin virgulă)" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "Format audio preferat" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "Rată de biți preferată" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "Format preferat" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "Tip audio Premium" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "Presetare:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "Apasă o combinație de butoane pentru a folosi la" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "Apasă o tastă" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Apasă o combinație de taste pentru a folosi la %1..." #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "Opțiuni OSD drăguț" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "Previzualizare" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "Precedenta" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "Melodia precedentă" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Tipărește informații versiune" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "Profil" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "Progres" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 msgid "Push Wiiremote button" msgstr "Apasă buton Wiimote" #: ../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:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "Calitate" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "Interoghez dispozitiv..." #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "Gestionar de listă" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "Adaugă în coadă melodiile selectate" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "Adaugă în coadă melodia" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "Radiouri" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "Ploaie" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "Vizualizare aleatorie" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "Reîncarcă canalele" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Reggae" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "Ține minte de data trecută" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Elimină" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "Șterge folder" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "Scoate din favorite" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "Elimină din lista de redare" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "Redenumește listă de redare" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "Redenumește listă de redare..." #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Repetă" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "Repetă albumul" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "Repetă lista" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "Repetă melodia" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Înlocuiește lista de redare curentă" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "Înlocuiește lista de redare" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "Repopulează" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "Resetare" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" msgstr "Resetează numărul de ascultări" #: 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:206 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "Obținere melodii favorite Grooveshark" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "Proxy SOCKS" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "Rată de eșantionare" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "Salvează imagine" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "Salvează listă de redare" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "Salvează listă de redare..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "Salvează presetări" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "Salvează fluxul in fila Internet" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "Scor" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "Căutare" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "Caută în posturile Icecast" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "Caută în Jamendo" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Caută în Magnatune" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "Caută coperți pentru album..." #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "Caută orice" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "Modul căutării" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "Opțiuni căutare" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "Termeni de căutat" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "Al doilea nivel" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "Selectează Tot" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "Selectează vizualizări" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "Selectează vizualizări..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "Serviciu offline" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Scurtătură" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "Scurtătură pentru %1" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Scurtătură pentru %1 există deja" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Arată" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "Arată OSD" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "Arată o notificare de desktop nativă" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Arată o notificare când schimb modul de repetare/amestecare" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "Arată o notificare când schimb volumul" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "Arată o notificare din zona de notificări" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "Arată un OSD drăguț" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:460 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:209 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "Arată separatori" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "" #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "Arată în browser-ul de fișiere..." #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "Arată în artiști diferiți" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "Arată numai duplicatele" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "Arată numai fără taguri" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "Arată pictogramă în tava de sistem" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "Arată/Ascunde" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Amestecă" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "Amestecă albume" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "Amestecă tot" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "Amestecă lista de melodii" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "Amestecă melodiile din acest album" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "Artiști similari" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "Sare în listă înapoi" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "Sare în listă înainte" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "Imagine album mică" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "Bară laterală mică" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "Listă de redare inteligentă" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "Liste de redare inteligente" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "Informații melodie" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "Info melodie" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "Ne pare rău" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "Sortează după gen (alfabetic)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "Sortează după gen (după popularitate)" #: ../bin/src/ui_icecastfilterwidget.h:77 msgid "Sort by station name" msgstr "Sortează după numele stației" #: ../bin/src/ui_querysortpage.h:139 msgid "Sort songs by" msgstr "Sortează melodii după" #: ../bin/src/ui_querysortpage.h:137 msgid "Sorting" msgstr "Sortare" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "Surse" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "Eroare la logarea în Spotify" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "Plugin Spotify" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "Pluginul Spotify nu este instalat" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "Standard" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "Cu steluță" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "Începe transcodare" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "Pornire %1" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "Pornire..." #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "Posturi" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Oprește" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "Oprește după" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "Oprește după pista aceasta" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Oprește redarea" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "Oprește rularea după melodia curentă" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "Oprit" #: core/song.cpp:341 msgid "Stream" msgstr "Flux" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "Taguri sugerate" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "Sumar" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "Formate acceptate" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "File deasupra" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Tag" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "Rată de biți țintă" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "Opțiuni text" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Mulțumiri" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "Dosarul %1 nu este valid" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "" #: smartplaylists/searchtermwidget.cpp:330 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 "Site-ul pe care l-ați solicitat nu există!" #: ui/coverfromurldialog.cpp:82 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:56 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:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:174 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:151 msgid "Third level" msgstr "Al treilea nivel" #: internet/jamendoservice.cpp:171 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "Acest album nu este valabil în formatul cerut" #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Acest dispozitiv nu va funcționa corespunzător" #: devices/devicemanager.cpp:567 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 "Acesta este un iPod, dar ați compilat Clementine fără suport libgpod." #: devices/devicemanager.cpp:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Titlu" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "Pentru a putea porni radioul Grooveshark, ar trebui mai întâi să mai ascultați câteva melodii Grooveshark" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "Astăzi" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Pistă" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "Transcodează Muzică" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "Logul Transcoderului" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "Transcodare" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "" #: core/song.cpp:338 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "Oprește" #: devices/giolister.cpp:161 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "URL(-uri)" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Necunoscut" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Eroare necunoscută" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "Actualizează foldere schimbate din bibliotecă" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "Actualizează librăria când pornește Clementine" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Actualizare %1" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "Actualizare %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Se actualizează biblioteca" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "Utilizare" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "Folosește Telecomandă Wii" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "Folosește instrumentul de gestionare a rate de biți" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "Folosește modul dinamic" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "Folosește setările de proxy ale sistemului" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "Interfață utilizator " #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Nume de utilizator" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "Folosirea meniului pentru a adăuga o melodie va..." #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "MP3 VBR" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "Rată de biți variabilă" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "Artiști diferiți" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "Versiunea %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "Vizualizare" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "Vizualizări" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "Setări vizualizări" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "Volum %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "Săptămâni" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "Când pornește Clementine" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "An" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "An - Album" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "Ani" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "Ieri" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitallyimportedsettingspage.cpp:46 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 mai bună fără reclame." #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "" #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "" #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Nu aveți un cont Spotify Premium." #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "Vei fi nevoit să restartezi Clementine dacă schimbi limba." #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "Biblioteca este goală!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "Fluxurile dumneavoastră radio" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "Parola sau numele de utilizator au fost incorecte." #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Zero" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "adaugă %n melodii" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "după" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "în urmă" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "și" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "automat" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "inainte" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "între" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "conține" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "dezactivat" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "disc %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "nu conține" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "se termină cu" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "mai mare decât" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "întâi cele mai noi" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "opțiuni" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "apasă enter" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "elimină %n melodii" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "cele mai scurte primele" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "cele mai mici primele" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "începând cu" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "oprește" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "pista %1" clementine-1.2.0+dfsg/src/translations/ru.po000066400000000000000000005551131223327513400210660ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Andrey Alekseenko , 2012 # Alexander <>, 2012 # Alexander Vysotskiy , 2012 # Andy Dufrane <>, 2012 # arnaudbienner , 2011 # drmx , 2013 # Just a baka , 2013 # Just a baka , 2012 # Валерий Третьяк , 2012 # SvetlanaK , 2011 # Brodyaga20 , 2012 # DmitryKX , 2013 # Alexander Vysotskiy , 2012 # Nikita Putko , 2011 # Nikolay Parukhin , 2013 # Oleg Sevostyanov , 2011 # serg0 , 2013 # KazimirSpontaliku , 2012 # Stanislav Hanzhin , 2012 # Vyacheslav Blinov , 2012 # Владимир Пахомчик , 2012 # splitfire , 2013 # Павел Малеев , 2010 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-09-08 09:06+0000\n" "Last-Translator: DmitryKX \n" "Language-Team: Russian (http://www.transifex.com/projects/p/clementine/language/ru/)\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ru\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: playlist/playlistlistview.cpp:39 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:246 msgid " days" msgstr "дней" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr "кбит/с" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " мс" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " пунктов" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr "с" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " композиции" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 альбом(ов)" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 дней" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 дней назад" #: podcasts/gpoddersync.cpp:79 #, 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:413 #, qt-format msgid "%1 selected of" msgstr "%1 выбрано из" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 композиция" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 композиций" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 композиций найдено" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 композиций найдено (показано %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 композиций" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 передано" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: модуль Wiimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n с ошибкой" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n завершено" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "&Другой" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "Дополнения" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "Помощь" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "Скрыть %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "Скрыть..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "По &левому краю" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "Музыка" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Нет" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "Список воспроизведения" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Выход" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "Режим повтора" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "По &правому краю" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "Случайное воспроизведение" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "Выровнять поля по размеру окна" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "Инструменты" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(различный через несколько композиций)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "...и всем создателям Amarok" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "0px" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 день" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 композиция" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "127.0.0.1" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "40%" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 случайных композиций" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "Обновить до версии Premium сейчас" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "Создать новую учетную запись или сбросить Ваш пароль" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "Требуется учётная запись Grooveshark Anywhere." #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "Требуется Premium аккаунт Spotify" #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "Клиент может подключиться, только если был введен правильный код." #: smartplaylists/wizard.cpp:78 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:153 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Композиция будет добавлена в список воспроизведения, если соответствует этим условиям." #: smartplaylists/searchterm.cpp:297 msgid "A-Z" msgstr "A-Z (А-Я)" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "AAC 128к" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC 64к" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "ВСЯ СЛАВА ГИПНОЖАБЕ!" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "Прервать" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "О «%1»" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "О программе Clementine..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "Информация о Qt..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Данные учётной записи" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "Данные учётной записи (версия Premium)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Действие" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Активировать/деактивировать Wiiremote" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "Добавить подкаст" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Добавить поток" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "Добавить новую строку, если поддерживается типом уведомления" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "Добавить действие" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Добавить другой поток…" #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Добавить каталог…" #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "Добавить файл" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "Добавить файл для перекодирования" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "Добавить файлы для перекодирования" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Добавить файл..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Добавить файлы для перекодирования" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Добавить папку" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Добавить папку…" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Добавить новую папку..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "Добавить подкаст" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "Добавить подкаст..." #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Добавить условие поиска" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "Добавить тег \"Альбом\"" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "Добавить тег \"Исполнитель альбома\"" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "Добавить тег \"Артист\"" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "Добавить автоподсчёт воспроизведений" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "Добавить тег \"Композитор\"" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "Добавить тег \"Диск\"" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "Добавить имя файла с композицией" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "Добавить тег \"Жанр\"" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "Добавить тег \"Группа\"" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "Добавить тег \"Время\"" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "Добавить тег \"Исполнитель\"" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "Добавить число воспроизведений" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "Добавить рейтинг" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "Добавить число пропусков" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "Добавить тег \"Название\"" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "Добавить тег \"Номер дорожки\"" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "Добавить тег \"Год\"" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Добавить поток..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "Добавить в избранное Grooveshark" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "Добавить в списки воспроизведения Grooveshark" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "Добавить в другой список воспроизведения" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Добавить в список воспроизведения" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "Добавить в очередь" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Добавить действие wiimotedev" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Добавить..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Добавлено за месяц" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Добавлено за неделю" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Добавлено за год" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Добавлено сегодня" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Добавлено за три месяца" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "Добавление композиции в Мою музыку" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "Добавление композиции в избранное" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Расширенная сортировка..." #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "После " #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "После копирования..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Альбом" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Альбом (идеальная громкость всех композиций)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Исполнитель альбома" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "Обложка альбома" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Информация об альбоме на jamendo.com…" #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Альбомы с обложками" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Альбомы без обложек" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Все файлы (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "Вся слава Гипножабе!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Все альбомы" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Все исполнители" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "Все файлы (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Все списки воспроизведения (%1)" #: ui/about.cpp:74 msgid "All the translators" msgstr "Все переводчики" #: library/library.cpp:84 msgid "All tracks" msgstr "Все композиции" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "Позволяет клиенту скачивать музыку с этого компьютера." #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "Разрешить загрузки" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "Разрешить mid/side кодирование" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "Вместе с оригиналами" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Всегда скрывать главное окно" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Всегда показывать главное окно" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "Всегда начинать воспроизведение" #: internet/spotifyblobdownloader.cpp:60 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:61 msgid "An error occurred loading the iTunes database" msgstr "Произошла ошибка при загрузке данных iTunes" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Ошибка при записи мета-данных в '%1'" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "Произошла неизвестная ошибка." #: ui/about.cpp:78 msgid "And:" msgstr "А также:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "Сердитое" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Внешний вид" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Добавить файлы/URLs в список воспроизведения" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "Добавить в текущий список воспроизведения" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "Добавить в список воспроизведения" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "Применить сжатие для предотвращения искажений" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Вы действительно хотите удалить настройку \"%1\"?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "Вы действительно хотите удалить список воспроизведения?" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "Вы действительно хотите сбросить статистику этой песни?" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Исполнитель" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Артист" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "Радио исполнителя" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "Теги испольнителя" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "Инициалы исполнителя" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Формат аудио" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Ошибка аутентификации" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "Автор" #: ui/about.cpp:65 msgid "Authors" msgstr "Авторы" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Авто" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Автоматическое обновление" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "Автоматически открывать одиночные категории в дереве коллекции" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "Доступно" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "Средний битрейт" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "Примерный размер изображения" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "Подкасты BBC" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "Фоновые звуки" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Цвет фона" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "Фоновое изображение" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Прозрачность фона" #: core/database.cpp:734 msgid "Backing up database" msgstr "Резервное копирование базы данных" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "Баланс" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Запретить" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "Анализатор полосами" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Стандартный голубой" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "Базовый тип аудио" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Поведение" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "Наилучший" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "Биография из %1" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Скорость передачи данных" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "Битрейт" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "Анализатор блоками" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "Тип блока" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "Степень размытости" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "Содержимое" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "Бум-анализатор" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Обзор..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "Продолжительность буфера" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "Буферизация" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "Эти источники отключены:" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Клавиши" #: core/song.cpp:339 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "Поддержка файлов разметки CUE" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "Отмена" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Выберите обложку" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Изменить размер шрифта…" #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "Изменить режим повторения" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Изменить комбинацию клавиш..." #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "Изменить режим перемешивания" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Сменить язык" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "Изменение настроек воспроизведения моно подействует со следующей композиции" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "Проверить новые выпуски" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Проверить обновления..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "Выберите название умного списка воспроизведения" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Выбирать автоматически" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Выбрать цвет..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "Выбрать шрифт..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Выбор из списка" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Настройка сортировки списка воспроизведения и количества песен в нём." #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "Выбрать каталог для загрузки подкастов" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Выберите сайты, которые Clementine будет использовать для поиска текстов песен." #: ui/equalizer.cpp:115 msgid "Classical" msgstr "Классический" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "Очистка" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Очистить" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Очистить список воспроизведения" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Ошибка Clementine" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Оранжевый Clementine" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Визуализация Clementine" #: ../bin/src/ui_deviceproperties.h:376 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "При копировании на устройство, Clementine может автоматически конвертировать музыку в формат, который оно поддерживает." #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine может проигрывать музыку, загруженную вами на Box" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine может воспроизводить музыку, которую вы загрузили в Dropbox" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine может проигрывать музыку с Диска Google" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "Clementine может воспроизводить музыку, которую вы загрузили в Ubuntu One" #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "Clementine может показывать сообщения при смене дорожки." #: ../bin/src/ui_podcastsettingspage.h:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine может синхронизировать выши подписки с другими компьютерами и приложениями. Создать аккаунтt." #: visualisations/projectmvisualisation.cpp:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine не может загрузить ни одну визуализацию projectM. Проверьте, что Clementine установлен правильно." #: internet/lastfmsettingspage.cpp:110 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 "Clementine не смог получить статус вашей подписки из-за проблем с соединением. Воспроизведённые треки будут кэшированы и отправлены на Last.fm позже." #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Просмотр изображений в Clementine" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "Clementine не смог найти результаты по запросу для этого файла" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "Clementine будет искать здесь:" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Щелкните здесь, чтобы добавить музыку" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "Нажмите для переключения между остающимся временем и полной длительностью" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "Закрыть список воспроизведения" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "Закрыть визуализацию" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "Закрытие этого окна отменит загрузку." #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "Закрытие этого окна остановит поиск обложек альбомов." #: ui/equalizer.cpp:116 msgid "Club" msgstr "Клубный" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Colors" msgstr "Цвета" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Разделенный запятыми список \"класс:уровень\", где уровень от 0 до 3" #: playlist/playlist.cpp:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Комментарий" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "Заполнить поля автоматически" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "Заполнить поля автоматически..." #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Композитор" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "Настроить %1 ..." #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "Настройка Grooveshark ..." #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Настройка Last.fm..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "Настройка Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Комбинации клавиш" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "Настройка Spotify..." #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "Настроить Subsonic..." #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "Настроить глобальный поиск..." #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "Настроить коллекцию..." #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "Настроить подкасты..." #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "Настроить..." #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "Подключить пульт Wii используя активацию/деактивацию" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "Подсоединение устройства" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "Подключение к Spotify" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "Соединение отвергнуто сервером, проверьте адрес сервера. Пример: http://localhost:4040/" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Превышено время ожидания при установке соединения, проверьте адрес сервера. Пример: http://localhost:4040/" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "Консоль" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "Постоянный битрейт" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "Конвертировать всю музыку" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "Конвертировать всю музыку, которую может проигрывать устройство." #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "Скопировать в буфер" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Копировать на устройство..." #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Копировать в коллекцию..." #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "Copyright" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Не удается подключиться к Subsonic, проверьте адрес сервера. Например, http://localhost:4040/" #: transcoder/transcoder.cpp:64 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Невозможно создать элемент GStreamer \"%1\" - убедитесь, что у вас установлены все необходимые дополнения GStreamer" #: transcoder/transcoder.cpp:432 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "Не возможно найти мультиплексор для %1. Убедитесь, что установлены необходимые модули GStreamer" #: transcoder/transcoder.cpp:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Невозможно найти кодировщик для %1, проверьте, что установлены все необходимые модули GStreamer" #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "Невозможно загрузить радиостанцию last.fm" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "Невозможно открыть выходной файл %1" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Менеджер обложек" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "Обложка из встроенного изображения" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Обложка загружена автоматически с %1" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "Обложка вручную отключена" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "Обложка не задана" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "Обложка задана из %1" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "Обложки из %1" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "Создать новый список воспроизведения Grooveshark" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "Перекрестное затухание при автоматической смене композиции" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "Перекрестное затухание при ручной смене композиции" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "Пользовательский" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "Собственное изображение:" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "Настройки сообщения" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "Пользовательское радио" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Пользовательский..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "DBus path" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Танцевальный" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Дата создания" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Дата изменения" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "день (дня, дней)" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "По &умолчанию" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "Уменьшить громкость на 4%" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "Уменьшить громкость на процентов" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Уменьшить громкость" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "Фоновое изображение по-умолчанию:" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "По умолчанию" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "Задержка между визуализациями" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "Удалить" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "Удалить список воспроизведения Grooveshark" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "Удалить загруженные данные" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Удалить файлы" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Удалить с устройства" #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Удалить с диска..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "Удаллить прослушанные выпуски" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "Удалить настройку" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "Удалить умный список воспроизведения" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "Удалить оригинальные файлы" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Удаление файлов" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "Убрать из очереди выбранные композиции" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "Убрать из очереди композицию" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Назначение" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Подробнее..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Носитель" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Свойства носителя" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Имя устройства" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Свойства носителя..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Носители" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Возможно, вы имели в виду" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "Пароль" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "Имя пользователя" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "Прямое соединение с Интернетом" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Каталог" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "Отключить продолжительность" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "Отключить создание индикатора настроения" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Отключено" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Диск" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "Непрерывная передача" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "Настройки отображения" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Показывать экранное уведомление" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "Заново сканировать музыкальную коллекцию" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "Не конвертировать какую-либо музыку" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "Не перезаписывать" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Не повторять" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "Не показывать в \"Разных исполнителях\"" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "Не перемешивать" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "Не останавливать!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "Пожертвования" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Двойной щелчок для открытия" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "Двойной щелчок на песне..." #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "Загрузить %n выпусков" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "Каталог загрузок" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "Загружать выпуски в" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "\"Download\" подписка" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "Загружать новые выпуски автоматически" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "Загрузка добавлена в очередь" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "Загрузить приложение для Android" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Загрузить этот альбом" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Загрузить этот альбом" #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "Загрузить этот выпуск" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "Загрузить..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "Загрузка (%1%)..." #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "Загружается директория Icecast" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "Загружается каталог Jamendo" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "Загружается каталог Magnatune" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "Загружается модуль Spotify" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "Загрузка метаданных" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "Тащите для перемещения" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "Dropbox" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "Динамический режим включён" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "Случайный динамичный микс" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "Изменить умный список воспроизведения…" #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Редактировать тег \"%1\"..." #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "Редактировать тег..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "Редактировать теги" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Изменение информации о композиции" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "Изменить информацию о композиции..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Изменить информацию о композициях..." #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Изменить..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "Включить поддержку пульта Wii" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "Включить эквалайзер" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "Включить комбинации клавиш только когда окно в фокусе" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Укажите источники, включаемые в результаты поиска. Результаты будут отображаться в этом порядке." #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "Включить/отключить скробблинг Last.fm" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "Сложность кодирования" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "Качество кодирования" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "Режим кодирования" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "Введите адрес" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "Введите ссылку для скачивания обложки из Интернета:" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "Введите имя файла для экспортируемых обложек (без расширения)" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "Введите новое имя для этого списка воспроизведения" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Введите исполнителя или тег чтобы слушать радио Last.fm." #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Введите условия поиска музыки на компьютере и в интернете" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Введите ключевые слова для поиска в iTunes Store" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Введите ключевые слова для поиска в gpodder.net" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "Введите критерии поиска" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "Введите адрес потока интернет-радио:" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "Введите имя папки" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "Введите этот IP-адрес в App для подключения к Clementine." #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "Вся коллекция" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Ошибка" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Ошибка подключения устройства MTP" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "Ошибка копирования композиций" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "Ошибка удаления композиций" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "Ошибка загрузки модуля Spotify" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "Ошибка загрузки %1" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Ошибка при загрузке списка воспроизведения di.fm" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "Ошибка при обработке %1: %2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "Ошибка при загрузке Аудио CD" #: library/library.cpp:63 msgid "Ever played" msgstr "Когда-либо проигранных" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "Каждые 10 минут" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "Каждые 12 часов" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "Каждые 2 часа" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "Каждые 20 минут" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "Каждые 30 минут" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "Каждые 6 часов" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "Каждый час" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Кроме треков с одного и того же альбома или CUE-файла" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "Существующие обложки" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "Развернуть" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "Истекает %1" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "Экспорт обложек" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "Экспорт обложек" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "Экспорт загруженных обложек" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "Экспорт встроенных обложек" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "Экспорт завершён" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "Экспортировано %1 обложек из %2 (%3 пропущено)" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "Затихание громкости при паузе / Нарастание громкости при продолжении воспроизведения" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "Приглушать звук при остановке воспроизведения" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "Затухание" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "Длительность затухания" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "Ошибка получения каталога" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "Ошибка получения подкастов" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "Ошибка загрузки подкаста" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "Ошибка разбора XML в данной RSS подписке" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "Быстро" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "Избранное" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "Любимые треки" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "Скачивать надостающие обложки" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "Скачивать автоматически" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "Загрузка завершена" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "Получение библиотеки Subsonic" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Ошибка поиска обложки" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "Расширение файла" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "Форматы файлов" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Имя файла" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "Имя файла (без указания пути)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Размер файла" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Тип файла" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Имя файла" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Файлы" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "Файлы для перекодирования" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "Поиск композиций в библиотеке по указанным критериям." #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "Дактилоскопирование песни" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "Готово" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "Первый уровень" #: core/song.cpp:328 msgid "Flac" msgstr "FLAC" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Размер шрифта" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "По лицензионным соображениям поддержка Spotify реализована в виде отдельного плагина" #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "Принудительное кодирование в моно" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "\"Забыть\" устройство" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Форма" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "Формат" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Частота кадров" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "Фреймов на буфер" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Друзья" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "Сдержанное" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Full Bass" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "Full Bass + Treble" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "Full Treble" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "Движок аудио GStreamer" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "Общие" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Общие настройки" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Жанр" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "Получить адрес этого списка воспроизведения в Grooveshark для публикции" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "Получить адрес композиции в Grooveshark для публикации" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "Получение популярных композиций из Grooveshark" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "Получение каналов" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "Получение потоков" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "Название:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "Перейти" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "Перейти к следующему списку воспроизведения" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "Перейти к предудыщему списку воспроизведения" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "Диск Google" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "Получено %1 обложек из %2 (%3 загрузить не удалось)" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "Отмечать серым не существующие песни в списках воспроизведения" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "Ошибка при входе на сервис Grooveshark" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "Адрес списка воспроизведения в Grooveshark" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "Радио Grooveshark" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "Адрес композиции на Grooveshark" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "Сгруппировать библиотеку по..." #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "Сгруппировать по" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "Группировать по альбомам" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "Группировать по исполнителям" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "Группировать по исполнителям/альбомам" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "Группировать по исполнителю/году — альбому" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "Группировать по жанру/альбому" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "Группировать по жанру/исполнителю/альбому" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "Группа" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "HTML-страница не содержит RSS-подписок" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "Код состояния HTTP 3xx получен без URL, проверьте настройку сервера." #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "HTTP-прокси" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "Счастливое" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "Информация об оборудовании" #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "Информация об оборудовании доступна только при подключении устройства." #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "Высокий" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "Высокий (%1 fps)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "Высокое (1024x1024)" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "Сервер не найден, проверьте адрес сервера. Пример: http://localhost:4040/" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "Часа(ов)" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "Гипножаба" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "У меня нет учётной записи Magnatune" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Значок" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "Значки сверху" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "Определение песни" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "При продолжении, устройство будет работать медленно и скопированные песни не будут работать." #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Если вы знаете адрес подкаста, введите его сюда и нажмите Перейти." #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "Игнорировать \"The\" в именах исполнителей" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Изображения (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "В течение %1 дней" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "В течение %1 недель" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "В динамическом режиме новые треки выбираются и добавляются в список воспроизведения каждый раз, когда заканчивается очередная песня." #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "Входящие" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "Показывать обложку альбома в уведомлении" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "Включить все песни" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Несовместимая версия протокола Subsonic REST. Требуется обновление клиента." #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Несовместимая версия протокола Subsonic REST. Требуется обновление сервера." #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Неполная конфигурация, пожалуйста, убедитесь, что все поля заполнены." #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "Увеличить громкость на 4%" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "Увеличить громкость на процентов" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Увеличить громкость" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "Индексация %1" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "Сведения" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "Вставить..." #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Установлено" #: core/database.cpp:673 msgid "Integrity check" msgstr "Проверка целостности" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Интернет" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "Интернет провайдеры" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "Неверный ключ API" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Неверный формат" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "Неверный метод" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "Неверные параметры" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "Указан неверный источник" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "Неверная служба" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "Неверный ключ сессии" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "Неверное имя пользователя и(или) пароль" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "Самые прослушиваемые треки на Jamendo" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "Самые популярные треки на Jamendo" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "Треки месяца на Jamendo" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "Треки недели на Jamendo" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "База данных Jamendo" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "Перейти к проигрываемой композиции" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Отображать кнопки в течении %1 секунд" #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Отображать кнопки в течении %1 секунд…" #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "Продолжить работу в фоновом режиме при закрытии окна" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "Сохранять оригинальные файлы" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "Котята" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Язык" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "Портативный компьютер/наушники" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Large Hall" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "Большая обложка альбома" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "Широкая боковая панель" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "Последнее прослушивание" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "Пользовательское радио Last.fm: %1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Коллекция Last.fm - %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "Радио Микс Last.fm - %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Радио соседей Last.fm - %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Радиостанция Last.fm - %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Исполнители Last.fm похожие на %1" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Радио Last.fm по тегу: %1" #: internet/lastfmservice.cpp:437 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm в данный момент занят, попробуйте через некоторое время" #: ../bin/src/ui_lastfmsettingspage.h:154 msgid "Last.fm password" msgstr "Пароль Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "Количество прослушиваний на Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Теги Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Имя пользователя Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Last.fm wiki страничка" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "Нелюбимые треки" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "Оставьте пустым для значения по-умолчанию. Например: \"/dev/dsp\", \"front\", и т.д." #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "Левый канал" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Длительность" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Фонотека" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "Расширенная сортировка коллекции" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "Уведомление о сканировании коллекции" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "Поиск по коллекции" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Ограничения" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "Слушать композиции на сервисе Grooveshark на основе ранее прослушанных" #: ui/equalizer.cpp:123 msgid "Live" msgstr "Live" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Загрузить" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "Загрузить обложку по ссылке" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "Загрузить обложку по ссылке..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "Загрузить обложку с диска" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "Загрузить обложку с диска..." #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "Загрузить список воспроизведения" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "Загрузить список воспроизведения..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Загрузка радио Last.fm" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Загрузка устройства MTP" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "Загрузка база данных iPod" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "Загрузка умного плейлиста" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "Загрузка песен" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "Загрузка потока" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "Загрузка композиций" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "Загрузка информации о композициях" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "Загрузка..." #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "Загрузка файлов или ссылок с заменой текущего списка воспроизведения" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Вход" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "Ошибка входа" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "Профиль Long term prediction (LTP)" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "Любимое" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Низкий (%1 fps)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "Низкое (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "Профиль низкой сложности (LC)" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "Текст песни" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "Текст песни с %1" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP3 256к" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Загрузка Magnatune" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Загрузка Magnatune окончена" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "Основной профиль (MAIN)" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "Да будет так!" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "Сделать плейлист доступным автономно" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "Неправильный ответ" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "Ручная настройка прокси" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "Вручную" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "Производитель" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "Пометить как прослушанное" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "Пометить как новое" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "Совпадает с каждым условием поиска (И)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "Совпадает с одним или несколькими условиями (ИЛИ)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "Максимальный битрейт" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "Средний (%1 fps)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "Среднее (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "Тип подписки" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "Минимальный битрейт" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "Предустановки projectM не найдены" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "Модель" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "Следить за изменениями коллекции" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "Воспроизведение моно" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "Месяцев" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "Настроение" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "Стиль индикаторов настроения" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "Индикаторы настроения" #: library/library.cpp:74 msgid "Most played" msgstr "Наиболее часто прослушиваемые композиции" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "Точка монтирования" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "Точки монтирования" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "Переместить вниз" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "Переместить в коллекцию..." #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "Переместить вверх" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "Музыка" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Музыкальная коллекция" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "Выключить звук" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "Моя фонотека Last.fm" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "Моё радио Last.fm " #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "Мои соседи по Last.fm" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "Мое радио рекомендаций на Last.fm" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "Радио Мой Микс" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "Моя музыка" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "Мои соседи" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "Моя радиостанция" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "Мои рекомендации" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Имя" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "Настройки названия" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "Узкая полоса пропускания (NB)" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "Соседи" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "Сеть" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "Сетевая прокси-служба" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "Сетевое дистанционное управление" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "Никогда" #: library/library.cpp:67 msgid "Never played" msgstr "Никогда не прослушивались" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "Никогда не начинать проигрывать" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "Новая папка" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "Новый список воспроизведения" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "Новый умный список воспроизведения…" #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "Новые композиции" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "Новые треки будут добавлены автоматически." #: library/library.cpp:80 msgid "Newest tracks" msgstr "Новейшие треки" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "Дальше" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Следующая композиция" #: core/utilities.cpp:147 msgid "Next week" msgstr "На следующей неделе" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "Без анализатора" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "Нет фонового изображения" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "Нет обложек для экспорта." #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "Без длинных блоков" #: playlist/playlistcontainer.cpp:366 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Совпадений не найдено. Очистите строку поиска, чтобы снова увидеть список воспроизведения." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "Без коротких блоков" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "Ничего" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "Ни одна из выбранных песен не будет скопирована на устройство" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "Нормальное" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "Нормальный тип блоков" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "Не доступны при использовании динамических списков воспроизведения" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "Не подключено" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "Недостаточно содержания" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "Недостаточно фанатов" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "Недостаточно участников" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "Недостаточно соседей" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Не установлено" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "Не выполнен вход" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "Не подключено — щелкните дважды для подключения" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "Тип уведомления" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Уведомления" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Сейчас проигрывается" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "Предпросмотр OSD" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "Прозрачность" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "Открыть «%1» в браузере" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "Открыть аудио-&диск..." #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "Открыть файл OPML" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "Открыть файл OPML ..." #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "Открыть устройство" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "Открыть файл..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "Открыть в Google Диск" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "Открыть в новом списке воспроизведения" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Открыть..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "Операция не удалась" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "Оптимизировать по битрейту" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "Оптимизировать по качеству" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "Настройки..." #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "Упорядочить файлы" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "Упорядочить файлы..." #: core/organise.cpp:65 msgid "Organising files" msgstr "Организация файлов" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "Исходные теги" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Другие настройки" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "Вывод" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "Устройство вывода" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "Настройки вывода" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "Плагин вывода" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "Перезаписать все" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "Перезаписать существующие файлы" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "Перезаписать только меньшие" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "Владелец" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "Анализ каталога Jamendo" #: ui/equalizer.cpp:124 msgid "Party" msgstr "Party" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "Пароль" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Приостановить" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "Приостановить воспроизведение" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Приостановлен" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "Исполнитель" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "Пиксель" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "Нормальная боковая панель" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Воспроизвести" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "Проиграть исполнителя или тег" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "Проиграть радио артиста..." #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "Количество проигрываний" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "Слушать пользовательское радио..." #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "Воспроизвести если остановлено, приостановить если воспроизводится" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "Проиграть, если еще ничего не проигрывается" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "Проиграть радио тега..." #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "Воспроизвести n-ную композицию в списке воспроизведения" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "Воспроизведение/Пауза" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Проигрывание" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Настройки проигрывателя" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "Список воспроизведения" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "Список воспроизведения закончился" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "Настройки списка воспроизведения" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "Тип списка воспроизведения" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "Списки воспроизведения" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "Закройте браузер и вернитесь в Clementine." #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "Статус модуля:" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "Подкасты" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Pop" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "Популярные композиции" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "Популярные композиции месяца" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "Популярные композиции сегодня" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "Длительность всплывающего сообщения" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "Порт" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "Предусиление" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "Настройки" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "Настройки..." #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "Предпочтительные имена файлов обложек альбомов (разделённые запятыми)" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "Предпочитаемый аудио формат" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "Предпочитаемый битрейт" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "Предпочитаемый формат" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "Премиум-тип аудио" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "Профиль:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "Нажмите комбинацию клавиш" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "Нажмите клавишу" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Нажмите комбинацию клавиш для %1..." #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "Настройки OSD" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "Предпросмотр" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "Предыдущий" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "Предыдущая композиция" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Вывести информацию о версии" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "Профиль" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "Ход выполнения" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 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:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "Качество" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "Опрашиваем устройство..." #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "Управление очередью" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "Добавить в очередь выбранные композиции" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "Добавить в очередь композицию" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "Радио (одинаковая громкость для всех композиций)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "Радио" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "Дождь" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "Случайная визуализация" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "Оценка текущей песни 0 звёзд" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "Оценка текущей песни 1 звезда" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "Оценка текущей песни 2 звезды" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "Оценка текущей песни 3 звезды" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "Оценка текущей песни 4 звезды" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "Оценка текущей песни 5 звёзд" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "Рейтинг" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "Действительно отменить?" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "Превышен предел перенаправлений, проверьте настройку сервера." #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "Обновить" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "Обновить каталог" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "Обновить каналы" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "Обновить список друзей" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "Обновить список станций" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "Обновить потоки" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Reggae" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "Запомнить движение ульта Wii" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "Запомнить последнее" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Удалить" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "Удалить действие" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "Удалить повторы из списка воспроизведения" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "Удалить каталог" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "Удалить из Моей музыки" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "Удалить из избранных" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "Удалить из списка воспроизведения" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "Удалить список воспроизведения" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "Удалить списки воспроизведения" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "Удаление композиции из Моей музыки" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "Удаление композиции из избранных" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "Переименовать список воспроизведения \\\"%1\\\"" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "Переименовать список воспроизведения Grooveshark" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "Переименовать список воспроизведения" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "Переименовать список воспроизведения..." #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "Перенумеровать композиции в таком порядке..." #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Повторять" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "Повторять альбом" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "Повторять список воспроизведения" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "Повторять композицию" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Заменить текущий список воспроизведения" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "Заменить список воспроизведения" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "Заменять пробелы подчеркиванием" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "Replay Gain" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "Режим Replay Gain" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "Перезаполнить" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "Требовать код аутентификации." #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "Сброс" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" 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:206 msgid "Restrict to ASCII characters" msgstr "Ограничить только символами ASCII" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "Продолжить воспроизведение при запуске" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "Получение композиций «Моя музыка» с Grooveshark " #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "Получение избранных композиций из Grooveshark " #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "Получение списков воспроизведения из Grooveshark " #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "Вернуться в Clementine" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "Правый канал" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "Выполнить" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "SOCKS прокси" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "Ошибка установки SSL-соединения, проверьте настройки соединения. В некоторых случаях может помочь включение SSLv3." #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "Безопасно извлечь устройство" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "Безопасно извлечь устройство после копирования" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "Частота" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "Частота дискретизации" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "Сохранить файлы настроения .mood в библиотеку музыки" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "Сохранить обложку альбома" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "Сохранить обложку на диск..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "Сохранить изображение" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "Сохранить список воспроизведения" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "Сохранить список воспроизведения..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "Сохранить профиль" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "Сохранять если возможно рейтинги в тегах файлов" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "Сохранять если возможно статистические данные в тегах файлов" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "Сохранить этот поток во вкладке Интернет" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "Сохранение статистических данных композиции в файлы" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "Сохранение композиций" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "Профиль Scalable sampling rate (SSR)" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "Масштаб" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "Счет" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "Скробблить треки, которые я слушаю" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "Поиск" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "Поиск станций Icecast" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "Поиск в Jamendo" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Поиск на Magnatune" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "Поиск Subsonic" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "Поиск обложек альбомов..." #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "Поиск всего" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "Поиск на gpodder.net" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "Поиск в iTunes" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "Режим поиска" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "Параметры поиска" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "Результаты поиска" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "Условия поиска" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "Поиск на Grooveshark" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "Второй уровень" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "Перемотка назад" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "Перемотка вперед" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "Перемотать текущую композицию на относительную позицию" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "Перемотать текущую композицию на абсолютную позицию" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "Выбрать все" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "Отменить выбор" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "Выберите цвет фона:" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "Выбрать фоновое изображение" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "Выбрать самые подходящие результаты" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "Выберите цвет:" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "Выбрать визуализации" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "Выбрать визуализации..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "Серийный номер" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "Адрес сервера" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "Параметры сервера" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "Служба недоступна" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Установить %1 в \"%2\"..." #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "Установить громкость в процентов" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "Установить значение для всех выделенных композиций..." #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "Настройки" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Комбинация клавиш" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "Комбинация клавиш для %1" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Комбинация клавиш для %1 уже существует" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Показать" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "Показывать OSD" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "Подсвечивать проигрывающийся трек" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "Показывать индикаторы настроения в статусе воспроизведения композиции" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "Уведомления с помощью служб рабочего стола" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Уведомлять при изменении режима повтора/перемешивания" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "Уведомлять при смене громкости" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "Всплывающие сообщения из системного лотка" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "Показывать OSD" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "Показать над строкой состояния" #: ui/mainwindow.cpp:460 msgid "Show all songs" msgstr "Показать все композиции" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Показать все песни" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show cover art in library" msgstr "Показывать обложки в библиотеке" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "Показывать разделители" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "Показать в полный размер..." #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "Показать в обозревателе файлов" #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "Показать в \"Разных исполнителях\"" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "Показывать индикаторы настроения" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "Показывать только повторяющиеся" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "Показывать только без тегов" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "Показать поисковые подсказки" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "Показывать кнопки \"Избранное\" и \"Запретить\"" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "Показывать кнопку скробблинга в главном окне" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "Показывать значок в системном лотке" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "Показать какие источники включены и отключены" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "Показать/Скрыть" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Перемешать" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "Перемешать альбомы" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "Перемешать все" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "Перемешать список воспроизведения" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "Перемешать композиции в этом альбоме" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "Войти" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "Выйти" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "Выполняется вход..." #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "Похожие исполнители" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "Размер" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "Размер:" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "Переместить назад в списке воспроизведения" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "Пропустить подсчет" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "Переместить вперед в списке воспроизведения" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "Маленькая обложка альбома" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "Узкая боковая панель" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "Умный список воспроизведения" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "Умные списки воспроизведения" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "Сведения о композиции" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "О песне" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "Сонограмма" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "Извините" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "Сортировать по жанру (в алфавитном порядке)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "Сортировать по жанру (по популярности)" #: ../bin/src/ui_icecastfilterwidget.h:77 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 "Сортировка" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "Источник" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "Источники" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "Ошибка при входе на Spotify" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "Модуль Spotify" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "Модуль Spotify не установлен" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "Стандартный" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "Оцененные" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "Запустить проигрываемый сейчас список воспроизведения" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "Начать перекодирование" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Введите что-нибудь в поле для поиска" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "Запуск %1" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "Запуск..." #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "Станции" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Остановить" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "Остановить после" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "Остановить после этой композиции" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Остановить воспроизведение" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "Остановить воспроизведение после текущей композиции" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "Остановлено" #: core/song.cpp:341 msgid "Stream" msgstr "Поток" #: internet/subsonicsettingspage.cpp:30 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:160 msgid "Streaming membership" msgstr "\"Streaming\" подписка" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "Списки воспроизведения, на которые вы подписаны" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "Подписчики" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "Успешно!" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "Успешно записано %1" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "Предлагаемые теги" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "Сводка" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "Сверхвысокий (%1 fps)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "Очень высокое (2048x2048)" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "Поддерживаемые форматы" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "Синхронизировать статистику в файлы прямо сейчас" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "Синхронизация входящих Spotify" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "Синхронизация плейлистов Spotify" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "Синхронизация оцененных треков Spotify" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "Системные цвета" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "Вкладки вверху" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Тег" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "Сборщик тегов" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "Радио тега" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "Целевой битрейт" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "Свойства текста" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Спасибо" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Команда \"%1\" не может быть выполнена" #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "Обложка альбома текущей композиции" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "Каталог %1 неправильный" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "Список воспроизведения '%1' пуст или не может быть загружен." #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "Запрошенная ссылка не является изображением!" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "В альбоме присутствуют другие композиции" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "Произошла ошибка связи с gpodder.net" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Проблема получения метаданных с Magnatune" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Произошла ошибка при разборе ответа от iTunes Store" #: ui/organiseerrordialog.cpp:56 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:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Эти файлы будут удалены с устройства. Вы точно хотите продолжить?" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "Эти файлы будут окончательно удалены с диска, Вы действительно хотите продолжить?" #: ../bin/src/ui_librarysettingspage.h:187 msgid "These folders will be scanned for music to make up your library" msgstr "В этих каталогах будет выполнен поиск музыки для создания вашей коллекции" #: ../bin/src/ui_transcodersettingspage.h:174 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:151 msgid "Third level" msgstr "Третий уровень" #: internet/jamendoservice.cpp:171 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/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "Этот альбом не доступен в требуемом формате" #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Устройство должно быть подключено и открыто перед тем, как Clementine определит, какой формат оно поддерживает." #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "Это устройство поддерживает следующие форматы:" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Это устройство не будет работать правильно" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Эта опция может быть изменена в настройках на вкладке \"Поведение\"" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "Поток только для платных подписчиков" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "Тип устройства не поддерживается: %1" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "Таймаут" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Название" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "Для включения радио Grooveshark требуется прослушать несколько композиций на Grooveshark" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "Сегодня" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "Включить OSD" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Развернуть на весь экран" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "Переключить состояние очереди" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "Вкл/выкл скробблинг" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Переключить видимость OSD" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "Завтра" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "Слишком много перенаправлений" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "Самые популярные" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "Всего альбомов:" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "Всего передано байт" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "Всего выполнено сетевых запросов" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Композиция" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "Перекодировать музыку" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "Журнал перекодирования" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "Перекодирование" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Перекодировано %1 файлов используя %2 потоков" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "Настройки перекодирования" #: core/song.cpp:338 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "Турбина" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "Выключить" #: devices/giolister.cpp:161 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "Ссылки" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "Пароль Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "Имя пользователя Ubuntu One" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "Ультраширокая полоса пропускания (UWB)" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Невозможно загрузить %1 (%2)" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Неизвестный" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "Неизвестный тип контента" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Неизвестная ошибка" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "Удалить обложку" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "Отписаться" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "Предстоящие концерты" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "Обновить список воспроизведения на Grooveshark" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "Обновить все подкасты" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "Обновить измененные папки коллекции" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "Обновлять коллекцию при запуске Clementine" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "Обновить этот подкаст" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "Обновление" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Идет обновление %1" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "Обновление %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Обновление коллекции" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "Использование" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "По возможности использовать тег «Исполнитель альбома»" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "Использовать комбинации клавиш Gnome" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "По возможности использовать метаданные Replay Gain" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "Использовать SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "Использовать пульт Wii" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "Использовать собственный набор цветов" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "Использовать собственное сообщение для уведомлений" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "Использовать сетевое дистанционное управление" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "Использовать аутентификацию" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "Использовать движок управления битрейтом" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "Использовать динамический режим" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "Уведомлять о статусе пульта Wii" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "Использовать временнóе сглаживание шумов" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "Использовать значения по умолчанию" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "Использовать системные цвета" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "Использовать системные настройки прокси" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "Использовать выравнивание громкости" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "Использовано" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "У пользователь %1 нет учетной записи Grooveshark Anywhere" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "Пользовательский интерфейс" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Имя пользователя" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "Использование Меню для добавления песни...." #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "Переменный битрейт" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "Разные исполнители" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "Версия %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "Просмотр" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "Режим визуализации" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "Визуализации" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "Настройки визуализации" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "Определение голоса" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "Громкость %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "Предупреждать при закрытии вкладки списка воспроизведения" #: core/song.cpp:337 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "Веб-сайт" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "Недель" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "При запуске Clementine" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "Когда список пуст..." #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "Почему бы не попробовать..." #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "Шировая полоса пропускания (WB)" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "Пульт Wii %1: активен" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "Пульт Wii %1: подключен" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Пульт Wii %1: критический уровень заряда батареи (%2%) " #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Пульт Wii %1: неактивен" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Пульт Wii %1: отключен" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Пульт Wii %1: низкий заряд батареи (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "Windows Media 128к" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "Windows Media 40к" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "Windows Media 64к" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "Windows Media" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "Без обложек:" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Переместить другие композиции из этого альбома в Разные исполнители?" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "Желаете запустить повторное сканирование?" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "Записать все статистические данные в файлы композиций" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "Неверное имя или пароль" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "Год" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "Год - Альбом" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "Годы" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "Вчера" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "Вы собираетесь скачать следующие альбомы" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "Вы собираетесь удалить %1 списков воспроизведения из списка любимых, уверены?" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "Вы не совершили вход." #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "Вы вошли в систему как %1." #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "Вы вошли в систему." #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "Можно изменить способ организации композиций в коллекции" #: internet/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "Бесплатное прослушивание возможно без регистрации, но Premium-пользователи могут слушать потоки в более высоком качестве без рекламы." #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "Фоновые потоки можно слушать одновременно с другой музыкой." #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "Скробблинг композиций осуществляется бесплатно, но только платные подписчики могут слушать радио Last.fm из Clementine." #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "У вас нет учетной записи Grooveshark Anywhere" #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "У вас нет учетной записи Spotify Premium" #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "У вас нет активной подписки" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Произошёл выход из Spotify. Введите ваш пароль повторно в диалоге Настройки." #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Произошёл выход из Spotify. Введите ваш пароль повторно." #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "Вам нравится эта композиция" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "Откройте Настройки системы и включите функцию \"Разрешить доступ для вспомогательных устройств\" для использования глобальных комбинаций клавиш в Clementine." #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "После смены языка потребуется перезапуск" #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "Вы не сможете слушать радиостанцию Last.fm, так как вы не являетесь её подписчиком." #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "Ваш IP-адрес:" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Учётные данные Last.fm введены неверно" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "Учётные данные Magnatune введены неверно" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "Ваша коллекция пуста!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "Ваши потоки радио" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "Заскробблено: %1" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Отсутствует поддержка OpenGL в системе, визуализации недоступны." #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "Имя пользователя или пароль указаы неверно." #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "По-умолчанию" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "добавить %n композиций" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "после" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "тому назад" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "и" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "автоматически" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "до" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "между" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "наибольшие сначала" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "содержит" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "отключён" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "диск %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "не содержит" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "заканчивается на" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "совпадает с" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "gpodder.net" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "Каталог gpodder.net" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "больше чем" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "в последние" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "кбит/с" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "меньше чем" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "сначала самые длинные" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "переместить %n композиций" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "сначала самые новые" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "не совпадает с" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "не в последние" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "не на" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "сначала самые старые" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "на" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "настройки" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "или сканируйте QR-код!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "нажмите ввод" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "удалить %n композиций" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "сначала кратчайший" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "Перемешать композиции" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "сначала наименьший" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "Сортировать композиции" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "начинается на" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "Остановить" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "композиция %1" clementine-1.2.0+dfsg/src/translations/si_LK.po000066400000000000000000003602611223327513400214370ustar00rootroot00000000000000# 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" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:08+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Sinhala (Sri Lanka) (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr "" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "" #: podcasts/gpoddersync.cpp:79 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "" #: playlist/playlistmanager.cpp:413 #, qt-format msgid "%1 selected of" msgstr "" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, qt-format msgid "%L1 other listeners" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "" #: transcoder/transcodedialog.cpp:192 #, c-format msgid "%n remaining" msgstr "" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "&Custom" msgstr "" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "" #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "" #: core/utilities.cpp:108 msgid "1 day" msgstr "" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "" #: library/library.cpp:60 msgid "50 random tracks" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "" #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:78 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:153 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "A-Z" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "" #: core/song.cpp:336 msgid "AIFF" msgstr "" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "" #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "" #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "" #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "" #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "" #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "" #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "" #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "" #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "" #: ui/about.cpp:74 msgid "All the translators" msgstr "" #: library/library.cpp:84 msgid "All tracks" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "" #: internet/spotifyblobdownloader.cpp:60 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:61 msgid "An error occurred loading the iTunes database" msgstr "" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:78 msgid "And:" msgstr "" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "" #: ui/about.cpp:65 msgid "Authors" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "" #: core/database.cpp:734 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "" #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "" #: core/song.cpp:339 msgid "CDDA" msgstr "" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "" #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "" #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "" #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "" #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "" #: ui/equalizer.cpp:115 msgid "Classical" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: internet/lastfmsettingspage.cpp:110 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 "" #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "" #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:116 msgid "Club" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "" #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "" #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "" #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "" #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "" #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "" #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "" #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "" #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:64 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: transcoder/transcoder.cpp:432 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "" #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "" #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "" #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "" #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "" #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "" #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "" #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "" #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "" #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "" #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:63 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "" #: core/song.cpp:328 msgid "Flac" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:43 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "" #: core/database.cpp:673 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "" #: internet/lastfmservice.cpp:437 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:154 msgid "Last.fm password" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "" #: ui/equalizer.cpp:123 msgid "Live" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "" #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "" #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "" #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "" #: core/song.cpp:330 msgid "MPC" msgstr "" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "" #: library/library.cpp:74 msgid "Most played" msgstr "" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "" #: library/library.cpp:67 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:80 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "" #: core/utilities.cpp:147 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:366 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "" #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "" #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "" #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "" #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "" #: core/organise.cpp:65 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:124 msgid "Party" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "" #: widgets/osd.cpp:156 msgid "Paused" msgstr "" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "" #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "" #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" 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:206 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "" #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "" #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:460 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "" #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "" #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 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 "" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "" #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "" #: core/song.cpp:341 msgid "Stream" msgstr "" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "" #: ui/about.cpp:70 msgid "Thanks to" msgstr "" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "" #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:56 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:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:174 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:151 msgid "Third level" msgstr "" #: internet/jamendoservice.cpp:171 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "" #: core/song.cpp:338 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "" #: devices/giolister.cpp:161 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "" #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "" #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "" #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "" clementine-1.2.0+dfsg/src/translations/sk.po000066400000000000000000004662501223327513400210600ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Tomáš Prékop , 2013 # Ján Ďanovský , 2011-2013 # Michal Polovka , 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 20:55+0000\n" "Last-Translator: Ján Ďanovský \n" "Language-Team: Slovak (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr "dní" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " kb/s" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " bodov" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " sekúnd" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " piesne" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 albumov" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 dní" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "Pred %1 dňami" #: podcasts/gpoddersync.cpp:79 #, 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:413 #, qt-format msgid "%1 selected of" msgstr "%1 vybratých z" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 pieseň" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 piesní" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "nájdených %1 piesní" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "nájdených %1 piesní (zobrazuje sa %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 skladieb" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 prenesených" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimotedev modul" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n zlyhalo" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n dokončených" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "&Vlastná" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "Bonusy" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "&Nápoveda" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "&Skryť %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "&Skryť..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Vľavo" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "Hudba" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Nijaká" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "Playlist" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Zavrieť" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "Režim opakovania" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "Vp&ravo" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "Režim zamiešavania" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "Roztiahnuť &stĺpce na prispôsobenie oknu" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "Nástroje" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(odlišné naprieč mnohými piesňami)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "...a všetkým prispievateľom Amaroku" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "0px" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 deň" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 skladba" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "127.0.0.1" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "40%" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 náhodých piesní" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "Prejsť teraz na prémium verziu" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "Vytvoriť nový účet, alebo zresetovať heslo" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "Je vyžadovaný Grooveshark Anywhere účet." #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "Je vyžadovaný prémium účet na Spotify." #: ../bin/src/ui_networkremotesettingspage.h:189 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:78 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:153 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:297 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "ALL GLORY TO THE HYPNOTOAD" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "Zrušiť" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "O %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "O Clemetine..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "O Qt.." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Detaily účtu" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "Podrobnosti účtu (prémium)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Akcia" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Aktivovať/deaktivovať Wiiremote" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "Pridať podcast" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Pridať stream" #: ../bin/src/ui_notificationssettingspage.h:425 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:193 msgid "Add action" msgstr "Pridať akciu" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Pridať ďalší stream..." #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Pridať priečinok..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "Pridať súbor" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "Pridať súbor na prekódovanie" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "Pridať súbor(y) na prekódovanie" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Pridať súbor..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Pridať súbory na transkódovanie" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Pridať priečinok" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Pridať priečinok..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Pridať nový priečinok..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "Pridať podcast" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "Pridať podcast..." #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Pridať výraz hľadania" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "Pridať tag albumu" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "Pridať tag interpréta albumu" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "Pridať tag interpréta piesne" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "Pridať automatické skóre piesne" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "Pridať tag skladateľa piesne" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "Pridať tag disku" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "Vložiť názov súboru piesne" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "Pridať tag žánru piesne" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "Pridať tag zoskupenia piesne" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "Pridať tag dĺžky piesne" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "Pridať tag účinkujúceho piesne" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "Pridať počet prehraní piesne" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "Pridať hodnotenie piesne" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "Pridať počet preskočení piesne" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "Pridať tag názvu piesne" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "Pridať tag čísla skladby" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "Pridať tag roka piesne" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Pridať stream..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "Pridať k obľúbeným na Grooveshark" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "Pridať do Grooveshark playlistov" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "Pridať do iného playlistu" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Pridať do playlistu" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "ju pridá do poradia" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Pridať wiimotedev akciu" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Pridať..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Pridané tento mesiac" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Pridané tento týždeň" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Pridané tento rok" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Pridané dnes" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Pridané posledný štvrťrok" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "Pridáva sa pieseň do Mojej hudby" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "Pridať pieseň k obľúbeným" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Pokročilé zoraďovanie..." #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "Po " #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "Po kopírovaní..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Album (ideálna hlasitosť pre všetky skladby)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Interprét albumu" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "Obal albumu" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Informácie o albume na jamendo.com..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Albumy s obalmi" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Albumy bez obalov" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Všetky súbory (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "All Glory to the Hypnotoad!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Všetky albumy" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Všetci interpréti" #: ui/albumcoverchoicecontroller.cpp:47 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:74 msgid "All the translators" msgstr "DAG Software (Ďanovský Ján), všetkým ostatným prekladateľom" #: library/library.cpp:84 msgid "All tracks" msgstr "Všetky skladby" #: ../bin/src/ui_networkremotesettingspage.h:194 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:196 msgid "Allow downloads" msgstr "Povoliť sťahovania" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "Povoliť stred/kraj enkódovanie" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "Po boku originálov" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Vždy skryť hlavné okno" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Vždy zobrazovať hlavné okno" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "Hneď začne hrať" #: internet/spotifyblobdownloader.cpp:60 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:61 msgid "An error occurred loading the iTunes database" msgstr "Nastala chyba pri načítavaní iTunes databázy" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Vyskytla sa chyba počas zapisovania metadát do '%1'" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "Vyskytla nešpecifikovaná chyba." #: ui/about.cpp:78 msgid "And:" msgstr "A:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "Zlostný" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Vzhľad" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Pridať súbory/URL adresy do playlistu" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "Pridať do aktuálneho playlistu" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "ju pridá do playlistu" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "Použiť kompresiu na zabránenie odrezávania" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Ste si istý, že chcete vymazať predvoľbu \"%1\"?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "Ste si istí, že chcete zmazať tento playlist?" #: ui/edittagdialog.cpp:769 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:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Interprét" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Interprét" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "Rádio interpréta" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "Tagy interpréta" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "Iniciálky interpréta" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Audio formát" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Autentifikácia zlyhala" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "Autor" #: ui/about.cpp:65 msgid "Authors" msgstr "Autori" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Automaticky" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Automatické aktualizovanie" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "Automaticky otvoriť jednotlivé kategórie v strome zbierky" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "K dispozícii" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "Priemerný dátový tok" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "Priemerná veľkosť obrázku" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "Podcasty BBC" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "Streamy na pozadí" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Farba pozadia" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "Obrázok na pozadí" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Priehľadnosť pozadia" #: core/database.cpp:734 msgid "Backing up database" msgstr "Zálohuje sa databáza" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "Vyváženie" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Zakázané" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "Prúžkový analyzér" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Základná modrá" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "Základný typ zvuku" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Správanie" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "Najlepšia" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "Životopis z %1" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Bit rate" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "Dátový tok" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "Blokový analyzér" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "Typ bloku" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "Množstvo rozmazania" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "Obsah" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "Boom analyzér" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Prehľadávať..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "Dĺžka vyrovnávacej pamäte" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "Ukladá sa do vyrovnávacej pamäte" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "Ale tieto zdroje sú zakázané:" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Tlačidlá" #: core/song.cpp:339 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "podpora CUE zoznamu" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "Zrušiť" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Zmeniť obal albumu" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Zmeniť veľkosť písma..." #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "Zmeniť režim opakovania" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Zmeniť skratku..." #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "Zmeniť režim zamiešavania" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Zmeniť jazyk" #: ../bin/src/ui_playbacksettingspage.h:330 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:228 msgid "Check for new episodes" msgstr "Skontrolovať, či sú nové časti" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Skontrolovať aktualizácie..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "Vyberte názov pre váš inteligentný playlist" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Vybrať automaticky" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Vybrať farbu..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "Vybrať písmo..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Vybrať zo zoznamu" #: smartplaylists/querywizardplugin.cpp:155 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ť." #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "Vybrať pričinok na sťahovanie podcastu" #: ../bin/src/ui_songinfosettingspage.h:188 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:115 msgid "Classical" msgstr "Classical" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "Upratovanie" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Vyprázdniť" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Vyprázdniť playlist" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Chyba Clementine" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Klementínková oranžová" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Clementine vizualizácia" #: ../bin/src/ui_deviceproperties.h:376 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_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "\t\nClementine dokáže prehrávať hudbu, ktorú ste nahrali do služby Box" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine môže prehrať hudbu, ktorú ste nahrali na Dropbox" #: ../bin/src/ui_googledrivesettingspage.h:104 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_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "Clementine môže prehrať hudbu, ktorú ste nahrali na Ubuntu One" #: ../bin/src/ui_notificationssettingspage.h:431 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:250 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:128 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." #: internet/lastfmsettingspage.cpp:110 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 "Clementine sa nepodarilo stiahnuť váš predplatiteľský stav kvôli problémom s vašim pripojením. Prehrávané skladby sa uložia do vyrovnávacej pamäte a na Last.fm sa pošlú neskôr." #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Clementine prehliadač obrázkov" #: ../bin/src/ui_trackselectiondialog.h:206 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:210 msgid "Clementine will find music in:" msgstr "Clementine bude hľadať hudbu na:" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Kliknite sem aby ste pridali nejakú hudbu" #: playlist/playlisttabbar.cpp:293 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:72 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_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "Zatvoriť playlist" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "Zatvoriť vizualizáciu" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "Zatvorenie tohto okna zruší sťahovanie." #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "Zatvorenie tohto okna zastaví hľadanie obalov albumov" #: ui/equalizer.cpp:116 msgid "Club" msgstr "Club" #: ../bin/src/ui_appearancesettingspage.h:272 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:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Komentár" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "Vyplniť tagy automaticky" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "Vyplniť tagy automaticky..." #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Skladateľ" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "Nastaviť %1..." #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "Nastaviť Grooveshark ..." #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Konfigurovať Last.fm..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "Nastaviť Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Klávesové skratky" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "Nastaviť Spotify..." #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "Nastaviť Subsonic..." #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "Nastaviť globálne vyhľadávanie..." #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "Nastaviť zbierku..." #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "Nastaviť podcasty..." #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "Nastaviť..." #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "Pripojiť Wii diaľkové použitím akcie aktivovať/deaktivovať" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "Pripojiť zariadenie" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "Pripájanie k Spotify" #: internet/subsonicsettingspage.cpp:107 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/subsonicsettingspage.cpp:117 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/" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "Konzola" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "Konštantný dátový tok" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "Konvertovať všetku hudbu" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "Konvertovať hudbu ktorú zariadenie nemôže prehrať" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "Kopírovať do schránky" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Skopírovať na zariadenie..." #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Skopírovať do zbierky..." #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "Autorské práva" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Nedalo sa pripojiť na Subsonic, skontrolujte URL servera. Napríklad: http://localhost:4040/" #: transcoder/transcoder.cpp:64 #, 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." #: transcoder/transcoder.cpp:432 #, 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:426 #, 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/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "Nedala sa načítať last.fm rádio stanica" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "Nedá sa otvoriť výstupný súbor %1" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Správca obalov" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "Obal zo zabudovaného obrázka" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Obal automaticky načítaný z %1" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "Obal ručne nenastavený" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "Obal nenastavený" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "Obal nastavený z %1" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "Obaly z %1" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "Vytvoriť nový playlist Grooveshark" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "Prelínať keď sa zmení skladba automaticky" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "Prelínať keď sa zmení skladba ručne" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "Vlastné" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "Vlastný obrázok" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "Vlastné nastavenie správy" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "Vlastné rádio" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Vlastná..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "DBus cesta" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Dance" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Dátum vytvorenia" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Dátum zmeny" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "Dni" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "Pôvo&dná" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "Znížiť hlasitosť o 4%" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "Znížiť hlasitosť o %" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Znížiť hlasitosť" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "Štandardný obrázok na pozadí" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "Predvolené" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "Oneskorenie medzi vizualizáciami" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "Vymazať" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "Vymazať Grooveshark playlist" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "Vymazať stiahnuté dáta" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Vymazať súbory" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Vymazať zo zariadenia..." #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Vymazať z disku..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "Vymazať prehrané časti" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "Vymazať predvoľbu" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "Vymazať inteligentný playlist" #: ../bin/src/ui_organisedialog.h:194 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:1363 msgid "Dequeue selected tracks" msgstr "Vybrať z radu vybrané skladby" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "Vybrať z radu skladbu" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Cieľ" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Podrobnosti..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Zariadenie" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Vlastnosti zariadenia" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Názov zariadenia" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Vlastnosti zariadenia..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Zariadenia" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Mysleli ste" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "Digitally Imported heslo" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "Digitally Imported meno používateľa" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "Priame pripojenie na internet" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Priečinok" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "Zakázať trvanie" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "Zakázať vytváranie panelu nálady" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Žiadne" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Disk" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "Nesúvislý prenos" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 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:715 msgid "Do a full library rescan" msgstr "Vykonať preskenovanie celej zbierky" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "Nekonvertovať žiadnu hudbu" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "Neprepisovať" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Neopakovať" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "Nezobrazovať v rôznych interprétoch" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "Nezamiešavať" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "Neprestávať!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "Prispieť" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Otvoríte dvojklikom" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "Dvojklik na pieseň..." #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "Stiahnuť %n častí" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "Priečinok na sťahovanie" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "Stiahnuť časti do" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "Členstvo sťahovania" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "Sťahovať nové časti automaticky" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "Sťahovanie zaradené" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "Stiahnuť Android aplikáciu" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Stiahnuť tento album" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Stiahnuť tento album..." #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "Stiahnuť túto časť" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "Stiahnuť..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "Sťahovanie (%1%)..." #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "Sťahuje sa Icecast priečinok" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "Sťahuje sa Jamendo katalóg" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "Sťahuje sa Magnatune katalóg" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "Sťahuje sa Spotify plugin" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "Sťahujú sa metadáta" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "Pretiahnite na iné miesto" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "Dropbox" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "Dynamický režim je zapnutý" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "Dynamicky náhodná zmes" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "Upraviť inteligentný playlist..." #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Upraviť tag \"%1\"..." #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "Upraviť tag..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "Upraviť tagy" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Upravť informácie o skladbe" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "Upravť informácie o skladbe..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Upraviť informácie o skladbách" #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Upraviť..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "Povoliť podporu Wii diaľkového" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "Povoliť ekvalizér" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "Povoliť skratky len keď je Clementine zameraný" #: ../bin/src/ui_globalsearchsettingspage.h:147 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:62 msgid "Enable/disable Last.fm scrobbling" msgstr "Povoliť/zakázať Last.fm skroblovanie" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "Zložitosť enkódovania" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "Kvalita enkódovacieho stroja" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "Režim enkódovania" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "Vložte URL" #: ../bin/src/ui_coverfromurldialog.h:103 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:205 msgid "Enter a filename for exported covers (no extension):" msgstr "Zadajte názov súboru pre exportované obaly (bez prípony):" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "Zadajte nový názov pre tento playlist" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Vložte meno interpréta alebo tag aby ste začali počúvať Last.fm rádio." #: ../bin/src/ui_globalsearchview.h:209 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:77 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:77 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:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "Sem napíšte výrazy na hľadanie" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "Vložte URL internetového rádio streamu:" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "Vložte názov priečinka" #: ../bin/src/ui_networkremotesettingspage.h:198 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:87 msgid "Entire collection" msgstr "Celá zbierka" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Chyba" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Chyba pri pripájaní MTP zariadenia" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "Chyba pri kopírovaní piesní" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "Chyba pri vymazávaní piesní" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "Chyba pri sťahovaní Spotify pluginu." #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "Chyba pri načítavaní %1" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Chyba pri načítavaní di.fm playlistu" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "Chyba spracovania %1: %2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "Chyba pri čítaní zvukového CD" #: library/library.cpp:63 msgid "Ever played" msgstr "Vždy hrané" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "Každých 10 minút" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "Každých 12 hodín" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "Každé 2 hodiny" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "Každých 20 minut" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "Každých 30 minút" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "Každých 6 hodín" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "Každú hodinu" #: ../bin/src/ui_playbacksettingspage.h:303 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:208 msgid "Existing covers" msgstr "Existujúce obaly" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "Rozbaliť" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "Vyprší %1" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "Exportovať obaly" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "Exportovať obaly" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "Exportovať stiahnuté obaly" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "Exportovať vložené obaly" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "Exportovanie dokončené" #: ui/albumcovermanager.cpp:786 #, 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:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "Zoslabenie pri pozastavení / zosilenie pri obnovení prehrávania" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "Zoslabiť pri zastavení skladby" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "Zoslabovanie" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "Trvanie zoslabovania" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "Zlyhalo získanie priečinka" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "Zlyhalo získanie podcastov" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "Zlyhalo načítanie podcastu" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "Zlyhalo spracovanie XML pre tento RSS kanál" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "Rýchla" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "Obľúbené" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "Obľúbené skladby" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "Získať chýbajúce obaly" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "Získavať automaticky" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "Sťahovanie dokončené" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "Získava sa zbierka zo Subsonicu" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Chyba pri získavaní obalu" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "Prípona súboru" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "Formáty súborov" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Názov súboru" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "Názov súboru (bez cesty)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Veľkosť súboru" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Typ súboru" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Názov súboru" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Súbory" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "Súbory na transkódovanie" #: smartplaylists/querywizardplugin.cpp:90 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." #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "Robí sa odtlačok piesne" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "Dokončiť" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "Prvá úroveň" #: core/song.cpp:328 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Veľkosť písma" #: ../bin/src/ui_spotifysettingspage.h:213 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:204 msgid "Force mono encoding" msgstr "Vynútiť mono enkódovanie" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "Zabudnúť na zariadenie" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Formulár" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "Formát" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Počet snímkov" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "Snímkov na buffer" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Priatelia" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "Zmrznutý" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Plné basy" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "Plné basy a výšky" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "Plné výšky" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "GStreamer audio engine" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "Všeobecné" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Všeobecné nastavenia" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Žáner" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "Získať URL na zdieľanie tohto Grooveshark playlistu" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "Získať URL na zdieľanie tejto Grooveshark piesne" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "Získavajú sa populárne piesne z Grooveshark" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "Preberanie kanálov" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "Získavanie streamov" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "Pomenujte:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "Prejsť" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "Prejsť na kartu ďalšieho playlistu" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "Prejsť na kartu predchádzajúceho playlistu" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, 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:206 msgid "Grey out non existent songs in my playlists" msgstr "Zošednúť neexistujúce piesne v playlistoch" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "Chyba pri prihlásení na Grooveshark" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "URL Grooveshark playlistu" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "Grooveshark rádio" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "URL adresa Grooveshark piesne " #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "Zoraďovanie zbierky podľa..." #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "Zoradiť podľa" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "Zoradiť podľa albumu" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "Zoradiť podľa interpréta" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "Zoradiť podľa interprét/album" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "Zoradiť podľa interprét/rok - album" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "Zoradiť podľa žáner/album" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "Zoradiť podľa žáner/interprét/album" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "Zoskupenie" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "HTML stránka neobsahuje žiadne RSS kanály" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "Stavový kód HTTP 3xx prijatý bez URL, overte nastavenie servra" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "HTTP proxy" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "Šťastný" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "Hardwarové informácie" #: ../bin/src/ui_deviceproperties.h:372 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:202 msgid "High" msgstr "Vysoké" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "Vysoké (%1 fps)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "Vysoká (1024x1024)" #: internet/subsonicsettingspage.cpp:112 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:310 msgid "Hours" msgstr "Hodiny" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "Nemám Magnatune účet" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Ikona" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "Ikony na vrchu" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "Identifikuje sa pieseň" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 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:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Ak poznáte URL podcastu, zadajte ju nižšie a kliknite na Prejsť." #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "Ignorovať „The“ v menách interprétov" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Obrázky (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "Za %1 dní" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "Za %1 týždňov" #: ../bin/src/ui_wizardfinishpage.h:86 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/spotifyservice.cpp:360 msgid "Inbox" msgstr "Doručené" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "Zahrnúť obal do upozornenia" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "Zahrnúť všetky piesne." #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Nekompatibilná verzia Subsonic REST protokolu. Klienta musíte aktualizovať." #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Nekompatibilná verzia Subsonic REST protokolu. Server musíte aktualizovať." #: internet/subsonicsettingspage.cpp:127 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:158 msgid "Increase the volume by 4%" msgstr "Zvýšiť hlasitosť o 4%" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "Znížiť hlasitosť o %" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Zvýšiť hlasitosť" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "Indexuje sa %1" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "Informácie" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "Vložiť..." #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Nainštalované" #: core/database.cpp:673 msgid "Integrity check" msgstr "Kontrola integrity" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "Internetoví poskytovatelia" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "Neplatný API kľúč" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Neplatný formát" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "Neplatná metóda" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "Neplatné parametre" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "Určený neplatný zdroj" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "Nefunkčná služba" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "Neplatný kľúč sedenia" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "Neplatné meno používateľa a/alebo heslo" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "Jamendo najpočúvanejšie skladby" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "Jamendo naj skladby" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "Jamendo naj skladby mesiaca" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "Jamendo naj skladby týždňa" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "Jamendo databáza" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "Skočiť na práve prehrávanú skladbu" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Držte tlačidlá %1 sekundu..." #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Držte tlačidlá %1 sekúnd..." #: ../bin/src/ui_behavioursettingspage.h:193 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:193 msgid "Keep the original files" msgstr "Zachovať pôvodné súbory" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "Mačiatka" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Jazyk" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "Notebook/sluchátka" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Large Hall" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "Veľký obal albumu" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "Veľký bočný panel" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "Naposledy prehrávané" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "Last.fm vlastné rádio: %1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Last.fm zbierka - %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "Last.fm rádio zmes - %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Last.fm rádio suseda - %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Last.fm rádio stanica - %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Last.fm podobní interpréti ako %1" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Last.fm rádio tagu: %1" #: internet/lastfmservice.cpp:437 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:154 msgid "Last.fm password" msgstr "Last.fm heslo" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "Last.fm počet prehraní" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Last.fm tagy" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Last.fm použ. meno" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Last.fm wiki" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "Najmenej obľúbené skladby" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "Nechajte prázdne, ak chcete pôvodné. Príklady: \"/dev/dsp\", \"front\", atď." #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "Ľavý" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Dĺžka" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Zbierka" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "Pokročilé zoraďovanie zbierky" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "Poznámka k preskenovaniu zbierky" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "Hľadanie v zbierke" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Obmedzenia" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "Počúvať Grooveshark piesne založené na tom, čo ste počúvali predtým" #: ui/equalizer.cpp:123 msgid "Live" msgstr "Live" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Načítať" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "Načítať obal z URL" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "Načítať obal z URL..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "Načítať obal z disku" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "Načítať obal z disku..." #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "Načítať playlist" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "Načítať playlist..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Načítava sa Last.fm rádio" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Načítava sa MTP zariadenie" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "Načítava sa iPod databáza" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "Načítava sa inteligentný playlist" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "Načítavanie piesní" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "Načítava sa stream" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "Načítavajú sa skladby" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "Načítavajú sa informácie o skladbe" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "Načítava sa..." #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "Načítať súbory/URL adresy, nahradiť nimi aktuálny playlist" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Prihlásiť sa" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "Prihlásenie zlyhalo" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "Profil dlhodobej predpovede (LTP)" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "Obľúbené" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Nízke (%1 fps)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "Nízka (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "Nízko-komplexný profil (LC)" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "Texty piesní" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "Texty z %1" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Magnatune sťahovanie" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Magnatune sťahovanie dokončené" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "Hlavný profil (MAIN)" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "Make it so!" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "Urobiť playlist dostupný offline" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "Poškodená odpoveď" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "Ručné nastavenie proxy" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "Ručne" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "Výrobca" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "Označiť ako vypočuté" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "Označiť ako nové" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "Spĺňať všetky výrazy hľadania (AND)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "Splniť jeden alebo viac výrazov (OR)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "Maximálny dátový tok" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "Stredné (%1 fps)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "Stredná (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "Typ členstva" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "Minimálny dátový tok" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "Chýbajú projectM predvoľby" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "Model" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "Sledovať zmeny v zbierke" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "Mono prehrávanie" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "Mesiace" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "Nálada" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "Štýl panelu nálady" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "Panel nálady" #: library/library.cpp:74 msgid "Most played" msgstr "Najviac hrané" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "Bod pripojenia" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "Body pripojenia" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "Posunúť nižšie" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "Presunúť do zbierky..." #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "Posunúť vyššie" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "Hudba" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Hudobná zbierka" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "Stlmiť" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "Moja Last.fm zbierka" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "Moje Last.fm mix rádio" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "Moji Last.fm susedia" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "Moje odporúčané Last.fm rádio" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "Moja rádio zmes" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "Moja hudba" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "Moji susedia" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "Moja rádio stanica" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "Moje odporúčania" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Názov" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "Možnosti pomenovávania" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "Úzke pásmo" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "Susedia" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "Sieť" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "Sieťové proxy" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "Diaľkové ovládanie cez sieť" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "Nikdy" #: library/library.cpp:67 msgid "Never played" msgstr "Nikdy nehrané" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "Nezačne sa prehrávať" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "Nový playlist" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "Nový playlist" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "Nový inteligentný playlist..." #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "Nové piesne" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "Nové skladby budú pridané autamticky." #: library/library.cpp:80 msgid "Newest tracks" msgstr "Najnovšie skladby" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "Ďalšia" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Nasledujúca skladba" #: core/utilities.cpp:147 msgid "Next week" msgstr "Budúci týždeň" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "Bez analyzéru" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "Žiaden obrázok na pozadí" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "Žiadne obaly na exportovanie." #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "Žiadne dlhé bloky" #: playlist/playlistcontainer.cpp:366 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:145 msgid "No short blocks" msgstr "Žiadne krátke bloky" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "Nijako" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 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:155 msgid "Normal" msgstr "Normálny" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "Normálny typ bloku" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "Nedostupné, keď sa používajú dynamické playlisty" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "Nepripojené" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "Nedostatok obsahu" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "Nedostatok fanúšikov" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "Nedostatok členov" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "Nedostatok susedov" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Nenainštalované" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "Nieprihlásený" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "Nepripojené - pripojíte dvojklikom" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "Typ upozornení" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Upozornenia" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Prehráva sa" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "OSD ukážka" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "Nepriehľadnosť" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "Otvoriť %1 v prehliadači" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "Otvoriť &zvukové CD..." #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "Otvoriť OPML súbor" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "Otvoriť OPML súbor..." #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "Otvoriť zariadenie" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "Otvoriť súbor ..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "Otvoriť v Google Drive" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "ju otvorí v novom playliste" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Otvoriť..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "Operácia zlyhala" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "Optimalizovať na dátový tok" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "Optimalizovať na kvalitu" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "Možnosti..." #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "Organizovať súbory" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "Spravovať súbory..." #: core/organise.cpp:65 msgid "Organising files" msgstr "Spravovanie súborov" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "Pôvodné tagy" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Ostatné možnosti" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "Výstup" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "Výstupné zariadenie" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "Možnosti výstupu" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "Plugin výstupu" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "Prepísať všetko" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "Prepísať existujúce súbory" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "Prepísať iba menšie" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "Vlastník" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "Analyzuje sa Jamendo katalóg" #: ui/equalizer.cpp:124 msgid "Party" msgstr "Party" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "Heslo" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Pozastaviť" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "Pozastaviť prehrávanie" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Pozastavené" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "Účinkujúci" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "Pixel" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "Obyčajný bočný panel" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Hrať" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "Hrať interpréta alebo tag" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "Hrať rádio interpréta..." #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "Počet prehraní" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "Hrať vlastné rádio..." #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "Hrať ak je zastavené, pozastaviť ak hrá" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "Začne hrať, ak sa nič neprehráva" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "Hrať rádio tagu..." #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "Hrať . skladbu v playliste" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "Hrať/Pozastaviť" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Prehrávanie" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Možnosti prehrávača" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "Playlist" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "Playlist dokončený" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "Možnosti playlistu" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "Typ playlistu" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "Playlisty" #: ../data/oauthsuccess.html:36 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:214 msgid "Plugin status:" msgstr "Stav pluginu:" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "Podcasty" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Pop" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "Populárne piesne" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "Populárne piesne tohto mesiaca" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "Populárne piesne dneška" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "Trvanie upozornenia" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "Port" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "Predzosilnenie" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "Nastavenia" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "Nastavenia..." #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "Preferované názvy súborov obalov albumov (oddelené čiarkou)" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "Preferovaný formát zvuku" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "Preferovaný dátový tok" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "Preferovaný formát" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "Typ zvuku prémium" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "Predvoľba:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "Stlačte kombináciu kláves na použitue pre" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "Stlač tlačítko" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, 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_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "Možnosti krásneho OSD" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "Ukážka" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "Predchádzajúca" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 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:131 msgid "Profile" msgstr "Profil" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "Priebeh" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 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:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "Kvalita" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "Zaraďuje sa zariadenie..." #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "Správca poradia" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "Zaradiť vybrané skladby" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "Zaradiť skladbu" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "Rádio (rovnaká hlasitosť pre všetky skladby)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "Rádiá" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "Dážď" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "Náhodná vizualizácia" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "Ohodnotiť aktuálnu pieseň 0 hviezdičkami" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "Ohodnotiť aktuálnu pieseň 1 hviezdičkou" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "Ohodnotiť aktuálnu pieseň 2 hviezdičkami" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "Ohodnotiť aktuálnu pieseň 3 hviezdičkami" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "Ohodnotiť aktuálnu pieseň 4 hviezdičkami" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "Ohodnotiť aktuálnu pieseň 5 hviezdičkami" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "Hodnotenie" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "Naozaj zrušiť?" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "Prekročený limit presmerovaní, overte nastavenie servra" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "Obnoviť" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "Obnoviť katalóg" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "Obnoviť kanály" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "Obnoviť zoznam priateľov" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "Obnoviť zoznam staníc" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "Obnoviť streamy" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Reggae" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "Pamätať si kývnutie Wii diaľkového" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "Zapamätať z naposledy" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Odstrániť" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "Odstrániť akciu" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "Odstrániť duplikáty z playlistu" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "Odstrániť priečinok" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "Odstrániť z Mojej hudby" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "Odstrániť z obľúbených" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "Odstrániť z playlistu" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "Odstrániť playlist" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "Odstrániť playlisty" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "Odstraňujú sa piesne z Mojej hudby" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "Odstraňujú sa piesne z obľúbených" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "Premenovať playlist \"%1\"" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "Premenovať Grooveshark playlist" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "Premenovať playlist" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "Premenovať playlist..." #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "Prečíslovať skladby v tomto poradí..." #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Opakovať" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "Opakovať album" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "Opakovať playlist" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "Opakovať skladbu" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Nahradiť aktuálny playlist" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "ňou nahradí playlist" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "Nahradiť medzery podčiarknutiami" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "Vyrovnať hlasitosť" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "Režim normalizovania hlasitosti" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "Znovu naplniť" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "Vyžadovať overovací kód" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "Zresetovať" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" msgstr "Vynulovať počet prehraní" #: 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:206 msgid "Restrict to ASCII characters" msgstr "Obmedziť na ASCII písmená" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "Obnoviť prehrávanie pri spustení" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "Získavajú sa piesne z Mojej hudby na Groovesharku" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "Získavanie populárnych piesní z Grooveshark" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "Získavajú sa Grooveshark playlisty" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "Vrátiť sa do Clementine" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "Pravý" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "Spustiť" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "SOCKS proxy" #: internet/subsonicsettingspage.cpp:122 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:202 msgid "Safely remove device" msgstr "Bezpečne odpojiť zariadenie" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "Bezpečne odpojiť zariadenie po skončení kopírovania" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "Rýchlosť vzorkovania" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "Rýchlosť vzorkovania" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "Ukladať súbory .mood vo vašej hudobnej zbierke" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "Uložiť obal albumu" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "Uložiť obal na disk..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "Uložiť obrázok" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "Uložiť playlist" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "Uložiť playlist..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "Uložiť predvoľbu" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "Ukladať hodnotenie do štítkov súboru, keď je to možné" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "Ukladať štatistiku do štítkov súboru, keď je to možné" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "Uložiť tento stream na karte Internet" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "Ukladanie štatistiky piesní do súborov piesní" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "Ukladajú sa skladby" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "Profil so škálovateľnou vzorkovacou frekvenciou" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "Veľkosť škály" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "Skóre" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "Skroblovať skladby, ktoré počúvam" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "Hľadať" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "Hľadať Icecast stanice" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "Hľadať na Jamendo" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Hľadať na Magnatune" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "Vyhľadať na Subsonicu" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "Hľadať obaly albumov..." #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "Hľadať všetko" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "Hľadať na gpodder.net" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "Hľadať na iTunes" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "Režim hľadania" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "Možnosti hľadania" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "Výsledky hľadania" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "Výrazy na hľadanie" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "Hľadanie na Grooveshak" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "Druhá úroveň" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "Posunúť vzad" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "Posunúť vpred" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "Pretočiť súčasnú skladbu o určitý čas" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "Pretočiť súčasnú skladbu na presné miesto" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "Označiť všetko" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "Nevybrať nič" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "Vybrať farbu pozadia:" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "Vybrať obrázok pozadia" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "Vyberte najlepšiu možnosť" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "Vybrať farbu popredia:" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "Vybrať vizualizácie" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "Vybrať vizualizácie..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "Sériové číslo" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "URL servru" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "Podrobnosti servera" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "Služba je offline" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Nastaviť %1 do \"%2\"..." #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "Nastaviť hlasitosť na percent" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "Nastaviť hodnotu pre všetky vybraté skladby..." #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "Nastavenia" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Skratka" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "Skratka pre %1" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Skratka pre %1 už existuje" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Zobraziť" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "Zobraziť OSD" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "Zobraziť blikajúcu animáciu na súčasnej skladbe" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "Zobraziť panel nálady v paneli priebehu skladby" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "Zobrazovať natívne desktopové upozornenia" #: ../bin/src/ui_notificationssettingspage.h:442 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:441 msgid "Show a notification when I change the volume" msgstr "Zobraziť upozornenie keď zmením hlasitosť" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "Zobrazovať upozornenia z tray lišty" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "Zobrazovať krásne OSD" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "Zobraziť nad stavovou lištou" #: ui/mainwindow.cpp:460 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:209 msgid "Show cover art in library" msgstr "Zobraziť obaly albumov v zbierke" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "Zobraziť oddeľovače" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "Zobraziť celú veľkosť..." #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "Zobraziť v prehliadači súborov..." #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "Zobrazovať v rôznych interprétoch" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "Zobraziť panel nálady" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "Zobraziť iba duplikáty" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "Zobraziť iba neotagované" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "Zobrazovať návrhy vyhľadávania" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "Zobrazovať tlačítka \"obľúbené\" a \"zakázané\"" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "Zobraziť tlačidlo skroblovania v hlavnom okne" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "Zobrazovať tray ikonu" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "Zobraziť, ktoré zdroje sú povolené, a ktoré zakázané" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "Zobraziť/Skryť" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Zamiešať" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "Zamiešať albumy" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "Zamiešať všetko" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "Zamiešať playlist" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "Zamiešať skladby v tomto albume" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "Prihlásiť sa" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "Odhlásiť" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "Prihlasovanie..." #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "Podobní interpréti" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "Veľkosť" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "Veľkosť:" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "Preskočiť dozadu v playliste" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "Počet preskočení" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "Preskočiť dopredu v playliste" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "Malý obal albumu" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "Malý bočný panel" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "Inteligentný playlist" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "Inteligentné playlisty" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "Informácie o piesni" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "Pieseň" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "Sonogram" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "Ľutujem" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "Usporiadať podľa žánru (abecedne)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "Usporiadať podľa žánru (podľa populatity)" #: ../bin/src/ui_icecastfilterwidget.h:77 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" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "Zdroj" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "Zdroje" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "Chyba pri prihlasovaní na Spotify" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "Spotify plugin" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "Spotify plugin nieje nainštalovaný" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "Štandardný" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "S hviezdičkou" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "Začať playlist práve prehrávanou" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "Začať transkódovanie" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 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:405 #, qt-format msgid "Starting %1" msgstr "Začína sa %1" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "Začína sa ..." #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "Stanice" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Zastaviť" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "Zastaviť po" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "Zastaviť po tejto skladbe" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Zastaviť prehrávanie" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "Zastaviť prehrávanie po aktuálnej skladbe" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "Zastavené" #: core/song.cpp:341 msgid "Stream" msgstr "Stream" #: internet/subsonicsettingspage.cpp:30 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:160 msgid "Streaming membership" msgstr "Streamovacie členstvo" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "Podpísané playlisty" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "Predplatitelia" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "Hotovo!" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "Úspešne zapísané %1" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "Nájdené tagy" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "Zhrnutie" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "Veľmi vysoké (%1 fps)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "Super vysoká (2048x2048)" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "Podporované formáty" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "Synchronizovať štatistiky do súborov teraz" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "Synchronizuje sa Spotify schránka" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "Synchronizuje sa Spotify playlist" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "Synchronizujú sa skladby ohviezdičkované na Spotify" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "Systémové farby" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "Karty na vrchu" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Tag" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "Získavač tagov" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "Rádio tagu" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "Cieľový dátový tok" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "Textové možnosti" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Poďakovanie" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Príkaz \"%1\" nemohol začať." #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "Obal albumu práve prehrávanej piesne" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "Priečinok %1 nieje platný" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "Playlist '%1' je prázdny alebo nemohol byť načítaný." #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "Stránka, ktorú požadujete, nie je obrázok!" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "V tomto albume sú ďalšie piesne" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "Bol tu problém s komunikáciou s gpodder.net" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Nastal problém pri získavaní metadát z Magnatune" #: podcasts/itunessearchpage.cpp:76 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:56 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:389 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:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 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:187 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:174 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:151 msgid "Third level" msgstr "Tretia úroveň" #: internet/jamendoservice.cpp:171 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/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "Tento album nieje dostupný v požadovanom formáte" #: ../bin/src/ui_deviceproperties.h:381 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:375 msgid "This device supports the following file formats:" msgstr "Toto zariadenie podporuje nasledujúce formáty súborov:" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Toto zariadenie nebude pracovať správne" #: devices/devicemanager.cpp:567 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:324 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:186 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/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "Tento stream je len pre platiacich predplatiteľov" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "Tento typ zariadení nieje podporovaný: %1" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "Časový limit" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Názov" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "Pred spustením Grooveshark rádia, by ste si mali najprv vypočuť niekoľko ďalších Grooveshark piesní" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "Dnes" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "Prepnúť Krásne OSD" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Prepnúť na celú obrazovku" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "Prepínať stav radu" #: ../bin/src/ui_mainwindow.h:718 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:143 msgid "Tomorrow" msgstr "Zajtra" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "Príliš veľa presmerování" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "Top skladby" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "Albumov celkom:" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "Spolu prenesených bytov" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "Spolu urobených požiadavok cez sieť" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Č." #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "Transkódovať hudbu" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "Výpis transkódera" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "Transkódovanie" #: transcoder/transcoder.cpp:312 #, 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:54 msgid "Transcoding options" msgstr "Možnosti transkódovania" #: core/song.cpp:338 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "Turbína" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "Vypnúť" #: devices/giolister.cpp:161 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "URL(y)" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "Heslo na Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "Meno používateľa na Ubuntu One" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "Ultra široké pásmo (UWB)" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Nedá sa stiahnuť %1 (%2)" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "neznámy" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "Neznámy typ obsahu" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Neznáma chyba" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "Nenastavený obal" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "Zrušiť predplatné" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "Pripravované koncerty" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "Aktualizovať Grooveshark playlist" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "Aktualizovať všetky podcasty" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "Aktualizovať zmenené priečinky v zbierke" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "Aktualizovať zbierku pri zapnutí Clementine" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "Aktualizovať tento podcast" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "Aktualizuje sa" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Aktualizovanie %1" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "Aktualizovanie %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Aktualizovanie zbierky" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "Využitie" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "Použiť tag Interprét albumu, ak je dostupný" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "Použiť klávesové skratky GNOME" #: ../bin/src/ui_playbacksettingspage.h:310 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:129 msgid "Use SSLv3" msgstr "Použiť SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "Použiť Wii diaľkové" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "Použiť vlastný set farieb" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "Používať vlastnú správu pre upozornenia" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "Použiť sieťové diaľkové ovládanie" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "Používať autentifikáciu" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "Použiť stroj na správu dátového toku" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "Použiť dynamický režim" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "Použiť upozornenia na oznamovanie stavu Wii diaľkového" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "Použiť časové tvarovanie šumu" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "Použiť základný systémový" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "Použiť pôvoný systémový set farieb" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "Použiť systémové nastavenia proxy" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "Použiť normalizáciu hlasitosti" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "Použitých" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "Používateľ %1 nemá Grooveshark Anywhere účet" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "Používateľské rozhranie" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Meno používateľa" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "Použitie menu na pridanie piesne..." #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "Premenlivý dátový tok" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "Rôzni interpréti" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "Verzia %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "Zobraziť" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "Režim vizualizácií" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "Vizualizácie" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "Nastavenia vizualizácií" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "Detekcia hlasovej činnosti" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "Hlasitosť %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "Varovať ma pri zatvorení karty s playlistom" #: core/song.cpp:337 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "Webstránka" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "Týždne" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "Pri zapnutí Clementine" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "Keď je zoznam prázdny..." #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "Prečo neskúsiť..." #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "Široké pásmo (WB)" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii diaľkové %1: aktivované" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii diaľkové %1: pripojené" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii diaľkové %1: kriticky slabá baterka (%2%) " #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii diaľkové %1: odaktivované" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii diaľkové %1: odpojené" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii diaľkové %1: slabá baterka (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "WMa" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "Bez obalu:" #: library/libraryview.cpp:530 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:2088 msgid "Would you like to run a full rescan right now?" msgstr "Chcete teraz spustiť úplné preskenovanie?" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "Zapísať všetky štatistiky piesní do súborov piesní" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "Nesprávne meno používateľa alebo heslo." #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "Rok" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "Rok - Album" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "Roky" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "Včera" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "Chystáte sa stiahnuť nasledujúce albumy" #: playlist/playlistlistcontainer.cpp:311 #, 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:177 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:172 msgid "You are not signed in." msgstr "Nie ste prihlásený." #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "Ste prihlásený ako %1." #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "Ste prihlásený." #: ../bin/src/ui_groupbydialog.h:123 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/digitallyimportedsettingspage.cpp:46 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/magnatunesettingspage.cpp:53 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:57 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." #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "Môžete skroblovať skladby zadarmo, ale len platiaci predplatitelia môžu streamovať Last.fm rádio z Clementine." #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "Nemáte Grooveshark Anywhere účet." #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Nemáte Spotify prémium účet." #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "Nemáte aktívne predplatné" #: internet/spotifyservice.cpp:170 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/spotifysettingspage.cpp:158 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:87 msgid "You love this track" msgstr "Milujete túto pieseň" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "Potrebujete otvoriť Systémové nastavenia a zapnúť \"Povoliť prístup pre pomocné zariadenia\" na použitie globálnych skratiek v Clementine." #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "Musíte reštartovať Clementine ak chcete zmeniť jazyk." #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "Nebudete môcť prehrávať Last.fm rádio stanice ak nieste Last.fm predplatiteľ." #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "Vaša IP adresa:" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Vaše Last.fm údaje sú neplatné" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "Vaše Magnatune údaje sú neplatné" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "Vaša zbierka je prázdna!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "Vaše rádio streamy" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "Skroblujete: %1" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Vášmu systému chýba OpenGL podpora, vizualizácie nebudú dostupné." #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "Vaše meno používateľa alebo heslo bolo nesprávne." #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Vynulovať" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "pridať %n piesní" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "po" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "pred" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "a" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "automaticky" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "pred" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "medzi" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "najprv najväčšie" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "obsahuje" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "zakázané" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "disk %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "neobsahuje" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "končí na" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "rovná sa" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "gpodder.net" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "gpodder.net priečinok" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "väčšie ako" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "za posledných" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "menšie ako" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "najprv najdlhšie" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "presunúť %n piesní" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "najprv najnovšie" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "sa nerovná" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "nie za posledných" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "nie na" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "najprv najstaršie" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "na" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "možnosti" #: ../bin/src/ui_networkremotesettingspage.h:203 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:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "odstrániť %n piesní" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "najprv najkratšie" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "zamiešať piesne" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "najprv najmenšie" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "zoradiť piesne" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "začína na" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "posledná" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "skladba %1" clementine-1.2.0+dfsg/src/translations/sl.po000066400000000000000000004651311223327513400210560ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # R33D3M33R , 2012-2013 # R33D3M33R , 2013 # FIRST AUTHOR , 2010 # Miha Eleršič , 2012 # Miha Eleršič , 2012 # R33D3M33R , 2013 # R33D3M33R , 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-14 22:26+0000\n" "Last-Translator: R33D3M33R \n" "Language-Team: Slovenian (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr " dni" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " kb/s" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " pt" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " sekund" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " skladb" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 albumov" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 dni" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "pred %1 dnevi" #: podcasts/gpoddersync.cpp:79 #, 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:413 #, qt-format msgid "%1 selected of" msgstr "izbran %1 od" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 skladba" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 skladb" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "najdenih %1 skladb" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "najdenih %1 skladb (prikazanih %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 skladb" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 prenesenih" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: modul Wimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n spodletelih" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n končanih" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "Po &meri" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "Dodatki" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "&Pomoč" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "&Skrij %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "&Skrij ..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Levo" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "&Glasba" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Brez" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "Seznam &predvajanja" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Končaj" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "Način p&onavljanja" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Desno" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "Pre&mešani način" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "Raztegni &stolpce, da se prilegajo oknu" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "&Orodja" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(različno preko več skladb)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "... in vsem razvijalcem Amaroka" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "0 px" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 dan" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 skladba" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "127.0.0.1" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "40 %" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 naključnih skladb" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "Nadgradite na Premium" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "Ustvarite nov račun ali ponastavite geslo" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "Zahtevan je račun Grooveshark Anywhere." #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "Zahtevan je račun Spotify Premium." #: ../bin/src/ui_networkremotesettingspage.h:189 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:78 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:153 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:297 msgid "A-Z" msgstr "A-Ž" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "ALL GLORY TO THE HYPNOTOAD" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "Prekini" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "O %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "O Clementine ..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "O Qt ..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Podrobnosti računa" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "Podrobnosti računa (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Dejanje" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Omogoči/Onemogoči Wiiremote" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "Dodaj podcast" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Dodaj pretok" #: ../bin/src/ui_notificationssettingspage.h:425 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:193 msgid "Add action" msgstr "Dodaj dejanje" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Dodaj še en pretok ..." #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Dodaj mapo ..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "Dodaj datoteko" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "Dodaj datoteko v prekodirnik" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "Dodaj datoteko(-e) v prekodirnik" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Dodaj datoteko ..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Dodajte datoteke za prekodiranje" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Dodaj mapo" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Dodaj mapo ..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Dodaj novo mapo ..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "Dodaj podcast" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "Dodaj podcast ..." #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Dodaj iskalni pojem" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "Dodaj oznako: album" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "Dodaj oznako: izvajalec albuma" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "Dodaj oznako: izvajalec" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "Dodaj samodejno oceno skladbe" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "Dodaj oznako: skladatelj" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "Dodaj oznako: disk" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "Dodaj ime datoteke skladbe" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "Dodaj oznako: žanr" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "Dodaj oznako za združevanje skladb" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "Dodaj oznako: dolžina" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "Dodaj oznako za izvajalca skladbe" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "Dodaj oznako: število predvajanj" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "Dodaj oceno skladbe" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "Dodaj oznako: število preskokov" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "Dodaj oznako: naslov" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "Dodaj oznako: številka skladbe" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "Dodaj oznako: leto" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Dodaj pretok ..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "Dodaj med priljubljene v Grooveshark" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "Dodaj v sezname predvajanja Grooveshark" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "Dodaj na drug seznam predvajanja" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Dodaj na seznam predvajanja" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "Dodaj v vrsto" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Dodaj dejanje wiimotedev" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Dodaj ..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Dodano ta mesec" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Dodano ta teden" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Dodano letos" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Dodano danes" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Dodano v zadnjih treh mesecih" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "Dodajanje skladbe v Mojo glasbo" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "Dodajanje skladbe med priljubljene" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Napredno združevanje ..." #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "Po " #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "Po kopiranju ..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Album (najboljša glasnost za vse skladbe)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Izvajalec albuma" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "Ovitek albuma" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Podrobnosti albuma na jamendo.com ..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Albumi z ovitkom" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Albumi brez ovitka" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Vse datoteke (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "All Glory to the Hypnotoad!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Vsi albumi" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Vsi izvajalci" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "Vse datoteke (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Vsi seznami predvajanja (%1)" #: ui/about.cpp:74 msgid "All the translators" msgstr "Vsem prevajalcem" #: library/library.cpp:84 msgid "All tracks" msgstr "Vse skladbe" #: ../bin/src/ui_networkremotesettingspage.h:194 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:196 msgid "Allow downloads" msgstr "Dovoli prejeme" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "Dovoli kodiranje mid/side (MS)" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "Ob izvirnikih" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Vedno skrij glavno okno" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Vedno pokaži glavno okno" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "Vedno začni s predvajanjem" #: internet/spotifyblobdownloader.cpp:60 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:61 msgid "An error occurred loading the iTunes database" msgstr "Med nalaganjem podatkovne zbirke iTunes je prišlo do napake" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Med zapisovanjem metapodatkov v '%1' je prišlo do napake" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "Prišlo je do nedoločene napake." #: ui/about.cpp:78 msgid "And:" msgstr "In:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "Jezen" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Videz" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Pripni datoteke/naslove URL seznamu predvajanja" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "Pripni trenutnemu seznamu predvajanja" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "Pripni k seznamu predvajanja" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "Uporabi stiskanje za preprečitev odrezanja" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Ali resnično želite izbrisati predlogo nastavitev \"%1\"?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "Ali ste prepričani, da želite izbrisati ta seznam predvajanja?" #: ui/edittagdialog.cpp:769 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:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Izvajalec" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "O izvajalcu" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "Radio izvajalca" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "Oznake izvajalcev" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "Začetnice izvajalca" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Vrsta zvoka" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Overitev ni uspela" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "Avtor" #: ui/about.cpp:65 msgid "Authors" msgstr "Avtorji" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Samodejno" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Samodejno posodabljanje" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "Samodejno razširi enojne kategorije v drevesnem pogledu knjižnice" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "Na voljo" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "Povprečna bitna hitrost" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "Povprečna velikost slike" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "BBC-jevi podcasti" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "udarcev/min" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "Pretoki v ozadju" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Barva ozadja" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "Slika ozadja" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Prekrivnost ozadja" #: core/database.cpp:734 msgid "Backing up database" msgstr "Varnostno kopiranje podatkovne zbirke" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "Ravnovesje" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Izobči" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "Stolpčni preučevalnik" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Preprosta modra" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "Osnovna vrsta zvoka" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Obnašanje" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "Najboljše" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "Biografija iz %1" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Bitna hitrost" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "Bitna hitrost" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "Blokovni preučevalnik" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "Vrsta bloka" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "Raven zabrisanja" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "Telo" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "Preučevalnik Boom" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Prebrskaj ..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "Trajanje medpomnilnika" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "Medpomnjenje" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "Ti viri so onemogočeni:" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Gumbi" #: core/song.cpp:339 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "Podpora predlogam CUE" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "Prekliči" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Spremeni ovitek albuma" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Spremeni velikost pisave ..." #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "Spremeni način ponavljanja" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Spremeni bližnjico ..." #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "Spremeni način naključnega predvajanja" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Sprememba jezika" #: ../bin/src/ui_playbacksettingspage.h:330 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:228 msgid "Check for new episodes" msgstr "Preveri za novimi epizodami" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Preveri za posodobitvami ..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "Izberite ime za vaš pametni seznam predvajanja" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Izberi samodejno" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Izberi barvo ..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "Izberi pisavo ..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Izberi s seznama" #: smartplaylists/querywizardplugin.cpp:155 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." #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "Izberi mapo za prejeme podcastov" #: ../bin/src/ui_songinfosettingspage.h:188 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:115 msgid "Classical" msgstr "Klasična" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "Čiščenje" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Počisti" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Počisti seznam predvajanja" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Napaka v Clementine" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Clementine oranžna" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Clementine predočenja" #: ../bin/src/ui_deviceproperties.h:376 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_boxsettingspage.h:104 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:104 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:104 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_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "Clementine lahko predvaja glasbo, ki ste jo poslali na Ubuntu One" #: ../bin/src/ui_notificationssettingspage.h:431 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:250 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:128 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." #: internet/lastfmsettingspage.cpp:110 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 "Clementine ni mogel pridobiti vašega stanja naročnine, ker so težave z vašo povezavo. Predvajane skladbe bodo predpomnjene in na Last.fm poslane kasneje." #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Pregledovalnik slik Clementine" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "Clementine ni mogel najti rezultatov za to datoteko" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "Clementine bo našel glasbo v:" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Kliknite sem za dodajanje glasbe" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "Kliknite za preklop med preostalim in celotnim časom" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "Zapri seznam predvajanja" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "Zapri predočenje" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "Zaprtje tega okna bo prekinilo prejem." #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "Zaprtje tega okna bo prekinilo iskanje ovitkov albumov." #: ui/equalizer.cpp:116 msgid "Club" msgstr "Klubska" #: ../bin/src/ui_appearancesettingspage.h:272 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:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Opomba" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "Samodejno dopolni oznake" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "Samodejno dopolni oznake ..." #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Skladatelj" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "Nastavi %1 ..." #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "Nastavi Grooveshark ..." #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Nastavi Last.fm ..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "Nastavi Magnatune ..." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Nastavi bližnjice" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "Nastavi Spotify ..." #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "Nastavite Subsonic ..." #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "Nastavi splošno iskanje" #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "Nastavi knjižnico ..." #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "Nastavi podcaste ..." #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "Nastavi ..." #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "Povežite Wii Remotes z uporabo dejanja omogoči/onemogoči" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "Povežite napravo" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "Povezovanje na Spotify" #: internet/subsonicsettingspage.cpp:107 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/subsonicsettingspage.cpp:117 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/" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "Konzola" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "Stalna bitna hitrost" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "Pretvori vso glasbo" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "Pretvori vso glasbo, ki je naprava ne more predvajati" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "Kopiraj v odložišče" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Kopiraj na napravo ..." #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Kopiraj v knjižnico ..." #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "Avtorske pravice" #: internet/subsonicsettingspage.cpp:81 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:64 #, 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" #: transcoder/transcoder.cpp:432 #, 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:426 #, 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/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "Radijske postaje last.fm ni bilo mogoče naložiti" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "Izhodne datoteke %1 ni bilo mogoče odpreti" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Upravljalnik ovitkov" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "Ovitek albuma iz vstavljene slike" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Ovitek albuma je bil samodejno naložen iz %1" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "Ovitek albuma je bil ročno odstranjen iz uporabe" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "Ovitek albuma ni nastavljen" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "Ovitek albuma je nastavljen iz %1" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "Ovitki iz %1" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "Ustvari nov seznam prevajanja Grooveshark" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "Postopni prehod med samodejno spremembo skladb" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "Postopni prehod med ročno spremembo skladb" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Dol" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Gor" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "Po meri" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "Slika po meri:" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "Nastavitve sporočil po meri" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "Radio po meri" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Po meri ..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "Pot DBus" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Plesna" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Datum ustvarjenja" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Datum spremembe" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "Dnevi" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "&Privzeto" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "Zmanjšaj glasnost za 4%" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "Zmanjšaj glasnost za odstotkov" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Zmanjšaj glasnost" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "Privzeta slika ozadja" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "Privzete vrednosti" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "Zakasnitev med predočenji" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "Izbriši" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "Izbriši seznam predvajanja Grooveshark" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "Izbriši prejete podatke" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Izbriši datoteke" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Izbriši iz naprave ..." #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Izbriši iz diska ..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "Izbriši predvajane epizode" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "Izbriši predlogo nastavitev" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "Izbriši pameten seznam predvajanja" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "Izbriši izvorne datoteke" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Brisanje datotek" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "Odstrani izbrane skladbe iz vrste" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "Odstrani skladbo iz vrste" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Cilj" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Podrobnosti ..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Naprava" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Lastnosti naprave" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Ime naprave" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Lastnosti naprave ..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Naprave" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Ste mislili" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "Geslo za Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "Uporabniško ime za Digitally Imported" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "Neposredna povezava na internet" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Mapa" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "Trajanje onemogočenja" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "Onemogoči ustvarjanje moodbara" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Onemogočeno" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Disk" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "Nezvezni prenos (DTX)" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 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:715 msgid "Do a full library rescan" msgstr "Ponovno preišči celotno knjižnico" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "Ne pretvarjaj glasbe" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "Ne prepiši" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Ne ponavljaj" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "Ne prikaži med \"Različni izvajalci\"" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "Ne premešaj" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "Ne zaustavi!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "Donacija" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Dvoklik za odpiranje" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "Dvoklik skladbe bo povzročil sledeče ..." #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "Prejmi %n epizod" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "Mapa prejemov" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "Prejmi epizode v" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "Članstvo prejemanja" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "Samodejno prejmi nove epizode" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "Prejem je v čakalni vrsti" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "Prejmite app za Android" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Prejmi ta album" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Prejmi ta album ..." #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "Prejmi to epizodo" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "Prejmi ..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "Prejemanje (%1 %) ..." #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "Prejemanje imenika Icecast" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "Prejemanje kataloga Jamendo" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "Prejemanje kataloga Magnatune" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "Prejemanje vstavka Spotify" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "Prejemanje metapodatkov" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "Povlecite za spremembo položaja" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "Dropbox" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "Dinamični način je vključen" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "Dinamični naključni miks" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "Uredi pametni seznam predvajanja ..." #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Uredi oznako \"%1\" ..." #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "Uredi oznako ..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "Uredi oznake" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Uredi podrobnosti o skladbi" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "Uredi podrobnosti o skladbi ..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Uredi podrobnosti skladb ..." #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Uredi ..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "Omogoči podporo Wii Remote" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "Omogoči uravnalnik" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "Omogoči bližnjice le, ko je Clementine v žarišču" #: ../bin/src/ui_globalsearchsettingspage.h:147 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:62 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:235 msgid "Encoding complexity" msgstr "Zapletenost kodiranja" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "Kakovost pogona za kodiranje" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "Način kodiranja" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "Vnesite URL" #: ../bin/src/ui_coverfromurldialog.h:103 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:205 msgid "Enter a filename for exported covers (no extension):" msgstr "Vnesite ime datoteke za izvožene ovitke (brez pripone):" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "Vnesite novo ime za ta seznam predvajanja" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Vnesite izvajalca ali oznako za začetek poslušanja radia Last.fm." #: ../bin/src/ui_globalsearchview.h:209 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:77 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:77 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:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "Sem vnesite iskalne pogoje" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "Vnesite naslov URL pretoka internetnega radia:" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "Vnesite ime mape" #: ../bin/src/ui_networkremotesettingspage.h:198 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:87 msgid "Entire collection" msgstr "Celotna zbirka" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Napaka" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Napaka med povezovanjem naprave MTP" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "Napaka med kopiranjem skladb" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "Napaka med brisanjem skladb" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "Napaka med prejemanjem vstavka Spotify" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "Napaka med nalaganjem %1" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Napaka med nalaganjem seznama predvajanja di.fm" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "Napaka med obdelavo %1: %2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "Napaka med nalaganjem glasbenega CD-ja" #: library/library.cpp:63 msgid "Ever played" msgstr "Sploh predvajano" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "Vsakih 10 minut" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "Vsakih 12 ur" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "Vsaki 2 uri" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "Vsakih 20 minut" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "Vsakih 30 minut" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "Vsakih 6 ur" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "Vsako uro" #: ../bin/src/ui_playbacksettingspage.h:303 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:208 msgid "Existing covers" msgstr "Obstoječi ovitki" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "Razširi" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "Poteče %1" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "Izvozi ovitke" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "Izvozi ovitke" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "Izvozi prejete ovitke" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "Izvozi vstavljene ovitke" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "Izvoz končan" #: ui/albumcovermanager.cpp:786 #, 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:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "Pojemaj ob premoru / povečaj ob nadaljevanju" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "Pojemanje glasnosti ob zaustavitvi predvajanja" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "Pojemanje" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "Trajanje pojemanja" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "Imenika ni bilo mogoče prejeti" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "Podcastov ni bilo mogoče prejeti" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "Podcasta ni bilo mogoče naložiti" #: podcasts/podcasturlloader.cpp:167 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:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "Hitro" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "Priljubljene" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "Priljubljene skladbe" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "Pridobi manjkajoče ovitke" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "Samodejno pridobi" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "Prejemanje zaključeno" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "Pridobivanje knjižnice Subsonic" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Napaka med pridobivanjem ovitka" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "Pripona datoteke" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "Vrste datotek" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Ime datoteke" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "Ime datoteke (brez poti)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Velikost datoteke" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Vrsta datoteke" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Ime datoteke" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Datoteke" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "Datoteke za prekodiranje" #: smartplaylists/querywizardplugin.cpp:90 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." #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "Jemanje prstnega odtisa skladbe" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "Končaj" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "Prva raven" #: core/song.cpp:328 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Velikost pisave" #: ../bin/src/ui_spotifysettingspage.h:213 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:204 msgid "Force mono encoding" msgstr "Vsili mono kodiranje" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "Pozabi napravo" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Obrazec" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "Vrsta" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Hitrost sličic" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "Sličic na medpomnilnik" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Prijatelji" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "Zmrznjen" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Polni basi" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "Polni basi in visoki toni" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "Polni visoki toni" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "Zvočni pogon GStreamer" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "Splošno" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Splošne nastavitve" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Zvrst" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "Dobi naslov URL za deljenje tega seznama predvajanja Grooveshark" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "Dobi naslov URL za deljenje te skladbe Grooveshark" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "Pridobivanje seznama priljubljenih skladb iz Grooveshark" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "Pridobivanje kanalov" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "Pridobivanje pretokov" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "Vnesite ime:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "Pojdi" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "Pojdi na naslednji zavihek seznama predvajanja" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "Pojdi na predhodni zavihek seznama predvajanja" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, 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:206 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_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "Napaka med prijavo v Grooveshark" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "Naslov URL seznama predvajanja Grooveshark" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "Radio Grooveshark" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "Naslov URL skladbe Grooveshark" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "Združi knjižnico po ..." #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "Združi po" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "Združi po albumu" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "Združi po izvajalcu" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "Združi po izvajalcu/albumu" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "Združi po izvajalcu/letu - albumu" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "Združi po zvrsti/albumu" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "Združi po zvrsti/izvajalcu/albumu" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "Združevanje" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "Stran HTML ni vsebovala virov RSS" #: internet/subsonicsettingspage.cpp:135 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:163 msgid "HTTP proxy" msgstr "Posredniški strežnik HTTP" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "Srečen" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "Podrobnosti o strojni opremi" #: ../bin/src/ui_deviceproperties.h:372 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:202 msgid "High" msgstr "Visoka" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "Visoko (%1 fps)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "Visoka (1024x1024)" #: internet/subsonicsettingspage.cpp:112 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:310 msgid "Hours" msgstr "Ure" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "Nimam računa Magnatune" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Ikona" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "Ikone na vrhu" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "Prepoznavanje skladbe" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 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:77 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:204 msgid "Ignore \"The\" in artist names" msgstr "Prezri \"The\" v imenih izvajalcev" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Slike (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "čez %1 dni" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "čez %1 tednov" #: ../bin/src/ui_wizardfinishpage.h:86 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/spotifyservice.cpp:360 msgid "Inbox" msgstr "Prejeto" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "Vključi ovitek albuma v obvestilo" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "Vključi vse skladbe" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Nezdružljiva različica protokola REST za Subsonic. Odjemalec mora nadgraditi." #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Nezdružljiva različica protokola REST za Subsonic. Strežnik mora nadgraditi." #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Nepopolna nastavitev, prepričajte se, da so vsa polja izpolnjena." #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "Povečaj glasnost za 4%" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "Povečaj glasnost za odstotkov" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Povečaj glasnost" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "Izgradnja kazala za %1" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "Podrobnosti" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "Vstavi ..." #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Nameščeno" #: core/database.cpp:673 msgid "Integrity check" msgstr "Preverjanje celovitosti" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "Ponudniki interneta" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "Neveljaven ključ API" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Neveljavna vrsta" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "Neveljavni način" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "Neveljavni parametri" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "Podan je bil neveljaven vir" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "Neveljavna storitev" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "Neveljavni ključ seje" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "Neveljavno uporabniško ime in/ali geslo" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "Jamendo: najbolj poslušane skladbe" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "Jamendo: najboljše skladbe" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "Jamendo: najboljše skladbe meseca" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "Jamendo: najboljše skladbe tedna" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "Podatkovna zbirka Jamendo" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "Skoči na trenutno predvajano skladbo" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Ohrani gumbe za %1 sekundo ..." #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Ohrani gumbe za %1 sekund ..." #: ../bin/src/ui_behavioursettingspage.h:193 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:193 msgid "Keep the original files" msgstr "Ohrani izvorne datoteke" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "Mucke" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Jezik" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "Prenosnik/slušalke" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Velika dvorana" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "Velik ovitek albuma" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "Velika stranska vrstica" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "Zadnjič predvajano" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "Radio po meri Last.fm: %1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Knjižnica Last.fm - %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "Miks radio Last.fm - %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Radio soseske Last.fm - %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Radio postaja Last.fm - %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Last.fm izvajalci podobni %1" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Radio oznak Last.fm: %1" #: internet/lastfmservice.cpp:437 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:154 msgid "Last.fm password" msgstr "Geslo Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "Število predvajanj last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Oznake Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Uporabniško ime Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Wiki last.fm" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "Najmanj priljubljene skladbe" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "Pustite prazno za privzeto. Primeri: \"/dev/dsp\", \"front\", itd." #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "Levo" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Dolžina" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Knjižnica" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "Napredno združevanje v knjižnici" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "Obvestilo ponovnega preiskovanja knjižnice" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "Iskanje po knjižnici" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Omejitve" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "Poslušajte skladbe iz Grooveshark glede na tiste, ki ste jih že poslušali" #: ui/equalizer.cpp:123 msgid "Live" msgstr "V živo" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Naloži" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "Naloži ovitek iz naslova URL" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "Naloži ovitek iz naslova URL ..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "Naloži ovitek iz diska" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "Naloži ovitek iz diska ..." #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "Naloži seznam predvajanja" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "Naloži seznam predvajanja ..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Nalaganje radia Last.fm" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Nalaganje naprave MTP" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "Nalaganje zbirke podatkov iPod" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "Nalaganje pametnega seznama predvajanja" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "Nalaganje skladb" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "Nalaganje pretoka" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "Nalaganje skladb" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "Nalaganje podrobnosti o skladbah" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "Nalaganje ..." #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "Naloži datoteke/naslove URL in zamenjaj trenutni seznam predvajanja" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Prijava" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "Prijava je spodletela" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "Profil daljnosežnega predvidevanja (LTP)" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "Priljubljena" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Nizko (%1 fps)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "Nizka (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "Profil nizke kompleksnosti (LC)" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "Besedila" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "Besedila iz %1" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Prejemi Magnatune" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Prejem Magnatune je končan" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "Glavni profil (MAIN)" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "Izvedi to!" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "Seznam predvajanja naj bo na voljo tudi brez povezave" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "Napačno oblikovan odziv" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "Ročna nastavitev posredniškega strežnika" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "Ročno" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "Proizvajalec" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "Označi kot poslušano" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "Označi kot novo" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "Ujemanje s vsakim pogojem iskanja (IN)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "Ujemanje enega ali več pogojev iskanja (ALI)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "Največja bitna hitrost" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "Srednje (%1 fps)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "Srednja (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "Vrsta članstva" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "Najmanjša bitna hitrost" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "Manjkajoče predloge nastavitev projectM" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "Model" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "Spremljaj knjižnico za spremembami" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "Predvajanje v načinu mono" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "Meseci" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "Razpoloženje" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "Slog vrstice razpoloženja" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "Vrstice razpoloženja" #: library/library.cpp:74 msgid "Most played" msgstr "Najbolj predvajano" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "Priklopna točka" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "Priklopne točke" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "Premakni dol" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "Premakni v knjižnico ..." #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "Premakni gor" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "Glasba" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Glasbena knjižnica" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "Utišaj" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "Moja knjižnica Last.fm" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "Moj miks radio Last.fm" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "Moja soseska Last.fm" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "Moj radio priporočenih Last.fm" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "Moj miks radio" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "Moja glasba" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "Moja soseska" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "Moja radijska postaja" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "Moja priporočila" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Ime" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "Možnosti poimenovanja" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "Ozek pas (NB)" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "Sosedje" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "Omrežje" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "Omrežni posredniški strežnik" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "Omrežni nadzor" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "Nikoli" #: library/library.cpp:67 msgid "Never played" msgstr "Nikoli predvajano" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "Nikoli ne začni s predvajanjem" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "Nova mapa" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "Nov seznam predvajanja" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "Nov pametni seznam predvajanja" #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "Nove skladbe" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "Nove skladbe bodo samodejno dodane." #: library/library.cpp:80 msgid "Newest tracks" msgstr "Najnovejše skladbe" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "Naslednji" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Naslednja skladba" #: core/utilities.cpp:147 msgid "Next week" msgstr "Naslednji teden" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "Brez preučevalnika" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "Brez slike ozadja" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "Ni ovitkov za izvoz." #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "Brez dolgih blokov" #: playlist/playlistcontainer.cpp:366 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:145 msgid "No short blocks" msgstr "Brez kratkih blokov" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "Brez" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 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:155 msgid "Normal" msgstr "Običajno" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "Običajna vrsta bloka" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "Ni razpoložljivo med uporabo dinamičnega seznama predvajanja" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "Brez povezave" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "Ni dovolj vsebine" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "Ni dovolj oboževalcev" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "Ni dovolj članov" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "Ni dovolj sosedov" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Ni nameščeno" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "Niste prijavljeni" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "Ni priklopljeno - dvokliknite za priklop" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "Vrsta obvestila" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Obvestila" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Se predvaja" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "Predogled prikaza na zaslonu" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "Motnost" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "Odpri %1 v brskalniku" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "Odpri &zvočni CD ..." #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "Odpri datoteko OPML" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "Odpri datoteko OPML ..." #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "Odpri napravo" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "Odpri datoteko ..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "Odpri v Google Drive" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "Odpri v novem seznamu predvajanja" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Odpri ..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "Opravilo je spodletelo" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "Optimiraj za bitno hitrost" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "Optimiraj za kakovost" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "Možnosti ..." #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "Organiziraj datoteke" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "Organiziraj datoteke ..." #: core/organise.cpp:65 msgid "Organising files" msgstr "Organiziranje datotek" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "Izvorne oznake" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Druge možnosti" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "Izhod" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "Izhodna naprava" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "Možnosti izhoda" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "Vstavek izhoda" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "Prepiši vse" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "Prepiši obstoječe datoteke" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "Prepiši le manjše" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "Lastnik" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "Razčlenjanje kataloga Jamendo" #: ui/equalizer.cpp:124 msgid "Party" msgstr "Zabava" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "Geslo" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Naredi premor" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "Naredi premor predvajanja" #: widgets/osd.cpp:156 msgid "Paused" msgstr "V premoru" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "Izvajalec" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "Slikovna točka" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "Navadna stranska vrstica" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Predvajaj" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "Predvajaj izvajalca ali oznako" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "Predvajaj radio izvajalca ..." #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "Število predvajanj" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "Predvajaj radio po meri ..." #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "Predvajaj, če je zaustavljeno, napravi premor, če se predvaja" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "Predvajaj, če se trenutno ne predvaja nič" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "Predvajaj radio oznak ..." #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "Predvajaj -to skladbo v seznamu predvajanja" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "Predvajaj/premor" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Predvajanje" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Možnosti predvajalnika" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "Seznam predvajanja" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "Seznam predvajanja je končan" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "Možnosti seznama predvajanja" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "Vrsta seznama predvajanja" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "Seznami predvajanja" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "Zaprite vaš brskalnik in se vrnite v Clementine." #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "Stanje vstavka:" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "Podcasti" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Pop" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "Priljubljene skladbe" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "Priljubljene skladbe meseca" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "Današnje priljubljene skladbe" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "Trajanje pojavnega obvestila" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "Vrata" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "Predojačanje" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "Možnosti" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "Možnosti ..." #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "Prednostna imena datotek ovitkov albumov (ločena z vejico)" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "Prednostna vrsta zvoka" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "Zaželena bitna hitrost" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "Prednostna vrsta" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "Vrsta zvoka za Premium račun" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "Predloga nastavitev:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "Pritisnite kombinacijo gumbov za" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "Pritisnite tipko" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Pritisnite kombinacijo tipk, ki jo želite uporabiti za %1 ..." #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "Možnosti za lep prikaz na zaslonu" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "Predogled" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "Predhodni" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 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:131 msgid "Profile" msgstr "Profil" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "Napredek" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 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:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "Kakovost" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "Poizvedovanje po napravi ..." #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "Upravljalnik vrste" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "Postavi izbrane skladbe v vrsto" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "Postavi skladbo v vrsto" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "Radio (enaka glasnost za vse skladbe)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "Radio" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "Dež" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "Naključno predočenje" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "Oceni trenutno skladbo: 0 zvezdic" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "Oceni trenutno skladbo: 1 zvezdica" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "Oceni trenutno skladbo: 2 zvezdici" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "Oceni trenutno skladbo: 3 zvezdice" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "Oceni trenutno skladbo: 4 zvezdice" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "Oceni trenutno skladbo: 5 zvezdic" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "Ocena" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "Resnično prekličem?" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "Presežena je bila omejitev preusmeritev, preverite nastavitev strežnika." #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "Osveži" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "Osveži katalog" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "Osveži kanale" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "Osveži seznam prijateljev" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "Osveži seznam postaj" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "Osveži pretoke" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Reggae" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "Zapomni si Wii remote zamah" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "Zapomni si od zadnjič" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Odstrani" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "Odstrani dejanje" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "Odstrani podvojene iz seznama predvajanja" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "Odstrani mapo" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "Odstrani iz Moje glasbe" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "Odstrani iz priljubljenih" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "Odstrani iz seznama predvajanja" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "Odstrani seznam predvajanja" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "Odstrani sezname predvajanja" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "Odstranjevanje skladb iz Moje glasbe" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "Odstranjevanje skladb iz priljubljenih" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "Preimenuj seznam predvajanja \"%1\"" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "Preimenuj seznam predvajanja Grooveshark" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "Preimenuj seznam predvajanja" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "Preimenuj seznam predvajanja ..." #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "Znova oštevilči skladbe v naslednjem vrstnem redu ..." #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Ponavljanje" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "Ponavljaj album" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "Ponavljaj seznam predvajanja" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "Ponavljaj skladbo" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Zamenjaj trenuten seznam predvajanja" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "Zamenjaj seznam predvajanja" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "Zamenja presledke s podčrtaji" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "Jakost predvajanja" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "Način Jakosti predvajanja" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "Znova napolni" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "Zahtevaj overitveno kodo" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "Ponastavi" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" msgstr "Ponastavi število predvajanj" #: 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:206 msgid "Restrict to ASCII characters" msgstr "Omeji na znake ASCII" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "Ob zagonu nadaljuj s predvajanjem" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "Pridobivanje skladb Grooveshark iz Moje glasbe" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "Pridobivanje priljubljenih skladb Grooveshark" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "Pridobivanje seznamov predvajanja Grooveshark" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "Vrni se v Clementine" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "Desno" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "Zaženi" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "Posredniški strežnik SOCKS" #: internet/subsonicsettingspage.cpp:122 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:202 msgid "Safely remove device" msgstr "Varno odstrani napravo" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "Varno odstrani napravo po kopiranju" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "Hitrost vzorčenja" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "Hitrost vzorčenja" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "Shrani datoteke .mood v vašo glasbeno knjižnico" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "Shrani ovitek albuma" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "Shrani ovitek na disk ..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "Shrani sliko" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "Shrani seznam predvajanja" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "Shrani seznam predvajanja ..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "Shrani predlogo nastavitev" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "Shrani ocene v oznake datotek, če je to mogoče" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "Shrani statistike v oznake datotek, če je to mogoče" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "Shrani ta pretok v zavihek Internet" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "Shranjevanje statistike skladb v datoteke skladb" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "Shranjevanje skladb" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "Profil prilagodljive vzorčne hitrosti (SSR)" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "Umeri velikost" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "Rezultat" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "Pošlji podatke o predvajanih skladbah" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "Poišči" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "Poišči postaje Icecast" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "Poišči na Jamendo" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Poišči na Magnatune" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "Poišči na Subsonicu" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "Poišči ovitke albumov ..." #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "Poišči karkoli" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "Poišči na gpodder.net" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "Poišči na iTunes" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "Način iskanja" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "Možnosti iskanja" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "Rezultati iskanja" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "Iskalni pojmi" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "Iskanje po Grooveshark" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "Druga raven" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "Previj nazaj" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "Previj naprej" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "Previj trenutno predvajano skladbo za relativno količino" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "Previj trenutno predvajano skladbo na absoluten položaj" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "Izberi vse" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "Odstrani izbor" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "Izberite barvo ozadja:" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "Izberi sliko ozadja" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "Izberi najboljše mogoče ujemanje" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "Izberite barvo ospredja:" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "Izberi predočenja" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "Izberi predočenja ..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "Zaporedna številka" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "Naslov URL strežnika" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "Podrobnosti strežnika" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "Storitev je nepovezana" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Nastavi %1 na \"%2\" ..." #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "Nastavi glasnost na odstotkov" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "Nastavi vrednost za vse izbrane skladbe ..." #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "Nastavitve" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Bližnjica" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "Bližnjica za %1" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Bližnjica za %1 že obstaja" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Pokaži" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "Pokaži prikaz na zaslonu" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "Pokaži žarečo animacijo na trenutni skladbi" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "Pokaži vrstico razpoloženja v vrstici napredka skladbe" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "Prikaži lastno obvestilo namizja" #: ../bin/src/ui_notificationssettingspage.h:442 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:441 msgid "Show a notification when I change the volume" msgstr "Prikaži obvestilo ob spremembi glasnosti" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "Prikaži pojavno okno iz sistemske vrstice" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "Pokaži lep prikaz na zaslonu" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "Pokaži nad vrstico stanja" #: ui/mainwindow.cpp:460 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:209 msgid "Show cover art in library" msgstr "Pokaži ovitek albuma v knjižnici" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "Pokaži razdelilnike" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "Pokaži v polni velikosti ..." #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "Pokaži v brskalniku datotek ..." #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "Pokaži med \"Različni izvajalci\"" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "Pokaži vrstico razpoloženja" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "Pokaži samo podvojene" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "Pokaži samo tiste brez oznak" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "Prikaži iskalne predloge" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "Pokaži gumbe \"Priljubljena\" in \"Blokiraj\"" #: ../bin/src/ui_lastfmsettingspage.h:158 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:192 msgid "Show tray icon" msgstr "Pokaži ikono v sistemski vrstici" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "Prikaži kateri viri so omogočeni in kateri onemogočeni" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "Pokaži/Skrij" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Premešaj" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "Premešaj albume" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "Premešaj vse" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "Premešaj seznam predvajanja" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "Premešaj skladbe v tem albumu" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "Prijava" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "Odjavi se" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "Prijavljanje ..." #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "Podobni izvajalci" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "Velikost" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "Velikost:" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "Skoči nazaj po seznamu predvajanja" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "Število preskočenih" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "Skoči naprej po seznamu predvajanja" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "Majhen ovitek albuma" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "Majhna stranska vrstica" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "Pametni seznam predvajanja" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "Pametni seznami predvajanja" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "Podrobnosti o skladbi" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "O skladbi" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "Sonogram" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "Oprostite" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "Razvrsti po zvrsti (po abecednem redu)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "Razvrsti po zvrsti (po priljubljenosti)" #: ../bin/src/ui_icecastfilterwidget.h:77 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" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "Vir" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "Viri" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "Napaka med prijavo na Spotify" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "Vstavek Spotify" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "Vstavek Spotify ni nameščen" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "Običajno" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "Z zvezdico" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "Predvajaj skladbo, ki je označena v seznamu predvajanja" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "Začni s prekodiranjem" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 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:405 #, qt-format msgid "Starting %1" msgstr "Začenjanje %1" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "Začenjanje ..." #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "Postaje" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Zaustavi" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "Zaustavi po" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "Zaustavi po tej skladbi" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Zaustavi predvajanje" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "Zaustavi predvajanje po trenutni skladbi" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "Zaustavljeno" #: core/song.cpp:341 msgid "Stream" msgstr "Pretok" #: internet/subsonicsettingspage.cpp:30 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:160 msgid "Streaming membership" msgstr "Članstvo pretakanja" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "Naročeni seznami predvajanja" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "Naročniki" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "Uspeh!" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "Uspešno zapisan %1" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "Predlagane oznake" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "Povzetek" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "Zelo visoko (%1 fps)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "Zelo visoko (2048x2048)" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "Podprte vrste" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "Uskladi statistike v datoteke zdaj" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "Usklajevanje mape Spotify - prejeto" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "Usklajevanje seznama predvajanja Spotify" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "Usklajevanje označenih skladb v Spotify" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "Sistemske barve" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "Zavihki na vrhu" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Oznaka" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "Prejemnik oznak" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "Radio oznak" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "Ciljna bitna hitrost" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "Možnosti besedila" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Zahvala gre" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Ukaza \"%1\" ni bilo mogoče zagnati." #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "Ovitek albuma skladbe, ki se trenutno predvaja" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "Mapa %1 ni veljavna" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "Seznam predvajanja '%1' je prazen ali pa ga ni bilo mogoče naložiti." #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "Zahtevana stran ni slika!" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "V tem albumu so druge skladbe" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "Med komunikacijo z gpodder.net je prišlo do težave" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Med pridobivanjem metapodatkov iz Magnatune je prišlo do težave" #: podcasts/itunessearchpage.cpp:76 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:56 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:389 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:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 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:187 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:174 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:151 msgid "Third level" msgstr "Tretja raven" #: internet/jamendoservice.cpp:171 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/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "Ta album ni na voljo v zahtevani obliki" #: ../bin/src/ui_deviceproperties.h:381 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:375 msgid "This device supports the following file formats:" msgstr "Ta naprava podpira sledeče vrste datotek:" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Ta naprava ne bo delovala pravilno" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "To možnost lahko spremenite v \"Obnašanje\"" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "Ta pretok je le za plačane naročnike" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "Ta vrsta naprave ni podprta: %1" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "Časovna omejitev" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Naslov" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "Da zaženete radio Grooveshark, morate najprej poslušati nekaj drugih skladb Grooveshark" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "Danes" #: core/globalshortcuts.cpp:59 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:1369 msgid "Toggle queue status" msgstr "Preklopi stanje vrste" #: ../bin/src/ui_mainwindow.h:718 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:143 msgid "Tomorrow" msgstr "Jutri" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "Preveč preusmeritev" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "Najboljše skladbe" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "Skupno albumov:" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "Skupno prenesenih bajtov" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "Skupno število omrežnih zahtev" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Skladba" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "Prekodiraj glasbo" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "Dnevnik prekodirnika" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "Prekodiranje" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Prekodiranje %1 datotek z uporabo %2 niti" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "Možnosti prekodiranja" #: core/song.cpp:338 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "Turbina" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "Izklopi" #: devices/giolister.cpp:161 msgid "URI" msgstr "Naslov URI" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "Naslovi URL" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "Geslo Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "Uporabniško ime Ubuntu One" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "Zelo širok pas (UWB)" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Ni bilo mogoče prejeti %1 (%2)" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Neznano" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "Neznan content-type" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Neznana napaka" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "Odstrani ovitek" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "Ukini naročnino" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "Prihajajoči koncerti" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "Posodobi seznam predvajanja Grooveshark" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "Posodobi vse podcaste" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "Posodobi spremenjene mape v knjižnici" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "Posodobi knjižnico ob zagonu Clementine" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "Posodobi ta podcast" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "Posodabljanje" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Posodabljanje %1" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "Posodabljanje %1 % ..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Posodabljanje knjižnice" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "Uporaba" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "Uporabi oznako Izvajalca albuma, če je ta na voljo" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "Uporabi bližnjice Gnome" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "Uporabi metapodatke Jakosti predvajanja, če je mogoče" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "Uporabi SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "Uporabi Wii Remote" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "Izberite seznam barv po meri" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "Za obvestila uporabi sporočila po meri" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "Uporabi omrežni oddaljeni nadzor" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "Uporabi overitev" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "Uporabi pogon za upravljanje bitne hitrosti" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "Uporabi dinamični način" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "Uporabi obvestila za poročanje o stanju Wii Remote" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "Uporabi začasno oblikovanje šuma" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "Uporabi privzeto za sistem" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "Uporabi sistemsko privzeti seznam barv" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "Uporabi nastavitve posredniškega strežnika sistema" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "Uporabi izenačevanje glasnosti" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "Uporabljeno" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "Uporabnik %1 nima računa Grooveshark Anywhere" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "Uporabniški vmesnik" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Uporabniško ime" #: ../bin/src/ui_behavioursettingspage.h:207 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:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "Spremenljiva bitna hitrost" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "Različni izvajalci" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "Različica %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "Pogled" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "Način predočenja" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "Predočenja" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "Nastavitve predočenja" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "Zaznava dejavnosti glasu" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "Glasnost %1 %" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "Opozori med pred zapiranjem zavihkov seznamov predvajanja" #: core/song.cpp:337 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "Spletišče" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "Tednov" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "Ko se Clementine zažene" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "Ko je seznam prazen ..." #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "Zakaj ne bi poskusili ..." #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "Širok pas (WB)" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii Remote %1: omogočen" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii Remote %1: povezan" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii Remote %1: kritična baterija (%2%) " #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii Remote %1: onemogočen" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii Remote %1: nepovezan" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Remote %1: šibka baterija (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "Windows Media Audio" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "Brez ovitka:" #: library/libraryview.cpp:530 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:2088 msgid "Would you like to run a full rescan right now?" msgstr "Ali želite opraviti ponovno preiskovanje celotne knjižnice?" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "Zapiši vse statistike skladb v datoteke skladb" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "Napačno uporabniško ime ali geslo." #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "Leto" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "Leto - Album" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "Let" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "Včeraj" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "Pravkar boste prejeli naslednje albume" #: playlist/playlistlistcontainer.cpp:311 #, 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:177 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:172 msgid "You are not signed in." msgstr "Niste prijavljeni." #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "Prijavljeni ste kot %1." #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "Ste prijavljeni." #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "Spremenite lahko kako so skladbe organizirane v knjižnici" #: internet/digitallyimportedsettingspage.cpp:46 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/magnatunesettingspage.cpp:53 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:57 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." #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "Brezplačno lahko uporabljate pošiljanje seznamov predvajanih skladb, toda le plačniki lahko poslušajo radio Last.fm v Clementine." #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "Nimate računa Grooveshark Anywhere." #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Nimate računa Spotify Premium." #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "Nimate dejavne naročnine" #: internet/spotifyservice.cpp:170 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/spotifysettingspage.cpp:158 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:87 msgid "You love this track" msgstr "To je vaša priljubljena skladba" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "V sistemskih nastavitvah morate vklopiti \\\"Omogoči dostop za pomožne naprave\\\", da boste lahko uporabili splošne bližnjice v Clementine." #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "Za spremembo jezika morate ponovno zagnati Clementine" #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "Ne boste mogli predvajati radio postaj Last.fm, če niste njihov naročnik." #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "Vaš naslov IP:" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Vaša poverila Last.fm so bila napačna" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "Vaša poverila Magnatune so bila napačna" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "Vaša knjižnica je prazna!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "Vaši radio pretoki" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "Vaši poslani seznami predvajanih skladb: %1" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Predočenja niso na voljo, ker vašemu sistemu manjka podpora OpenGL" #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "Vaše uporabniško ime ali geslo je bilo napačno." #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Ž-A" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Brez" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "dodaj %n skladb" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "po" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "nazaj" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "in" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "samodejno" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "pred" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "med" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "najprej največji" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "udarcev/min" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "vsebuje" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "onemogočeno" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "disk %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "ne vsebuje" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "se konča z" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "je enako" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "gpodder.net" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "mapa gpodder.net" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "večje kot" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "v zadnjih" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "kb/s" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "manjše od" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "najprej najdaljši" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "premakni %n skladb" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "najprej novejši" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "ni enako" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "ne v zadnjih" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "ne na" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "najprej starejši" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "v" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "možnosti" #: ../bin/src/ui_networkremotesettingspage.h:203 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:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "odstrani %n skladb" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "najprej krajši" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "premešaj skladbe" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "najprej manjši" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "razvrsti skladbe" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "se začne z" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "zaustavi" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "skladba %1" clementine-1.2.0+dfsg/src/translations/sr.po000066400000000000000000004544741223327513400210740ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # FIRST AUTHOR , 2010 # Jovana Savic , 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:08+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Serbian (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " kb/s" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " pt" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " секунди" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " песме" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 албума" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 дана" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "пре %1 дана" #: podcasts/gpoddersync.cpp:79 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 листа нумера (%2)" #: playlist/playlistmanager.cpp:413 #, qt-format msgid "%1 selected of" msgstr "%1 odabrano od" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 pesama" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 pesama pronađeno" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 песама пронађено (приказујем %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 нумера" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 prebačeno" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimotedev module" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n неуспешно" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n завршено" #: transcoder/transcodedialog.cpp:192 #, c-format msgid "%n remaining" msgstr "%n преостало" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "&Поравнај текст" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&Centrirano" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "&Custom" msgstr "&Посебно" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "Специјалитети" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "Помоћ" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "Сакриј %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "Сакриј..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Лево" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "Музика" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Ниједна" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "Листа нумера" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Напусти" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "Режим понављања" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Десно" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "Испретумбани режим" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "&Развуци редове да одговарају прозору" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "Алатке" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(другачије кроз разне песме)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "И сви они који су доприниели Амароку" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 дан" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 нумера" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128к МП3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 насумичних песама" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "Upgrade to Premium now" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "" #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "Потребан је Spotify Premium налог" #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:78 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:153 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Песма ће бити укључена у листу ако задовољава ове услове." #: smartplaylists/searchterm.cpp:297 msgid "A-Z" msgstr "А-Ш" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "ААЦ" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "" #: core/song.cpp:336 msgid "AIFF" msgstr "АИФФ" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "О %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "О Клементини" #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "Више о Qt..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Детаљи о налогу" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Радња" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Укључи/Искључи Wii даљински" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Додај ток" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "Додај радњу" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Додај још један ток" #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Додај фасциклу" #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Додај фајл" #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Додај фајлове за транскодирање" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Додај фасциклу" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Додај фасциклу..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Додај нову фасциклу..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Додај тражени појам" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "Додај ознаку године песме" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Додај ток..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "Додај у другу листу" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Додај у листу нумера" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "Стави у ред" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Додај wiimotedev акцију" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Додај..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Додато овог месеца" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Додато ове недеље" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Додато ове године" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Додато данас" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Додато у последња три месеца" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Напредно груписање" #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "После умножавања...." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Албум" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Албум (идеална јачина за све песме)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Извођач албума" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Албум инфо на jamendo.com...." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Албуми са омотима" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Албуми без омота" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Сви фајлови (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Сви албуми" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Сви извођачи" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "Сви фајлови" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Све листе нумера (%1)" #: ui/about.cpp:74 msgid "All the translators" msgstr "Сви преводиоци" #: library/library.cpp:84 msgid "All tracks" msgstr "Све нумере" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "Поред оригинала" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Увек сакриј главни прозор" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Увек прикажи главни прозор" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "Увек почни да свираш" #: internet/spotifyblobdownloader.cpp:60 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:61 msgid "An error occurred loading the iTunes database" msgstr "Дошло је до грешке услед учитавања базе података iTunes" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Дошло је до грешке услед писања метаподатака на '%1'" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:78 msgid "And:" msgstr "И:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Изглед" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Додај нумере/УРЛ токове у листу нумера" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "Додај у тренутну листу нумера" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "Додај у листу нумера" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "Примени компресије како би се спречило одсецање" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Сигурнисте да желите обрисати претподешавање \"%1\"?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "Да ли сте сигурни да желите да поништите статистику ове песме?" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Извођач" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Инфо извођача" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "Радио извођача" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "Ознаке извођача" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "Иницијали извођача" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Формат звука" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Аутентификација није успела" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "" #: ui/about.cpp:65 msgid "Authors" msgstr "Аутори" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Ауто" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Аутоматско ажурирање" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "Аутоматски отвори појединачне категорије у стаблу библиотеке" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "Доступно" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "Просечни проток бита" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "Просечна величина слике" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "ОПМ" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "Позадински токови" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Боја позадине" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Непрозирност позадине" #: core/database.cpp:734 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Забрани" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "Трака анализатора" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Основно плаво" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Понашање" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "Најбољи" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "Биографија из %1" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Битски проток" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "Битски проток" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "Блок анализатор" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "Тип блока" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "Бум анализатор" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Прегледај..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Дугмад" #: core/song.cpp:339 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "CUE подршка листа" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "Otkaži" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Промени слику насловне" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Промени величину фонта..." #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "Промени понављање" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Промени пречицу..." #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "Промени насумичност" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Promeni jezik" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Потражи ажурирања..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "Изабери име за своју паметну листу" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Аутоматски одабери" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Одабери боју..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "Odaberi font" #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Одабери са листе" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Odaberi kako je lista sortirana i koliko će pesama sadržati." #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Изабери сајт који ти хоћеш да Клементина користи при тражењу текста." #: ui/equalizer.cpp:115 msgid "Classical" msgstr "Класика" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Очисти" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Очисти листу нумера" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Клементина" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Грешка Клементине" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Клементина наранџаста" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Визуелизација Клементине" #: ../bin/src/ui_deviceproperties.h:376 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Клементина може аутоматски да конвертује музику коју ти умножиш на овај уређај у формат који може бити пуштен." #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "Клементина може приказивати поруке приликом измена нумера" #: ../bin/src/ui_podcastsettingspage.h:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Клементина не може учитати пројекатМ визуализацију. Проверите да ли сте правилно инсталирали Клементину." #: internet/lastfmsettingspage.cpp:110 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 "Клементина није могла да узме твој претплатнички статус пошто има проблема са твојом конекцијом. Пуштене нумере ће бити кеширане и касније послате на Last.fm." #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Клеметинин прегледач слика" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "Клементине није била у могућности да нађе резултате за овај фајл." #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Кликни овде да додате неку музику" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "Кликни да би мењао између преосталог и укупног времена" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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 "Zatvori" #: playlist/playlisttabbar.cpp:54 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "Затвори визуелизацију" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "Затварање овог прозора прекинуће преузимање" #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "Затварање овог прозора прекинуће потрагу за омотима албума" #: ui/equalizer.cpp:116 msgid "Club" msgstr "Клуб" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Зарез раздваја листу од класа:ниво, ниво је 0-3" #: playlist/playlist.cpp:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Коментар" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "Попуни ознаке аутоматски" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "Попуни ознаке аутоматски..." #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Композитор" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "" #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "" #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Подеси ЛастФМ" #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "Подеси Магнатјун" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Подеси пречице" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "Подеси Spotify..." #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "Подеси библиотеку" #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "" #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "Повежи Wii даљинске користећи укључено/искључено акције." #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "Повежи уређај" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "Повежи се на Spotify" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "Константан битни проток" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "Претвори сву музику" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "Претвори сву музику коју уређај не може да пусти." #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Умножи на уређај...." #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Копирај у библиотеку" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:64 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Не могу да направим Гстример елемент \"%1\" - проверите да ли су инсталирани сви Гстример прикључци" #: transcoder/transcoder.cpp:432 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "Не може да нађе муксер за %1, провери да ли имаш уграђен исправан додатак Гстримера" #: transcoder/transcoder.cpp:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Не може да нађе енкодер за %1, провери да ли имаш уграђен исправан додатак Гстримера" #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "Не може да учита last.fm радио станицу" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "Не могу да отворим излазни фајл %1" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Менаџер омота" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "Омотница из уграђене слике" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Омитница учитана аутоматски на %1" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "Омотница није намештена ручно" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "Омотница није намештена" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "Омотница намештена на %1" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "Омотница на %1" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "Претапање при аутоматској измени нумера" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "Претапање при ручној измени нумера" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "Прилагођено" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Посебно..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "Дбус путања" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Денс" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Направљено" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Измењено" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "Dani" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "Под&разумевано" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "Утишај јачину звука за 4%" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Утишај звук" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "Podrazumevano" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "Застој између визуелизација" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Obriši fajlove" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Избруши са уређаја" #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Обриши са диска..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "Обриши претподешавање" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "Избриши паметну листу" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "Избриши оригиналне фајлове" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Бришем фајлове" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "Избаци означене нумере из реда" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "Избаци нумеру из реда" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Одредиште" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Детаљи..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Уређај" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Својства уређаја" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Ime uređaja" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Својства уређаја..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Уређаји" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Да ли сте мислили" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "Директна интернет веза" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Фасцикла" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "Онемогући трајање" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Искључено" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Диск" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "Непрекидно пребацивање" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "Опције приказа" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Прикажи екрански преглед" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "Уради поновно скенирање библиотеке" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "Немој претварати омотницу" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Не понављај" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "Немој показивати различите извођаче" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "Не пуштај нумере наизменично" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "Не заустављај!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Кликни двапут да отвориш" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "Двостуки клик на песму ће..." #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "Фасцикла за преузимање" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "Преузмите чланство" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Преузми овај албум" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Preuzmi ovaj albm" #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "Preuzmi..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "Преузимање Icecast директоријума" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "Преузимање Jamendo каталога" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "Преузми Магнатјунов каталог" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "Преузимање Spotify додатка" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "Преузимање метаподатака" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "Одвуците га где желите" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "Промењив режим је укључен" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "Промењиво насумично мешање" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "Измени паметну листу" #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Уреди ознаку \"%1\"..." #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "Уреди ознаку..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "Измени ознаке" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Уреди податке о нумери" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "Уреди податке о нумери..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Измени податке о нумери" #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Уреди..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "Омогући Wii Remote подршку" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "Укључи еквилајзер" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "Омогући пречице само кад је Клементина у фокусу" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "Унеси нови назив листе нумера" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Унесите извођача or ознаку да почнете са слушањем ЛастФМ радиа." #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "Унесите израз за претрагу" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "Унеси УРЛ интернет радио ток" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "Читава колекција" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Грешка" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Грешка повезивања МТП уређаја" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "Грешка при умножавању песама" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "Грешка при брисању песама" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "Грешка преузимања Spotify додатка" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "Грешка при учитавању %1" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "Грешка при обради %1: %2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "Грешка приликом учитавања аудио CD-a" #: library/library.cpp:63 msgid "Ever played" msgstr "Икада пуштена" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Осим између трака на истом албуму или на истом CUE листу" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "ФЛАЦ" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "Утапај нумеру при заустављању" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "С утапањем" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "Трајање утапања" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "Brzo" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "Омиљене нумере" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "Добави недостајуће омоте" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "Добави аутоматски" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "Добављање завршено" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Грешка добављања омотнице" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "наставак фајла" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "име фајла" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "Име фајла (без путање)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "величина фајла" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "тип фајла" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Име фајла" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Фајлови" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "Фајлови за транскодирање" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "Пронађи песме у твојој библиотеци које одговарају критеријуму који си прецизирао." #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "Утискивање песме" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "Završi" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "Први ниво" #: core/song.cpp:328 msgid "Flac" msgstr "ФЛАЦ" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Veličina fonta" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "Због лиценцираниг разлога Spotify подршка је на посебном додатку." #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "Присили моно енкодирање" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "Заборави уређај" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Образац" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "Формат" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Број кадрова" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Пријатељи" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Пуни бас" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "Пуни бас + сопран" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "Пуни сопран" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "Гстример звучни мотор" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Опште поставке" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Жанр" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "Добављање канала" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "Дајте јој име:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "Иди на нову картицу листе" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "Иди на предходну картицу листе" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "Набавио %1 омота од %2 (%3 неуспешно)" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "Посиви непостојеће песме у листи" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "Grooveshark prijava greške" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "Групиши библиотеку по" #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "Групиши по" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "Групиши по албумима" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "Групиши по извођачима" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "Групиши по извођачима и албумима" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "Геупиши по извођачима и годинама албума" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "Уреди према жанровима и албумима" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "Групиши према Жанру/Извођачу/Албуму" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "HTTP посредник" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "Подаци о хардверу" #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "Подаци о хардверу су доступни само док је уређај повезан" #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "Висок" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "Високо (%1 fps)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "Висока (1024x1024)" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "Часова" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "Немам налог на Мегатјуну" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Икона" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "Иконице на врх" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "Препознавање песме" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "Ако наставиш, овај уређај ће радити спорије и умножене песме на њему можда неће радити." #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "Игонориши \"The\" у имену извођача" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Slike (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "У промењивом режиму нове нумере ће бити изабране и додате листи сваки пут кад се песма заврши." #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "Сандуче" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "Укључи омоте албума у обавештења" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "Uključi sve pesme" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "Повећај јачину за 4%" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Повећај јачину" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "информација" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "Убаци..." #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Instalirano" #: core/database.cpp:673 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Интернет" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "Неисправан АПИ кључ" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Неисправан формат" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "Неисправан начин" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "Netačni parametri" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "Наведени ресурс неважећи" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "Неважећи сервис" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "Неважећи кључ сесије" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "Pogrešno koriničko ime i / ili šifra" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "Џамендо најслушаније нумере" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "Џамендо врх нумере" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "Џамендо врх нумере овог месеца" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "Џамендо врх нумере ове седмице" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "Jamendo baza podataka" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "Скочи на нумеру која се тренутно пушта" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "Задржи оригиналне фајлове" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "Мачићи" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Jezik" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "Лаптоп/слушалице" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Велика дворана" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "Велики омот албума" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "Велики" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "Последње пуштано" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "ЛастФМ" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "ЛастФМ Библиотека - %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "ЛастФМ комшијски радио -%1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "ЛастФМ радио станица - %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Last.fm Сличан Извођач са %1" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "" #: internet/lastfmservice.cpp:437 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "ЛастФМ је тренутно заузет, молимо Вас пробајте поново за неколико минута" #: ../bin/src/ui_lastfmsettingspage.h:154 msgid "Last.fm password" msgstr "ЛастФМ лозинка" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "ЛастФМ корисничко име" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "Најмање омиљене нумере" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "Оставите празно за подразмевано. Примери: \"/dev/dsp\", \"front\", итд.." #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Трајање" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Библиотека" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "Напредно груписање библиотеке" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "Претраживање библиотеке" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Ograničenja" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "" #: ui/equalizer.cpp:123 msgid "Live" msgstr "Уживо" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Учитај" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "Учитај омот из УРЛ" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "Учитај омот из УРЛ..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "Учитај омот са диска" #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "Учитај листу нумера" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "Учитај листу нумера" #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Учитавам ЛастФМ радио" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Учивање МТП уређаја" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "Учитавам Ајподову базу података" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "Учитавање паметне листе" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "Учитавање песама" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "Учитавам ток" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "Учитавам нумере" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "Учитавање инфо песама" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "Učitavanje" #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "Учитава датотеке/УРЛ-е, замењујући тренутну листу" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Пријава" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "Воли" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Ниско (%1 fps)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "Ниско (256X256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "Текстови" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "Текстови из %1" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MП3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "" #: core/song.cpp:330 msgid "MPC" msgstr "МПЦ" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Магнатјун" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Преузимање са Магнатјуна" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Завршено преузимање са Магнатјуна" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "Главни налог (MAIN)" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "Направи листу доступну ван мреже" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "Лош одговор" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "Ручно подешавање посредника" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "Произвођач" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "Упореди сваки тражени термин (AND)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "Упореди један или више тражених термина (ОR)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "Највећи битрејт" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "Осредње (%1 fps)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "Средњи (512X512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "Врста чланства" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "Најмањи битрејт" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "Модел" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "Надгледај измене у библиотеци" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "Meseci" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "" #: library/library.cpp:74 msgid "Most played" msgstr "Највише пуштано" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "Тачка повезивања" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "Тачке монтирања" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "Помери доле" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "Премести у библиотеку" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "Помери горе" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Музичка библиотека" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "Утишај" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "Моја Last.fm библиотека" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "Мој бирани радио" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "Мој комшилук" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "Моја радио станица" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "Моје препоруке" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Име" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "Уски опсег (NB)" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "Комшије" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "Mreža" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "Мрежни посредник" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "Nikad" #: library/library.cpp:67 msgid "Never played" msgstr "Никад пуштено" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "Никад пуштано" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "Нова листа нумера" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "Нова паметна листа" #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "Nove pesme" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "Нове нумере ће бити аутоматски додате" #: library/library.cpp:80 msgid "Newest tracks" msgstr "Најновије нумере" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "Sledeće" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Следећа нумера" #: core/utilities.cpp:147 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "Без анализатора" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:366 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Није нађено. Очистите поље за претрагу да би приказали целу листу поново." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "Ништа" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "Ниједна од одабраних песама није погодна за умножавање на уређај" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "Није доступно док се користи промењива листа" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "Неповезан" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "Нема довољно садржаја" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "Нема довољно фанова" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "Нема довољно чланова" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "Нема довољно комшија" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Није уграђен" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "Није" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "Врста обавештења" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Обавештења" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Тренутно пушта" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "ОСД преглед" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "ОГГ Ворбис" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "" #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "Отвори уређај" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "" #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "Отвори у новој листи" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Отвори..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "Радња није успела" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "Намештено за битрејт" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "Намештено за квалитет" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "Opcije..." #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "Организуј фајлове" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "Организуј фајлове..." #: core/organise.cpp:65 msgid "Organising files" msgstr "Организујем фајлове" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "Почетне ознаке" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Остале опције" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "Излазне опције" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "Prepiši postojeće fajlove" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:124 msgid "Party" msgstr "Журке" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "Лозинка" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Паузирај" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "Паузирај пуштање" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Паузирано" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Пусти" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "" #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "број пуштања" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "" #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "Пусти ако је заустављено, заустави ако се пушта" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "Пусти ако ништа тренутно не свира" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "Пусти у нумеру у листи" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "Пусти/паузирај" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Пуштање" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Опције плејера" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "Листа нумера" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "Листа нумера је завршена" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "Опције листе нуера" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "Тип листе" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "Статус додатка:" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Поп" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "Прикључак" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "Претпојачање" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "Поставке" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "Поставке..." #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "Имена жељене омитнице (размаком раздвојено)" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "Пожељни формат звука" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "Жељени формат" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "Преподешено:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "Преглед" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "Prethodno" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "Претходна нумера" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "Налог" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "Напредак" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "Стави насумичне песме" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "Квалитет" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "Menaxer редоследа" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "Стави у ред одабране нумере" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "Стави нумеру у ред" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "Радио (једнака јачина за све песме)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "Киша" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "Оцени тренутну песму 0 звезда" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "Оцени тренутну песму 1 звезда" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "Оцени тренутну песму 2 звезда" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "Оцени тренутну песму 3 звезда" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "Оцени тренутну песму 4 звезда" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "Оцени тренутну песму 5 звезда" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "Ocena" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "Заиста одустајете?" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "Освежи каталог" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "Освежи канале" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "Освежи листу станица" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Реге" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Уклони" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "Ukloni radnju" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "Уклони фасциклу" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "Уклони са листе нумера" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "Преименуј листу нумера" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "Преименуј листу нумера..." #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Понови" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "Понављај албум" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "Понови листу нумера" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "Понови нумеру" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Замени тренутну листу" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "Zameni listu" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "Замени размаке са доњом цртом" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "Попуни поново" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "Resetuj" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" 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:206 msgid "Restrict to ASCII characters" msgstr "Ограничи се на аски знакове" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Рок" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "SOCKS посредник" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "Безбедно извади уређај" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "Безбедно извади уређај после умножавања" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "узорковање" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "Учестаност узорковања" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "Сачувај омот албума" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "Сачувај омот на диск" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "Сачувај слику" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "Сачувај листу нумера" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "Сачувај листу нумера..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "Сачувати претподешавање" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "Сачувај овај ток у интернет картици" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "Чувам нумере" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "оцена" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "Претрага" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "Потражи Icecast станице" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "Потражи Jamendo" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Претражи Магнатјун" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "Тражи омоте албума" #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "Режим тражења" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "Опције претраге" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "Термини претраге" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "Други ниво" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "Тражи уназад" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "Тражи унапред" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "Нађи тренутну нумеру по релативном износу" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "Нађи тренутну нумеру на тачној позицији" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "Изабери све" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "Означи ништа" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "Одабери најбоље поклапање" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "Одабери визуелизације" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "Одабери визуелизације..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "Серијски број" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "Сервис ван мреже" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Подешено %1 од \"%2\"..." #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "Намести јачини звука на процента" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "Подеси вредност за све означене нумере" #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Пречица" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "Пречица за %1" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Пречица за %1 већ постоји" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Прикажи" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "Прикажи OSD" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "Прикажи шљаштећу анимацију на пуштеној нумери" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "Прикажи основну декстоп обавештење" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Прикажи обавештење кад променим понови/насумучни режим" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "Прикажи обавештење кад променим гласноћу" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "Прикажи лепи OSD" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "Прикажи изнад статусне траке" #: ui/mainwindow.cpp:460 msgid "Show all songs" msgstr "Prikaži sve pesme" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Прикажи све песме" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show cover art in library" msgstr "Прикажи омотницу у библиотеци" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "Прикажи раздвајаче" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "Прикажи пуну величину..." #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "Прикажи у фајл прегледачу..." #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "Прикажи у разним извођачима" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "Прикажи само дупликате" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "Прикажи само неозначене" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "Прикажи ''волим'' и ''мрзим'' дугмад" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "Прикажи икону системске касете" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "Prikaži/Sakrij" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Пуштај наизменично" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "Испретумбај све" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "Претумбај листу" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "Одјави се" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "Slični izvođači" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ска" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "Прескочи уназад у листи нумера" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "Прескочи збир" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "Прескочи унапред у листи нумера" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "Мали омот" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "Паметна листа" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "Паметне листе" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Лагана" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "Лагани рок" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "Подаци о песми" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "Подаци о песми" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "Сонограм" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "Извините" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "Поређај по жанру (абецедно)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "Поређај по жанру (по популарности)" #: ../bin/src/ui_icecastfilterwidget.h:77 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 "Ређање" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "Spotify грешка пријављивања" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "Spotify додатак" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "Spotify додатак није уграђен" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "Стандард" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "Звездицом" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "Почни листу тренутно пуштаним" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "Започни транскодирање" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "Покрећем %1" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "Почињем..." #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Заустави" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "Стани после" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "Стани после ове нумере" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Заустави пуштање" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "Стани после тренутне нумере" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "Заустављено" #: core/song.cpp:341 msgid "Stream" msgstr "Ток" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "Успешно уписано %1" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "Предложене ознаке" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "Сажетак" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "Супер високо (%1 fps)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "Подржани формати" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "Усаглашавање Spotify сандучета" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "Усаглашавање Spotify листе" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "Усаглашавање Spotify оцењених нумера" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "Картице на врх" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Ознака" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "Ознаке добављене" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "Означи радио" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Техно" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "Опције текста" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Захвалнице" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "\"%1\" команди се не могу покренути." #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "\"%1\" директоријума није исправно" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "'%1' листе је празно и не може се учитати." #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "Сајт који сте затражили није слика!" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Искрсао проблем приликом добављања метаподатака са Magnatune" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:56 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:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Ови фајлови ће се избрисати са уређаја, да ли сигурно желите да наставите?" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "These folders will be scanned for music to make up your library" msgstr "Ови директоријуми ће бити скенирани због музике да би се направила библиотека" #: ../bin/src/ui_transcodersettingspage.h:174 msgid "" "These settings are used in the \"Transcode Music\" dialog, and when " "converting music before copying it to a device." msgstr "Ова подешавања се користе у \"Transcode Music\" дијалогу, и кад се претвара музика пре умножавања на уређај." #: ../bin/src/ui_groupbydialog.h:151 msgid "Third level" msgstr "Трећи ниво" #: internet/jamendoservice.cpp:171 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/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "Ovaj album nije dostupan u traženom formatu" #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Овај уређај мора бити повезан и отворен пре него што Клементина може да види које формате фајлова подржава." #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "Овај уређај подржава следеће формате фајлова:" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Овај уређај неће радити исравно" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "Овај ток је само за претплатнике" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "Овај тип уређаја није подржан: %1" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "Прековреме" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Наслов" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "Danas" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Преко читавог екрана" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "Укупно бајтова пребачено" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Нумера" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "Транскодирај музику" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "Дневник транскодирања" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "Транскодирање" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "" #: core/song.cpp:338 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "" #: devices/giolister.cpp:161 msgid "URI" msgstr "Адреса" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "Адресе" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "Ултра широк опсег (UWB)" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Не могу да преузмем %1 (%2)" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Непознато" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Непозната грешка" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "Не изабери омот" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "Освежи промењене директоријуме библиотеке" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "Ажурирај библиотеку при покретању Клементине" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Ажурирам %1" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "Ажурирам %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Ажурирање библиотеке" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "Искоришћење" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "Користи Гномове пречице" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "Користи Wii даљински" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "Користи сопствену поруку за обавештења" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "Користи аутентификациjу" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "Користи промењив режим" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "искоришћено" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Корисничко име" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "ВБР МП#" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "Разни извођачи" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "Визуелизације" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "Подешавања визуелизација" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "Гласноћа %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "ВАВ" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "Nedelje" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "Када се Клементина упали" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "Широк опсег (WB)" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "Година" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "Година — Албум" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "Godine" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "Juče" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "Можете изменити начин организивања песама у библиотеци" #: internet/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "" #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "" #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "" #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Акредитиви за ЛастФМ које сте унели су нетачни" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "Ваша библиотека је празна" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "Ваши радио токови" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Нулто" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "додај %n песама" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "Pre" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "i" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "pre" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "опм" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "sadrži" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "диск %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "ne sadrži" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "kb/s" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "Опције" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "pritisni enter" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "remove %n песама" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "Заустави" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "нумера %1" clementine-1.2.0+dfsg/src/translations/sr@latin.po000066400000000000000000003606661223327513400222230ustar00rootroot00000000000000# 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" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:08+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Serbian (Latin) (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " kb/s" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " sekundi" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 dana" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "" #: podcasts/gpoddersync.cpp:79 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "" #: playlist/playlistmanager.cpp:413 #, qt-format msgid "%1 selected of" msgstr "" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, qt-format msgid "%L1 other listeners" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "" #: transcoder/transcodedialog.cpp:192 #, c-format msgid "%n remaining" msgstr "" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "&Custom" msgstr "" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "" #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "" #: core/utilities.cpp:108 msgid "1 day" msgstr "" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "" #: library/library.cpp:60 msgid "50 random tracks" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "" #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:78 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:153 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "A-Z" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "" #: core/song.cpp:336 msgid "AIFF" msgstr "" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "" #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "" #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "" #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "" #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "" #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "" #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "" #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "" #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "" #: ui/about.cpp:74 msgid "All the translators" msgstr "" #: library/library.cpp:84 msgid "All tracks" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "" #: internet/spotifyblobdownloader.cpp:60 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:61 msgid "An error occurred loading the iTunes database" msgstr "" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:78 msgid "And:" msgstr "" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "" #: ui/about.cpp:65 msgid "Authors" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "" #: core/database.cpp:734 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "" #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "" #: core/song.cpp:339 msgid "CDDA" msgstr "" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "" #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "" #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "" #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "" #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "" #: ui/equalizer.cpp:115 msgid "Classical" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: internet/lastfmsettingspage.cpp:110 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 "" #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "" #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:116 msgid "Club" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "" #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "" #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "" #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "" #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "" #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "" #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "" #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "" #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:64 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: transcoder/transcoder.cpp:432 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "" #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "" #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "" #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "" #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "" #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "" #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "" #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "" #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "" #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "" #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:63 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "" #: core/song.cpp:328 msgid "Flac" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:43 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "" #: core/database.cpp:673 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "" #: internet/lastfmservice.cpp:437 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:154 msgid "Last.fm password" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "" #: ui/equalizer.cpp:123 msgid "Live" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "" #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "" #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "" #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "" #: core/song.cpp:330 msgid "MPC" msgstr "" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "" #: library/library.cpp:74 msgid "Most played" msgstr "" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "" #: library/library.cpp:67 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:80 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "" #: core/utilities.cpp:147 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:366 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "" #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "" #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "" #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "" #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "" #: core/organise.cpp:65 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:124 msgid "Party" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "" #: widgets/osd.cpp:156 msgid "Paused" msgstr "" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "" #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "" #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" 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:206 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "" #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "" #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:460 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "" #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "" #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 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 "" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "" #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "" #: core/song.cpp:341 msgid "Stream" msgstr "" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "" #: ui/about.cpp:70 msgid "Thanks to" msgstr "" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "" #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:56 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:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:174 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:151 msgid "Third level" msgstr "" #: internet/jamendoservice.cpp:171 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "" #: core/song.cpp:338 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "" #: devices/giolister.cpp:161 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "" #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "" #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "" #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "" clementine-1.2.0+dfsg/src/translations/sv.po000066400000000000000000004530411223327513400210650ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # TraN , 2013 # Daniel Sandman , 2012 # FIRST AUTHOR , 2010 # kristian , 2012 # Rasmus Eneman , 2013 # Rasmus Eneman , 2012 # Robin Poulsen , 2011 # elfa , 2013 # Hoven1 , 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:08+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Swedish (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr " dagar" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " pt" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " sekunder" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " låtar" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 album" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 dagar" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 dagar sedan" #: podcasts/gpoddersync.cpp:79 #, 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:413 #, qt-format msgid "%1 selected of" msgstr "%1 vald(a) av" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 låt" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 låtarna" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 låtar hittades" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 låtar hittades (visar %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 spår" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 överfört" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimotedev-modul" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n misslyckades" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n färdig" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "A&npassad" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "Extrafunktioner" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "Hjälp" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "Dölj %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "Dölj..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Vänster" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "Musik" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "I&nga" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "Spellista" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "A&vsluta" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "Upprepningsläge" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Höger" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "Blandningsläge" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "Justera kolumner så de passar fönstret" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "Verktyg" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(olika på flera låtar)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "... och alla Amarok-bidragsgivare" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "0px" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 dag" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 spår" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "127.0.0.1" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "40%" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 slumpmässiga spår" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "Uppgradera till Premium nu" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "Ett Grooveshark Anywhere konto krävs." #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "Kräver ett Spotify Premium-konto." #: ../bin/src/ui_networkremotesettingspage.h:189 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:78 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:153 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:297 msgid "A-Z" msgstr "A-Ö" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "ÄRAD VARE HYPNOTOAD" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "Avbryt" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "Om %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "Om Clementine..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "Om Qt..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Kontodetaljer" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "Kontoinformation (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Åtgärd" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Aktivera/inaktivera Wiiremote" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "Lägg till podsändning" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Lägg till ström" #: ../bin/src/ui_notificationssettingspage.h:425 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:193 msgid "Add action" msgstr "Lägg till åtgärd" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Lägg till en annan ström..." #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Lägg till katalog..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "Lägg till fil" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Lägg till fil..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Lägg till filer för omkodning" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Lägg till mapp" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Lägg till mapp..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Lägg till mapp..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "Lägg till podsändning" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "Lägg till podsändning..." #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Lägg till sökterm" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "Lägg en albumetikett till låten" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "Lägg en albumartistetikett till låten" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "Lägg till etikett för låtens artist" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "Lägg till etikett för låtens kompositör" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "Lägg till etikett för skivnummer" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "Lägg till filnamn på låt" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "Lägg till etikett för genre" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "Lägg till etikett för låtens längd" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "Lägg till antal uppspelningar" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "Lägg till antal överhoppningar" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "Lägg till etikett för låtens titel" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "Lägg till etikett för spårnummer" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "Lägg till etikett för år" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Lägg till ström..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "Lägg till i Grooveshark-favoriter" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "Lägg till i Grooveshark-spellistor" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "Lägg till i en annan spellista" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Lägg till i spellistan" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "Lägg till kön" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Lägg till Wiimotedev-åtgärd" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Lägg till..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Tillagda denna månad" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Tillagda denna vecka" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Tillagda i år" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Tillagda idag" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Tillagda senaste tre månaderna" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "Lägger till låt i Min Musik" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "Lägg till låtar till favoriter" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Avancerad gruppering..." #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "Efter " #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "Efter kopiering..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Album (lämplig ljudstyrka för alla spår)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Albumartist" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "Almbumomslag" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Album information från jamendo.com..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Album med omslag" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Album utan omslag" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Alla filer (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "All Glory to the Hypnotoad!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Alla album" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Alla artister" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "Alla filer (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Alla spellistor (%1)" #: ui/about.cpp:74 msgid "All the translators" msgstr "Alla översättare" #: library/library.cpp:84 msgid "All tracks" msgstr "Alla spår" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "Tillåt mellan-/sidokodning" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "Tillsammans med originalen" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Dölj alltid huvudfönstret" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Visa alltid huvudfönstret" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "Starta alltid att spela" #: internet/spotifyblobdownloader.cpp:60 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:61 msgid "An error occurred loading the iTunes database" msgstr "Ett fel uppstod vid inläsning av iTunes-databasen" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Ett fel uppstod när metadata skulle skrivas till '%1'" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "Ett okänt fel inträffade." #: ui/about.cpp:78 msgid "And:" msgstr "Och:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "Arg" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Utseende" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Lägg till filer/webbadresser till spellistan" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "Lägg till i den aktuella spellistan" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "Lägg till i spellistan" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "Tillämpa komprimering för att förhindra distorsion" #: ui/equalizer.cpp:197 #, 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\"?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "Är du säker på att du vill ta bort denna spellista?" #: ui/edittagdialog.cpp:769 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:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Artist" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Artistinfo" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "Artistradio" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "Artist-taggar" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "Artistens initialer" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Ljudformat" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Behörighetskontroll misslyckades" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "Författare" #: ui/about.cpp:65 msgid "Authors" msgstr "Upphovsmän" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Auto" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Automatisk uppdatering" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "Öppna enstaka kategorier i biblioteksträdet automatiskt" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "Tillgängliga" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "Genomsnittlig bithastighet" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "Genomsnittlig bildstorlek" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "BBC podsändningar" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "Bakgrundsströmmar" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Bakgrundsfärg" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "Bakgrundsbild" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Bakgrundsopacitet" #: core/database.cpp:734 msgid "Backing up database" msgstr "Säkerhetskopiera databasen" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "Balans" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Blockera" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "Stapelanalysator" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Basblå" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "Grundläggande ljudtyp" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Beteende" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "Bästa" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "Biografi från %1" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Bithastighet" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "Bitfrekvens" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "Blockanalysator" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "Blocktyp" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "Brödtext" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "Boom-analysator" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Bläddra..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "Längd på buffer" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "Buffrar" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "Men dessa källor är inaktiverade:" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Knappar" #: core/song.cpp:339 msgid "CDDA" msgstr "CD-ljud" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "Stöd för CUE-filer" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "Avbryt" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Ändra omslag" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Ändra typsnittsstorlek" #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "Ändra upprepningsläge" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Ändra snabbtangent..." #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "Ändra blandningsläge" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Ändra språket" #: ../bin/src/ui_playbacksettingspage.h:330 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:228 msgid "Check for new episodes" msgstr "Kolla efter nya avsnitt" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Leta efter uppdateringar..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "Välj ett namn för din smara spellista" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Välj automatiskt" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Välj färg..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "Välj typsnitt..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Välj från listan" #: smartplaylists/querywizardplugin.cpp:155 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." #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "Välj nedladdningsmapp för podsändningar" #: ../bin/src/ui_songinfosettingspage.h:188 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:115 msgid "Classical" msgstr "Klassisk" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "Rensar upp" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Rensa" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Rensa spellistan" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Clementine-fel" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Clementine-orange" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Clementine-visualisering" #: ../bin/src/ui_deviceproperties.h:376 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_boxsettingspage.h:104 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:104 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:104 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_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "Clementine kan spela upp musik som du har laddat upp till Ubuntu One" #: ../bin/src/ui_notificationssettingspage.h:431 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:250 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:128 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." #: internet/lastfmsettingspage.cpp:110 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 "Clementine kunde inte hämta information om din prenumeration eftersom det är något problem med din uppkoppling. Spelade spår kommer mellanlagras för att skickas till Last.fm vid ett senare tillfälle." #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Clementine-bildvisare" #: ../bin/src/ui_trackselectiondialog.h:206 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:210 msgid "Clementine will find music in:" msgstr "Clementine kommer att söka musik i:" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Klicka här för att lägga till musik" #: playlist/playlisttabbar.cpp:293 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:72 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_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "Stäng spellista" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "Stäng visualisering" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "Stängning av detta fönster kommer att avbryta hämtningen." #: ui/albumcovermanager.cpp:216 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:116 msgid "Club" msgstr "Club" #: ../bin/src/ui_appearancesettingspage.h:272 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:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Kommentar" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "Fyll i etiketter automatiskt" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "Fyll i etiketter automatiskt..." #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Kompositör" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "Ställ in %1..." #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "Konfigurera Grooveshark..." #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Konfigurera Last.fm..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "Konfigurera Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Konfigurera snabbtangenter" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "Anpassa Spotify..." #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "Konfigurera Subsonic..." #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "Ställ in Global sökning..." #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "Konfigurera biblioteket..." #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "Konfigurera podcasts..." #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "Konfigurera..." #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "Anslut Wii-kontroller med åtgärden aktivera/inaktivera" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "Anslut enhet" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "Ansluter till Spotify" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "Konsoll" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "Konstant bithastighet" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "Konvertera all musik" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "Konvertera all musik som enheten inte kan spela upp" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "Kopiera till klippbordet" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Kopiera till enhet..." #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Kopiera till biblioteket..." #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "Copyright" #: internet/subsonicsettingspage.cpp:81 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:64 #, 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" #: transcoder/transcoder.cpp:432 #, 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:426 #, 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/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "Kunde inte läsa in Last.fm-radiostationen" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "Kunde inte öppna utdatafilen %1" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Omslagshanterare" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "Omslagsbilder från inbäddad bild" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Omslagsbild laddas automatiskt från %1" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "Omslagsbild kastades manuellt" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "Omslagsbild inte angiven" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "Omslagsbild angiven från %1" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "Omslagsbilder från %1" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "Skapa ny Grooveshark spellista" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "Korstona vid automatiskt byte av spår" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "Korstona vid manuellt byte av spår" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "Anpassad" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "Anpassad bild:" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "Egna meddelandeinställningar" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "Anpassad radio" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Anpassad..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "Dbus-sökväg" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Dans" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Datum skapad" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Datum ändrad" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "Dagar" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "S&tandard" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "Sänk volymen med 4%" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "Minska volymen med procent" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Sänk volymen" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "Standardbakgrund" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "Standardvärden" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "Fördröjning mellan visualiseringar" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "Ta bort" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "Ta bort Grooveshark spellista" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "Ta bort nedladdad data" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Ta bort filer" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Ta bort från enhet..." #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Ta bort från disk..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "Ta bort uppspelade avsnitt" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "Ta bort förinställning" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "Radera smart spellista" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "Ta bort originalfilerna" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Tar bort filer" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "Avköa valda spår" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "Avköa spår" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Mål" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Detaljer..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Enhet" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Enhetsinställningar" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Enhetsnamn" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Enhetsinställningar..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Enheter" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Menade du" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "Digitalt importerad" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "Digitalt importerat lösenord" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "Digitalt importerat användarnamn" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "Direkt Internetanslutning" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Katalog" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "Avaktivera tidsvisning" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "Inaktivera moodbar-generering" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Inaktiverat" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Skiva" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "Icke-kontinuerlig sändning" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 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:715 msgid "Do a full library rescan" msgstr "Gör en fullständig omsökning av biblioteket" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "Konvertera inte någon musik" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Upprepa inte" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "Visa inte i diverse artister" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "Blanda inte" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "Stoppa inte!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "Donera" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Dubbelklicka för att öppna" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "Dubbelklicka på en låt kommer ..." #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "Ladda ner %n avsnitt" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "Nedladdningskatalog" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "Ladda ner avsnitt till" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "Hämta medlemskap" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "Ladda ner nya avsnitt automatiskt" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "Nedladdning köad" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Hämta detta album" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Ladda ner det här albumet ..." #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "Ladda ner detta avsnitt" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "Ladda ner..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "Laddar ner (%1%)..." #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "Ladda ner Icecast-katalog" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "Ladda ner Jamendo-katalog" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "Hämtar katalog från Magnatune" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "Laddar ner Spotify-insticket" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "Hämtar metadata" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "Dra för att ändra position" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "Dropbox" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "Dynamisk läge är på" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "Dynamisk slumpmässig blandning" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "Redigera smart spellista..." #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Redigera \"%1\"-taggen..." #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "Redigera tagg..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "Redigera etiketter" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Redigera spårinformation" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "Redigera spårinformation..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Redigera spår information ..." #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Redigera..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "Aktivera stöd för Wii-kontroll" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "Aktivera equalizer" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "Aktivera endast snabbknappar när Clementine är fokuserat" #: ../bin/src/ui_globalsearchsettingspage.h:147 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:62 msgid "Enable/disable Last.fm scrobbling" msgstr "Aktivera/avaktivera Last.fm-skrobbling" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "Kodningskomplexitet" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "Kodningsmotorns kvalitet" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "Kodningsläge" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "Ange en adress" #: ../bin/src/ui_coverfromurldialog.h:103 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:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "Ange ett nytt namn för denna spellista" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Skriv in en artist eller tagg för att börja lyssna på Last.fm-radio." #: ../bin/src/ui_globalsearchview.h:209 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:77 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:77 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:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "Ange söktermer här" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "Skriv in webbadressen till en radiostation på Internet:" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "Ange katalogens namn" #: ../bin/src/ui_networkremotesettingspage.h:198 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:87 msgid "Entire collection" msgstr "Hela samlingen" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Fel" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Fel vid anslutning av MTP-enhet" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "Fel vid kopiering av låtar" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "Fel vid borttagning av låtar" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "Fel vid hämtning av Spotify-insticket" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "Fel vid insläsning av %1" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Fel vid laddning av di.fm spellista" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "Fel vid bearbetning av %1: %2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "Fel vid läsning av ljud-CD" #: library/library.cpp:63 msgid "Ever played" msgstr "Någonsin spelade" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "Var tionde minut" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "Var tolfte timma" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "Varannan timme" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "Var tjugonde minut" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "Varje halvtimma" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "Var sjätte timma" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "Varje timma" #: ../bin/src/ui_playbacksettingspage.h:303 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:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "Expandera" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "Går ut den %1" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "Tona ut när ett spår stoppas" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "Toning" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "Toningslängd" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "Misslyckades hämta katalog" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "Misslyckades att hämta podsändning" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "Misslyckades att ladda podsändning" #: podcasts/podcasturlloader.cpp:167 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:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "Snabb" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "Favoriter" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "Favoritspår" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "Hämta saknade omslag" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "Hämta automatiskt" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "Hämtning klar" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Fel vid hämtning av omslag" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "Filändelse" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "Filformat" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Filnamn" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "Filnamn (utan sökväg)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Filstorlek" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Filtyp" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Filnamn" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Filer" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "Filer som skall omkodas" #: smartplaylists/querywizardplugin.cpp:90 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." #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "Sätter fingeravtryck på låten" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "Avsluta" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "Första nivån" #: core/song.cpp:328 msgid "Flac" msgstr "FLAC" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Typsnittsstorlek" #: ../bin/src/ui_spotifysettingspage.h:213 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:204 msgid "Force mono encoding" msgstr "Tvinga enkanalskodning" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "Glöm enhet" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Formulär" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "Format" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Bildfrekvens" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "Ramar per buffert" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Vänner" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "Frusen" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Full bas" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "Full bas + diskant" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "Full diskant" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "GStreamer-ljudmotor" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "Allmänt" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Allmänna inställningar" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Genre" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "Hämta adress för att dela Groovesharkspellista" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "Hämta adress för att dela Groovesharklåt" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "Ladda populära Groovesharklåtar" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "Hämtar kanaler" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "Hämtar ström" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "Ge den ett namn:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "Starta" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "Gå till nästa spellisteflik" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "Gå till föregående spellisteflik" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, 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:206 msgid "Grey out non existent songs in my playlists" msgstr "Gråa ut icke-existerande låtar i mina spellistor" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "Grooveshark login fel" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "Adress för Groovesharkspellista" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "Groovesharkradio" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "Adresser för Groovesharklåtar" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "Gruppera biblioteket efter..." #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "Gruppera efter" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "Gruppera efter album" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "Gruppera efter artist" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "Gruppera efter artist/album" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "Gruppera efter artist/år - album" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "Gruppera efter genre/album" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "Gruppera efter genre/artist/album" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "HTML-sida inehöll inget RSS-flöde" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "HTTP-proxy" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "Glad" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "Hårdvaruinformation" #: ../bin/src/ui_deviceproperties.h:372 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:202 msgid "High" msgstr "Hög" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "Hög (%1 fps)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "Hög (1024x1024)" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "Timmar" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "Jag har inte ett Magnatune-konto" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Ikon" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "Ikoner längst upp" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "Identifierar låt" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 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:77 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:204 msgid "Ignore \"The\" in artist names" msgstr "Ignorera \"The\" i artistnamn" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Bilder (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "Om %1 dagar" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "Om %1 veckor" #: ../bin/src/ui_wizardfinishpage.h:86 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/spotifyservice.cpp:360 msgid "Inbox" msgstr "Inkorg" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "Inkludera albumomslag i notifieringen" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "Inkludera alla spår" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "Öka volymen med 4%" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "Öka volymen med procent" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Höj volymen" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "Indexerar %1" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "Information" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "Infoga..." #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Installerad" #: core/database.cpp:673 msgid "Integrity check" msgstr "Integritetskontroll" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "Internet operatörer" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "Felaktig API-nyckel" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Ogiltigt format" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "Ogiltig metod" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "Ogiltiga parametrar" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "Ogiltig resurs angiven" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "Ogiltig tjänst" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "Felaktig sessionsnyckel" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "Fel användarnamn och/eller lösenord" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "Jamendo Mest Lyssnade låtar" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "Jamendo Topplåtar" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "Jamendos favoritspår för månaden" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "Jamendos favoritspår för veckan" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "Jamendos databas" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "Hoppa till spåret som spelas just nu" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Behåll knappar i %1 sekund..." #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Behåll knappar i %1 sekunder..." #: ../bin/src/ui_behavioursettingspage.h:193 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:193 msgid "Keep the original files" msgstr "Behåll originalfilerna" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "Kittens" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Språk" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "Laptop/hörlurar" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Stor hall" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "Stort albumomslag" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "Stor sidopanel" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "Senast spelad" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "Last.fm Anpassad Radio: %1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Last.fm-bibliotek - %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "Last.fm Blandad Radio - %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Last.fm-grannradio - %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Last.fm-radiostation - %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Last.fm-artister som liknar %1" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Last.fm-taggradio: %1" #: internet/lastfmservice.cpp:437 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:154 msgid "Last.fm password" msgstr "Last.fm-lösenord" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "Last.fm-låtstatistik" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Last.fm-taggar" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Last.fm-användarnamn" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Last.fm-wiki" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "Minst omtyckta spår" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "Lämna tomt för standardvärdet. Exempel: \"/dev/dsp\", \"front\", etc." #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Speltid" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Bibliotek" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "Avancerad bibliotekgruppering" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "Notis om omsökning av biblioteket" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "Bibliotekssökning" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Begränsningar" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "Lyssna på Groovesharklåtar som baseras efter vad du tidigare lyssnat på." #: ui/equalizer.cpp:123 msgid "Live" msgstr "Live" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Läs in" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "Ladda omslag från URL" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "Ladda omslag från URL..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "Ladda omslag från hårddisk" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "Läs in omslagsbild från disk..." #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "Läs in spellista" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "Läs in spellista..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Läser in Last.fm-radio" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Läser in MTP-enhet" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "Läser in iPod-databas" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "Läser in smart spellista" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "Laddar låtar" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "Läser in ström" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "Läser in spår" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "Laddar låtinformation" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "Läser in..." #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "Läser in filer/webbadresser, ersätter aktuell spellista" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Inloggning" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "Misslyckad inloggning" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "Långsiktig förutsägelseprofil (LTP)" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "Älska" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Låg (%1 fps)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "Låg (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "Låg komplexitetprofil (LC)" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "Låttexter" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "Låttext från %1" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Magnatude-hämtning" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Magnatude-hämtning slutförd" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "Huvudprofil (MAIN)" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "Gör så!" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "Gör spellista tillgänglig offline" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "Felformaterat svar" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "Manuell proxykonfiguration" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "Manuellt" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "Tillverkare" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "Markera som lyssnad" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "Markera som ny" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "Matcha varje sökterm (OCH)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "Matcha en eller flera söktermer (ELLER)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "Maximal bithastighet" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "Mellan (%1 fps)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "Mellan (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "Medlemskapstyp" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "Minimal bithastighet" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "Saknar förinställningar för projectM" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "Modell" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "Övervaka förändringar i biblioteket" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "Mono uppspeling" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "Månader" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "Stämning" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "Stil på stämningsdiagrammet" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "Stämningsdiagram" #: library/library.cpp:74 msgid "Most played" msgstr "Mest spelade" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "Monteringspunkt" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "Monteringspunkter" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "Flytta nedåt" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "Flytta till biblioteket..." #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "Flytta uppåt" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "Musik" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Musikbibliotek" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "Tyst" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "Mitt Last.fm Bibliotek" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "Min Last.fm Mix Radio" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "Mitt Last.fm-grannskap" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "Min Last.fm rekommenderade radio" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "Min Blandade Radio" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "Min Musik" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "Mitt grannskap" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "Min radiostation" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "Mina rekommendationer" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Namn" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "Namngivningsalternativ" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "Snävt band (NB)" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "Grannar" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "Nätverk" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "Nätverksproxy" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "Aldrig" #: library/library.cpp:67 msgid "Never played" msgstr "Aldrig spelade" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "Starta aldrig uppspelning" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "Ny mapp" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "Ny spellista" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "Ny smart spellista..." #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "Nya låtar" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "Nya spår läggs till automatiskt." #: library/library.cpp:80 msgid "Newest tracks" msgstr "Nyaste spåren" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "Nästa" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Nästa spår" #: core/utilities.cpp:147 msgid "Next week" msgstr "Nästa vecka" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "Ingen analysator" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "Ingen bagrundsbild" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "Inga långa block" #: playlist/playlistcontainer.cpp:366 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:145 msgid "No short blocks" msgstr "Inga korta block" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "Inga" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 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:155 msgid "Normal" msgstr "Normal" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "Normal blocktyp" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "Inte tillgängligt när du använder en dynamisk spellista" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "Inte ansluten" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "Inte tillräckligt med innehåll" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "Inte tillräckligt många fans" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "Inte tillräckligt många medlemmar" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "Inte tillräckligt med grannar" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Inte installerad" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "Inte inloggad" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "Inte monterad - dubbelklicka för att montera" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "Notifieringstyp" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Notifieringar" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Spelas just nu" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "Förhandsvisning av notifiering" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Ogg FLAC" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 msgid "Only allow connections from the local network" msgstr "" #: ../bin/src/ui_querysortpage.h:142 msgid "Only show the first" msgstr "Visa endast de första" #: ../bin/src/ui_appearancesettingspage.h:290 msgid "Opacity" msgstr "Opacitet" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "Öppna %1 i webbläsare" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "Öppna &ljud-CD..." #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "Öppna OPML fil" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "Öppna OPML fil..." #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "Öppna enhet" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "Öppna fil..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "Öppna i Google Drive" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "Öppna i ny spellista" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Öppna..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "Åtgärden misslyckades" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "Optimera för bithastighet" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "Optimera för kvalitet" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "Alternativ..." #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "Organisera filer" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "Organisera filer..." #: core/organise.cpp:65 msgid "Organising files" msgstr "Organiserar filer..." #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "Ursprungliga etiketter" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Övriga flaggor" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "Utdataalternativ" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "Skriv över befintliga filer" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "Ägare" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "Sorterar Jamendos katalog" #: ui/equalizer.cpp:124 msgid "Party" msgstr "Party" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "Lösenord" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Gör paus" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "Gör paus i uppspelning" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Pausad" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "Vanlig sidorad" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Spela upp" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "Spela upp artist eller tagg" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "Spela upp artistradio..." #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "Antal uppspelningar" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "Spela upp anpassad radio..." #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "Spela upp om stoppad, gör paus vid uppspelning" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "Spela om ingenting redan spelas" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "Spela upp taggradio..." #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "Spela upp spår nummer från spellistan" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "Spela upp/gör paus" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Uppspelning" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Spelaralternativ" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "Spellista" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "Spellistan slutförd" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "Alternativ för spellista" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "Spellistetyp" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "Spellistor" #: ../data/oauthsuccess.html:36 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:214 msgid "Plugin status:" msgstr "Instickstatus:" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "Podsändning" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Pop" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "Populära låtar" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "Poplära låtar under månaden" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "Populära låtar idag" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "Popup-varaktighet" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "Port" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "Förförstärkare" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "Inställningar" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "Inställningar..." #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "Föredragna omslagsbildsfilnamn (kommaseparerade)" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "Önskat ljudformat" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "Föredragen bitrate" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "Önskat format" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "Bättre ljudtyp" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "Förval:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "Tryck en tangentkombination att använda för" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "Tryck en tangent" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, 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_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "Alternativ för Skön notifiering" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "Förhandsvisning" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "Föregående" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 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:131 msgid "Profile" msgstr "Profil" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "Förlopp" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 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:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "Kvalitet" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "Förfrågar enhet..." #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "Köhanterare" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "Kölägg valda spår" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "Kölägg spår" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "Radio (likvärdig ljudstyrka för alla spår)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "Radio" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "Regn" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "Slumpmässig visualisering" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "Betygsätt den aktuella låten 0 stjärnor" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "Betygsätt den aktuella låten 1 stjärnor" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "Betygsätt den aktuella låten 2 stjärnor" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "Betygsätt den aktuella låten 3 stjärnor" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "Betygsätt den aktuella låten 4 stjärnor" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "Betygsätt den aktuella låten 5 stjärnor" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "Betyg" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "Verkligen avbryta?" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "Uppdatera" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "Updatera katalog" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "Uppdatera kanaler" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "Uppdatera vän listan" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "Uppdatera kanallistan" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "Uppdatera strömmar" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Reggae" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "Kom ihåg Wii-kontrollens rörelse" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "Kom ihåg från förra gången" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Ta bort" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "Ta bort åtgärd" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "Ta bort dubbletter från spellistan" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "Ta bort mapp" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "Ta bort från Min Musik" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "Ta bort från favoriter" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "Ta bort från spellistan" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "Tar bort låtar från Min Musik" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "Tar bort låtar från favoriter" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "Byt namn på %1 spellista" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "Byt namn på Groovesharkspellista" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "Döp om spellista" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "Döp om spellistan..." #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "Omnumrera spår i denna ordning..." #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Upprepa" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "Upprepa album" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "Upprepa spellista" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "Upprepa spår" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Ersätt den aktuella spellistan" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "Ersätt spellistan" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "Ersätter mellanslag med understreck" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "Replay Gain" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "Fyll i igen" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "Återställ" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" msgstr "Återställ låtstatistik" #: 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:206 msgid "Restrict to ASCII characters" msgstr "Begränsa till ASCII-tecken" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "Fortsätt uppspelning vid start" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "Hämtar Grooveshark Min Musik låtar" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "Hämta favoritlåtar från Grooveshark" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "Hämta spellistor från Grooveshark" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "Återgå till Clementine" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "Kör" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "SOCKS proxy" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "Säker borttagning av enhet" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "Säker borttagning av enheten efter kopiering" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "Samplingsfrekvens" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "Samplingsfrekvens" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "Spara .stämningsfiler i ditt musikbibliotek" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "Spara skivomslag" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "Spara omslag till disk..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "Spara bild" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "Spara spellista" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "Spara spellistan..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "Spara förinställning" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "Spara denna ström i Internet-filken" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "Sparar spår" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "Skalbar samplingsfrekvensprofil (SSR)" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "Poäng" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "Skrobbla låtar som jag lyssnar på" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "Sök" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "Leta efter stationer på Icecast" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "Sök på Jamendo" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Sök i Magnatune" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "Sök Subsonic" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "Sök efter albumomslag..." #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "Sök efter vad som helst" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "Sök gpodder.net" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "Sök iTunes" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "Sökläge" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "Sökalternativ" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "Sökresultat" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "Söktermer" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "Söker på Grooveshark" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "Andra nivån" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "Hoppa bakåt" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "Hoppa framåt" #: core/commandlineoptions.cpp:163 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:162 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" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "Välj alla" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "Välj ingen" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "Välj bakgrundsfärg:" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "Väl en bakgrundsbild" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "Välj bästa möjliga matchning" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "Väl förgrundsfärg:" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "Välj visualiseringar" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "Välj visualiseringar..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "Serienummer" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "Tjänst inte tillgänglig" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Ställ in %1 till \"%2\"..." #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "Ställ in volymen till procent" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "Ställ in värde för alla valda spår..." #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Snabbtangent" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "Snabbtangent för %1" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Snabbtangent för %1 finns redan" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Visa" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "Visa notifiering" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "Visa en lysande animation på det nuvarande spåret" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "Visa ett stämninsdiagram i tidsvisningsbalken" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "Visa en standardiserad skrivbordsnotifiering" #: ../bin/src/ui_notificationssettingspage.h:442 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:441 msgid "Show a notification when I change the volume" msgstr "Visa en notifiering när jag ändrar volymen" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "Visa en popup från notifieringsytan" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "Visa en skön notifiering" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "Visa ovanför statusraden" #: ui/mainwindow.cpp:460 msgid "Show all songs" msgstr "Visa alla låtar" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Visa alla låtarna" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show cover art in library" msgstr "Visa omslagsbilder i biblioteket" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "Visa avdelare" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "Visa full storlek..." #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "Visa i filhanterare..." #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "Visa i diverse artister" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "Visa stämningsdiagram" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "Visa endast dubbletter" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "Visa otaggade endast" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "Visa sökförslag" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "Visa knapparna \"Älska\" och \"Blockera\"" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "Visa skrobbelknappen i huvudfönstret" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "Visa notifieringsikon" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "Visa vilka källor som är aktiva/inaktiva" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "Visa/dölj" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Blanda" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "Blanda album" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "Blanda allt" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "Blanda spellistan" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "Blanda låtar i detta album" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "Logga in" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "Logga ut" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "Loggar in..." #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "Liknande artister" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "Gå bakåt i spellista" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "Antal överhoppningar" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "Gå framåt i spellista" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "Liten omslagsbild" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "Liten sidopanel" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "Smart spellista" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "Smarta spellistor" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "Låtinformation" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "Låtinfo" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "Spektrogram" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "Tyvärr" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "Sortera på genre (alfabetiskt ordning)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "Sortera på genre (ordning efter popularitet)" #: ../bin/src/ui_icecastfilterwidget.h:77 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" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "Källa" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "Källor" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "Fel vid inloggning på Spotify" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "Spotify-insticksprogram" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "Spotify-insticksprogrammet är inte installerat" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "Standard" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "Stjärnmärkta" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "Starta spellistan som spelas för närvarande" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "Starta omkodning" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 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:405 #, qt-format msgid "Starting %1" msgstr "Startar %1" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "Startar..." #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "Stationer" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Stoppa" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "Stoppa efter" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "Stoppa efter detta spår" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Stoppa uppspelning" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "Sluta spela efter aktuellt spår" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "Stoppad" #: core/song.cpp:341 msgid "Stream" msgstr "Ström" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "Strömmningsmedlemskap" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "Bevakade spellistor" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "Prenumeranter" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "Lyckades!" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "Skrev %1 med lyckat resultat" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "Föreslagna etiketter" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "Sammanfattning" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "Väldigt hög (%1 fps)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "Super high (2048x2048)" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "Stödda format" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "Synkroniserar Spotify-inkorg" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "Synkroniserar Spotify-spellista" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "Synkroniserar stjärnmärkta spår i Spotify" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "Systemfärger" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "Flikar längst upp" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Tagg" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "Etiketthämtare" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "Taggradio" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "Önskad bithastighet" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "Textalternativ" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Tack till" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Kommandot \"%1\" kunde inte startas." #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "Albumomslaget på den nu spelande låten." #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "Katalogen %1 är inte giltig" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "Spellistan '%1' var tom eller kunde inte läsas in." #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "Webbplatsen du söker är inte en bild!" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "Det finns 'andra låtar' i det här albumet." #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "Det uppstod ett fel med kommunikationen till gpodder.net" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Ett fel uppstod vid hämtning av metadatan från Magnatune" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Det uppstod ett fel med kommunikationen till iTunes" #: ui/organiseerrordialog.cpp:56 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:389 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:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 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:174 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:151 msgid "Third level" msgstr "Tredje nivån" #: internet/jamendoservice.cpp:171 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/magnatunedownloaddialog.cpp:175 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_deviceproperties.h:381 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:375 msgid "This device supports the following file formats:" msgstr "Denna enhet stöder följande filformat:" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Denna enhet kommer inte att fungera ordentligt" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "Denna ström är endast för betalkunder" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "Denna typ av enhet är inte stödd: %1" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "Tidsgräns överskriden" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Titel" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "För att starta Groovesharkradio bör du först ha lyssnat på några låtar från Grooveshark." #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "Idag" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "Växla Pretty OSD" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Växla fullskärm" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "Växla köstatus" #: ../bin/src/ui_mainwindow.h:718 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:143 msgid "Tomorrow" msgstr "Imorgon" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "För många omdirigeringar" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "Topp låtar" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "Totalt antal byte överfört" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "Totalt antal nätverksbegäran" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Spår" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "Omkoda musik" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "Omkodningslogg" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "Omkodar" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Omkodar %1 filer med %2 trådar" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "Omkodningsalternativ" #: core/song.cpp:338 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "Turbin" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "Stäng av" #: devices/giolister.cpp:161 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "Webbadress(er)" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "Ultrabredband (UWB)" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Det går inte att hämta %1 (%2)" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Okänt" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "Okänd innehållstyp" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Okänt fel" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "Ta bort omslag" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "Avprenumerera" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "Kommande konserter" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "Uppdatera Groovesharkspellista " #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "Uppdatera alla podsändningar" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "Uppdatera ändrade bibliotekskataloger" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "Uppdatera biblioteket när Clementine startar" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "Uppdatera denna podsändning" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "Uppdatera" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Uppdaterar %1" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "Uppdaterar %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Uppdaterar biblioteket" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "Användning" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "Använd om möjligt album artist tagg" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "Använd GNOMEs snabbtangenter" #: ../bin/src/ui_playbacksettingspage.h:310 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:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "Använd Wii-kontroll" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "Använd en egen färguppsättning." #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "Använd ett eget meddelande för notifieringar" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "Använd autentisering" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "Använd motor för hantering av bithastighet" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "Aktivera dynamiskt läge" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "Använd notifieringar för rapportering av Wii-kontrollstatus" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "Använd tidsbaserad brusformning" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "Använd systemets standard" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "Använd systemets standarduppsätting av färger." #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "Använd systemets proxy inställningar" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "Använd ljudnormalisering" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "Använd" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "Användaren %1 har inte ett Grooveshark Anywhere konto" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "Användargränssnitt" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Användarnamn" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "Använda menyn för att lägga till en låt kommer att ..." #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "Variabel bithastighet" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "Diverse artister" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "Version %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "Visa" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "Visualiseringsläge" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "Visualiseringar" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "Inställningar för visualiseringar" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "Avkänning av röstaktivitet" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "Volym %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "WAV" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "Webbsida" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "Veckor" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "När Clementine startar" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "När listan är tom..." #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "Försök med..." #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "Bredband (WB)" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii-kontroll %1: aktiverad" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii-kontroll %1: ansluten" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii-kontroll %1: kritisk batterinivå (%2%) " #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii-kontroll %1: inaktiverad" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii-kontroll %1: frånkopplad" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii-kontroll %1: låg batterinivå (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "Wii kontroll" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "Windows Media-ljud" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:530 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:2088 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:151 msgid "Write all songs statistics into songs' files" msgstr "" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "Fel användarnamn eller lösenord." #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "År" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "År - Album" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "År" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "Igår" #: ../bin/src/ui_magnatunedownloaddialog.h:132 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:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "Su är inte inloggad." #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "Du är inloggad som %1." #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "Du är inloggad." #: ../bin/src/ui_groupbydialog.h:123 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/digitallyimportedsettingspage.cpp:46 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 Premium användare kan lyssna på strömmar med högre kvalité utan reklam." #: internet/magnatunesettingspage.cpp:53 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:57 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." #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "Du kan skrobbla spår gratis, men endast betalkunder kan strömma Last.fm-radio från Clementine." #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "Du har inte ett Grooveshark Anywhere konto." #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Du har inget Spotify Premium konto" #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "Du har inte någon aktiv prenumeration" #: internet/spotifyservice.cpp:170 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/spotifysettingspage.cpp:158 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:87 msgid "You love this track" msgstr "Du älskar detta spår" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "Du behöver starta Systeminställningar och slå på \"Aktivera åtkomst för assisterande enheter\" för att använda globala snabbtangenter i Clementine." #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "Du måste starta om Clementine om du ändrar språket." #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "Du kommer inte kunna lyssna på radiostationer på Last.fm eftersom du inte prenumererar på Last.fm." #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "Din IP-adress:" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Dina Last.fm-uppgifter var felaktiga" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "Dina uppgifter för Magnatune var felaktiga" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "Ditt bibliotek är tomt!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "Dina radioströmmar" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "Dina skrobblingar: %1" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Ditt system saknar OpenGL support, visualiseringar är inte tillgängliga." #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "Ditt användarnamn eller lösenord var felaktigt" #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Ö-A" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Noll" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "lägg till %n låtar" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "efter" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "sedan" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "och" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "automatisk" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "före" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "mellan" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "största först" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "som innehåller" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "inaktiverad" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "skiva %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "som inte innehåller" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "som slutar med" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "som är lika med" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "gpodder.net" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "gpodder.net katalog" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "som är större än" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "de senaste" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "som är mindre än" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "längsta först" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "flytta %n låtar" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "nyaste först" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "inte lika med" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "inte de senaste" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "inte den" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "äldsta först" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "på" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "alternativ" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "tryck enter" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "ta bort %n låtar" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "korstaste först" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "Blanda låtar" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "minsta först" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "Sortera låtar" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "som börjar med" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "stoppa" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "spår %1" clementine-1.2.0+dfsg/src/translations/te.po000066400000000000000000003616731223327513400210560ustar00rootroot00000000000000# 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" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:08+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Telugu (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr "సెకనులు" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "పాటలు" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 గీతమాలికలు" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 రోజులు" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 రోజుల మునుపు" #: podcasts/gpoddersync.cpp:79 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 పాటలజాబితాలు (%2)" #: playlist/playlistmanager.cpp:413 #, qt-format msgid "%1 selected of" msgstr "%1 ఎంచుకున్నారు" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 పాట" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 పాటలు" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 పాటలు కనుగొన్నాము" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 పాటలు కనుగొన్నాము (%2 చూపిస్తున్నాము)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 పాటలు" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 బదిలీ చేశాము" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n విఫలమయ్యాయి" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n పూర్తయ్యాయి" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "&అనురూపితం" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "" #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "" #: core/utilities.cpp:108 msgid "1 day" msgstr "" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "" #: library/library.cpp:60 msgid "50 random tracks" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "" #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:78 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:153 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "A-Z" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "" #: core/song.cpp:336 msgid "AIFF" msgstr "" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "" #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "" #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "" #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "" #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "" #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "" #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "" #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "" #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "" #: ui/about.cpp:74 msgid "All the translators" msgstr "" #: library/library.cpp:84 msgid "All tracks" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "" #: internet/spotifyblobdownloader.cpp:60 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:61 msgid "An error occurred loading the iTunes database" msgstr "" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:78 msgid "And:" msgstr "" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "" #: ui/about.cpp:65 msgid "Authors" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "" #: core/database.cpp:734 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "" #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "" #: core/song.cpp:339 msgid "CDDA" msgstr "" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "" #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "" #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "" #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "" #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "" #: ui/equalizer.cpp:115 msgid "Classical" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: internet/lastfmsettingspage.cpp:110 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 "" #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "" #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:116 msgid "Club" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Colors" msgstr "" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "" #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "" #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "" #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "" #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "" #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "" #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "" #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "" #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:64 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: transcoder/transcoder.cpp:432 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "" #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "" #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "" #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "" #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "" #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "" #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "" #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "" #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "" #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "" #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:63 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "" #: core/song.cpp:328 msgid "Flac" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:43 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "" #: core/database.cpp:673 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "" #: internet/lastfmservice.cpp:437 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:154 msgid "Last.fm password" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "" #: ui/equalizer.cpp:123 msgid "Live" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "" #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "" #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "" #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "" #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "" #: core/song.cpp:330 msgid "MPC" msgstr "" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "" #: library/library.cpp:74 msgid "Most played" msgstr "" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "" #: library/library.cpp:67 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:80 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "" #: core/utilities.cpp:147 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:366 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "" #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "" #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "" #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "" #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "" #: core/organise.cpp:65 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:124 msgid "Party" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "" #: widgets/osd.cpp:156 msgid "Paused" msgstr "" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "" #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "" #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" 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:206 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "" #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "" #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:460 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "" #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "" #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 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 "" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "" #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "" #: core/song.cpp:341 msgid "Stream" msgstr "" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "" #: ui/about.cpp:70 msgid "Thanks to" msgstr "" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "" #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:56 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:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:174 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:151 msgid "Third level" msgstr "" #: internet/jamendoservice.cpp:171 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "" #: core/song.cpp:338 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "" #: devices/giolister.cpp:161 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "" #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "" #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "" #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "" clementine-1.2.0+dfsg/src/translations/tr.po000066400000000000000000004665321223327513400210730ustar00rootroot00000000000000# 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 # Kardanadam , 2013 # emfi , 2013 # H. İbrahim Güngör , 2011 # H. İbrahim Güngör , 2010 # H. İbrahim Güngör , 2011 # Irfan YAZICI , 2011 # kadirc , 2012 # Muhammet Kara , 2012 # Murat Ikilik <>, 2012 # Murat Sahin , 2012 # apshalasha , 2013 # Ömer Faruk Uzun , 2012 # zeugma , 2012 # volkangezer , 2013 # yusufbesir1 , 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-12 17:55+0000\n" "Last-Translator: volkangezer \n" "Language-Team: Turkish (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr " günler" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " pt" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " saniye" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " şarkılar" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 albüm" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 gün" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 gün önce" #: podcasts/gpoddersync.cpp:79 #, 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:413 #, qt-format msgid "%1 selected of" msgstr "%1 seçili" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 şarkı" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 şarkı" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 şarkı bulundu" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 şarkı bulundu (%2 tanesi gösteriliyor)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 parça" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 aktarıldı" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimotedev modülü" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n başarısız" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n tamamlandı" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "&Özel" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "Ekler" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "&Yardım" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "&Gizle %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "&Gizle..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Sol" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "Müzik" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Hiçbiri" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "Çalma Listesi" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Çık" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "Tekrar kipi" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Sağ" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "Rastgele kipi" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "&Sütunları pencereye sığacak şekilde ayarla" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "&Araçlar" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(her şarkı için farklı)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "...ve tüm Amarok katkıcılarına" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "0px" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 gün" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 parça" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "127.0.0.1" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "40%" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 rasgele parça" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "Şimdi Premium üyeliğine geçin" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "Bir yeni hesap oluştur veya parolayı sıfırla" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "Bir Grooveshark Anywhere hesabı gereklidir." #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "Bir Spotify Premium hesabı gereklidir." #: ../bin/src/ui_networkremotesettingspage.h:189 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:78 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:153 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:297 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "ALL GLORY TO THE HYPNOTOAD" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "İptal" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "%1 Hakkında" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "Clementine Hakkında..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "Qt Hakkında..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Hesap ayrıntıları" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "Hesap detayları (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Eylem" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Wiiremote etkinleştir/pasifleştir" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "Podcast Ekle" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Müzik Yayını Ekle" #: ../bin/src/ui_notificationssettingspage.h:425 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:193 msgid "Add action" msgstr "Eylem ekle" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Başka bir yayın ekle..." #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Dizin ekle..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "Dosya ekle" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "Dosyayı dönüştürücüye ekle" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "Dosyayı/dosyaları dönüştürücüye ekle" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Dosya ekle..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Dönüştürülecek dosyaları ekle" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Klasör ekle" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Klasör ekle..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Yeni klasör ekle..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "Podcast ekle" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "Podcast ekle..." #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Arama terimi ekle" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "Albüm etiketi ekle" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "Albüm sanatçısı etiketi ekle" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "Sanatçı etiketi ekle" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "Otomatik şarkı puanı ekle" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "Besteci etiketi ekle" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "Şarkı diski etiketi ekle" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "Dosya adı ekle" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "Şarkı tarzı etiketi ekle" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "Şarkı gruplama etiketi ekle" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "Şarkı uzunluğu etiketi ekle" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "Şarkıyı söyleyen etiketi ekle" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "Şarkı çalma sayısı ekle" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "Şarkı derecelendirmesi ekle" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "Şarkı atlama sayısı ekle" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "Şarkı adı etiketi ekle" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "Şarkıya parça etiketi ekle" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "Yıl etiketi ekle" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Yayın ekle..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "Grooveshark'i favorilere ekle" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "Grooveshark'i müzik listelerine ekle" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "Başka bir çalma listesine ekle" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Çalma listesine ekle" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "Kuyruğa ekle" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "wiimotedev eylemi ekle" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Ekle..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Bu ay eklenenler" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Bu hafta eklenenler" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Bu yıl eklenenler" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Bugün eklenenler" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Son üç ay içinde eklenenler" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "Parçayı müziklerime ekliyor" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "Şarkı favorilere ekleniyor" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Gelişmiş gruplama..." #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "Sonra " #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "Kopyalandıktan sonra..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Albüm" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Albüm (tüm parçalar için ideal ses yüksekliği)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Albüm sanatçısı" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "Albüm kapağı" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Jamendo.com'daki albüm bilgileri..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Kapak resmine olan albümler" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Kapak resmi olmayan albümler" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Tüm Dosyalar (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "All Glory to the Hypnotoad!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Tüm albümler" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Tüm sanatçılar" #: ui/albumcoverchoicecontroller.cpp:47 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:74 msgid "All the translators" msgstr "Tüm çevirmenler" #: library/library.cpp:84 msgid "All tracks" msgstr "Tüm parçalar" #: ../bin/src/ui_networkremotesettingspage.h:194 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:196 msgid "Allow downloads" msgstr "İndirmelere izin ver" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "Mid/side kodlamaya izin ver" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "Orijinallerin yanına" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Ana pencereyi her zaman gizle" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Ana pencereyi her zaman göster" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "Her zaman çalarak başlat" #: internet/spotifyblobdownloader.cpp:60 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:61 msgid "An error occurred loading the iTunes database" msgstr "iTunes veritabanı yüklenirken hata oluştu" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "'%1' dosyasına metadata yazarken hata oluştu" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "Belirlenemeyen bir hata oluştu." #: ui/about.cpp:78 msgid "And:" msgstr "Ve:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "Öfkeli" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Görünüm" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Çalma listesine dosya/URL ekle" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "Şu anki çalma listesine ekle" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "Çalma listesine ekle" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "Kesintiyi engellemek için sıkıştırma uygula" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "\"%1\" ayarını silmek istediğinizden emin misiniz?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "Bu çalan listeyi silmek istediğinizden emin misiniz?" #: ui/edittagdialog.cpp:769 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:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Sanatçı" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Sanatçı bilgisi" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "Sanatçı radyosu" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "Sanatçı etiketleri" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "Sanatçının kısaltması" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Ses biçimi" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Kimlik doğrulama başarısız" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "Yazar" #: ui/about.cpp:65 msgid "Authors" msgstr "Yazarlar" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Otomatik" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Otomatik güncelleme" #: ../bin/src/ui_librarysettingspage.h:208 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:45 msgid "Available" msgstr "Mevcut" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "Ortalama bithızı" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "Ortalama resim boyutu" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "BBC Podcastları" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "Arkaplan Akışları" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Arkaplan rengi" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "Arkaplan resmi" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Artalan saydamlığı" #: core/database.cpp:734 msgid "Backing up database" msgstr "Veritabanını yedekliyor" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "Denge" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Yasakla" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "Bar çözümleyici" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Temel Mavi" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "Temel ses tipi" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Davranış" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "En iyi" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "%1'den biyografi" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Bit oranı" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "Veri Akış Hızı" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "Blok çözümleyici" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "Engelleme türü" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "Bulanıklık miktarı" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "Gövde" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "Boom çözümleyici" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "Kutu" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Gözat..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "Önbellek süresi" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "Arabelleğe alınıyor" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "Ancak şu kaynaklar pasif:" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Düğmeler" #: core/song.cpp:339 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "CUE desteği" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "İptal" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Kapak resmini değiştir" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Yazı boyutunu değiştir..." #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "Tekrar modunu değiştir" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Kısayolu değiştir..." #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "Karıştırma modunu değiştir" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Dili değiştir" #: ../bin/src/ui_playbacksettingspage.h:330 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:228 msgid "Check for new episodes" msgstr "Yeni bölümler için kontrol et" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Güncellemeleri denetle..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "Akıllı çalma listesi için isim seçin" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Otomatik seç" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Rengi seç..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "Yazı tipi seç..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Listeden seç" #: smartplaylists/querywizardplugin.cpp:155 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." #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "Podcast indirme dizinini seç" #: ../bin/src/ui_songinfosettingspage.h:188 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:115 msgid "Classical" msgstr "Klasik" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "Temizliyor" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Temizle" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Çalma listesini temizle" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Clementine Hatası" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Clementine Turuncu" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Clementine Görselleştirme" #: ../bin/src/ui_deviceproperties.h:376 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_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine kutu içine yüklediğiniz müziği çalabilir" #: ../bin/src/ui_dropboxsettingspage.h:104 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:104 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_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "Clementine Ubuntu One'a yüklediğiniz müzikleri oynatabilir" #: ../bin/src/ui_notificationssettingspage.h:431 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:250 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:128 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." #: internet/lastfmsettingspage.cpp:110 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 "Clementine bağlantı sorunlarından dolayı abone bilgilerinize ulaşamadı. Çalınan şarkılar ön belleğe kaydedilecek ve daha sonra Last.fm'e gönderilecek." #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Clementine resim görüntüleyici" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "Clementine bu dosya için sonuç bulamadı" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "Clementine müzikleri şurada bulacak:" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Parça eklemek için buraya tıklayın" #: playlist/playlisttabbar.cpp:293 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:72 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_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "oynatma lis" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "Görselleştirmeyi kapat" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "Bu pencereyi kapatmak indirme işlemini iptal edecektir." #: ui/albumcovermanager.cpp:216 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:116 msgid "Club" msgstr "Kulüp" #: ../bin/src/ui_appearancesettingspage.h:272 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:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Yorum" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "Etiketleri otomatik tamamla" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "Etiketleri otomatik tamamla..." #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Besteci" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "Düzenle %1..." #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "Grooveshark'i ayarla" #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Last.fm'i Yapılandır..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "Magnatune'u Yapılandır..." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Kısayolları Yapılandır" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "Spotify'ı Yapılandır..." #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "Subsonic'i yapılandır..." #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "Genel aramayı düzenle..." #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "Kütüphaneyi düzenle..." #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "Podcastları ayarla..." #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "Yapılandır..." #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "Etkinleştir/pasifleştir eylemiyle Wii kumandasına bağlan" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "Aygıtı bağla" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "Spotify'a bağlanılıyor" #: internet/subsonicsettingspage.cpp:107 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/subsonicsettingspage.cpp:117 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/" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "Konsol" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "Sabit bithızı" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "Tüm müzikleri dönüştür" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "Aygıtın çalamadığı müzikleri dönüştür" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "Panoya kopyala" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Aygıta kopyala..." #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Kütüphaneye kopyala..." #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "Copyright" #: internet/subsonicsettingspage.cpp:81 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:64 #, 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" #: transcoder/transcoder.cpp:432 #, 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:426 #, 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/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "Last.fm radyo istasyonu yüklenemedi" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "%1 çıktı dosyası açılamadı" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Kapak Yöneticisi" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "Gömülü resimden kapak resmi" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Kapak resmi %1 adresinden otomatik olarak yüklendi" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "Kapak resmi elle çıkarıldı" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "Kapak resmi ayarlanmamış" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "Kapak resmi %1 adresinden ayarlandı" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "%1 adresindeki kapak resimleri" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "Yeni bir Grooveshark müzik listesi oluşturun" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "Parça değiştirirken otomatik olarak çapraz geçiş yap" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "Parça değiştirirken elle çapraz geçiş yap" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "Özel" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "Özel resim:" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "Mesaj ayarlarını özelleştir" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "Özel radyo" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Özel..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "DBus yolu" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Dans" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Oluşturulduğu tarih" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Değiştirildiği tarih" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "Gün" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "&Öntanımlı" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "Ses seviyesini 4% azalt" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr " oranında sesi azaltın" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Sesi azalt" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "Varsayılan arkaplan resmi" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "Öntanımlılar" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "Görselleştirmeler arasındaki gecikme" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "Sil" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "Grooveshark müzik listesini sil" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "İndirilmiş veriyi sil" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Dosyaları sil" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Aygıttan sil..." #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Diskten sil..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "Çalımış bölümleri sil" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "Ayarı sil" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "Akıllı çalma listesini silin" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "Orijinal dosyaları sil" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Dosyalar siliniyor" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "Seçili parçaları kuyruktan çıkar" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "Parçayı kuyruktan çıkar" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Hedef" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Detaylar..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Aygıt" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Aygıt Özellikleri" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Aygıt adı" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Aygıt özellikleri..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Aygıtlar" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Bunu mu demek istediniz" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "Digitally Imported parolası" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "Digitally Imported kullanıcı adı" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "Doğrudan internet bağlantısı" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Dizin" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "Süreyi devre dışı bırak" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "Moodbar oluşturmayı kapat" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Devre Dışı" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Disk" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "Kesikli aktarma" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 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:715 msgid "Do a full library rescan" msgstr "Tüm kütüphaneyi yeniden tara" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "Hiç bir müziği dönüştürme" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "Üzerine yazma" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Tekrarlama" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "Çeşitli sanatçılarda gösterme" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "Karıştırma" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "Durma!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "Bağış Yap" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Açmak için çift tıkla" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "Bir şarkıyı çift tıklamak..." #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "%n bölüm indir" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "İndirme dizini" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "Bölümleri şuraya indir" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "İndirme üyeliği" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "Yeni bölümleri otomatik olarak indir" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "Sıradakileri indir" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "Android uygulamasını indir" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Bu albümü indir" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Bu albümü indirin..." #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "Bu bölümü indir" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "İndir..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "İndiriyor (%1%)..." #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "Icecast dizini indiriliyor" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "Jamendo kataloğu indiriliyor" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "Magnatune kataloğu indiriliyor" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "Spotify eklentisi indiriliyor" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "Üstveri indiriliyor" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "Yeniden konumlandırmak için sürükleyin" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "Dropbox" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "Dinamik kip açık" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "Dinamik rastgele karışım" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "Akıllı çalma listesini düzenleyin" #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "\"%1\" etiketini düzenle..." #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "Etiketi düzenle..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "Etiketleri düzenle" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Parça bilgisini düzenle" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "Parça bilgisini düzenle..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Parça bilgilerini düzenle..." #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Düzenle..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "Wii kumanda desteğini etkinleştir" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "Ekolayzırı etkinleştir" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "Kısayolları sadece Clementine odaktayken etkinleştir" #: ../bin/src/ui_globalsearchsettingspage.h:147 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:62 msgid "Enable/disable Last.fm scrobbling" msgstr "Last.fm skroplamayı aç/kapa" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "Karmaşa çözümleniyor" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "Motor kalitesi çözümleniyor" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "Çözümleme modu" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "Bir URL gir" #: ../bin/src/ui_coverfromurldialog.h:103 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:205 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:137 msgid "Enter a new name for this playlist" msgstr "Bu çalma listesi için yeni bir isim gir" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Last.fm radyosunu dinlemeye başlamak için bir sanatçı veya bir etiket girin." #: ../bin/src/ui_globalsearchview.h:209 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 kısma arama terimlerinizi girin" #: ../bin/src/ui_itunessearchpage.h:77 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:77 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:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "Arama terimlerini buraya girin" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "Bir internet radyo yayın akışının URL'sini girin" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "Klasör ismini girin" #: ../bin/src/ui_networkremotesettingspage.h:198 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:87 msgid "Entire collection" msgstr "Tüm koleksiyon" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Hata" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "MTP aygıtına bağlanırken hata" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "Şarkılar kopyalanırken hata" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "Şarkılar silinirken hata" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "Spotify eklentisini indirirken hata" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "%1 yüklenirken hata" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "di.fm çalma listesi yüklenirken hata oluştu" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "%1 işlenirken hata: %2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "Ses CD'si yüklenirken hata" #: library/library.cpp:63 msgid "Ever played" msgstr "Önceden çalınmış" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "Her 10 dakikada" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "Her 12 saatte" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "Her 2 saatte" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "Her 20 dakikada" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "Her 30 dakikada" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "Her 6 saatte" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "Her saat" #: ../bin/src/ui_playbacksettingspage.h:303 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:208 msgid "Existing covers" msgstr "Mevcut kapaklar" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "Genişlet" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "Bitiş tarihi %1" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "Kapakları Aktar" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "Kapakları aktar" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "İndirilen kapakları aktar" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "Gömülü kapakları aktar" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "Biteni aktar" #: ui/albumcovermanager.cpp:786 #, 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:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 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:300 msgid "Fade out when stopping a track" msgstr "Bir parça durdurulurken yumuşak geç" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "Yumuşak geçiş" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "Yumuşak geçiş süresi" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "Dizin getirme başarısız oldu" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "Podcastların indirilmesi başarısız oldu" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "Podcastların yüklenmesi başarısız oldu" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "Bu RSS beslemesinin XML çözümlemesi başarısız oldu" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "Hızlı" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "Favoriler" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "Beğenilen parçalar" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "Eksik Albüm Kapaklarını İndir" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "Otomatik indir" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "Alım tamamlandı" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "Subsonic kütüphanesi eşleştiriliyor" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Kapak alınırken bir hata oluştu" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "Dosya uzantısı" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "Dosya biçimleri" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Dosya adı" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "Dosya adı (yol hariç)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Dosya boyutu" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Dosya türü" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Dosya adı" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Dosyalar" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "Dönüştürülecek dosyalar" #: smartplaylists/querywizardplugin.cpp:90 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." #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "Şarkının parmak izi çıkartılıyor" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "Bitir" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "İlk Seviye" #: core/song.cpp:328 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Yazı tipi boyutu" #: ../bin/src/ui_spotifysettingspage.h:213 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:204 msgid "Force mono encoding" msgstr "Mono çözümlemeye zorla" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "Aygıtı unut" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Biçim" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "Biçim" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Kare oranı" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "Tambon başına kare" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Arkadaşlar" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "Soğuk" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Full Bass" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "Full Bass + Tiz" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "Yüksek tiz" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "GStreamer ses motoru" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "Genel" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Genel ayarlar" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Tür" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "Bu Grooveshark çalma listesini paylaşmak için bir URL al" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "Bu Grooveshark şarkısını paylaşmak için bir URL al" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "Grooveshark popüler şarkılar alınıyor" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "Kanallar alınıyor" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "Akışlar alınıyor" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "Bir isim verin:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "Git" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "Sıradaki listeye git" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "Önceki listeye git" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, 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:206 msgid "Grey out non existent songs in my playlists" msgstr "Çalma listemde olmayan şarkıları gri göster" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "Grooveshark giriş hatası" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "Grooveshark çalma listesinin URL adresi" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "Grooveshark radyo" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "Grooveshark şarkısının adresi" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "Kütüpheneyi şuna göre grupla..." #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "Grupla" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "Albüme göre grupla" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "Sanatçıya göre grupla" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "Sanatçı/Albüme göre grupla" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "Sanatçı/Yıl - Albüme göre grupla" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "Tür/Albüme göre grupla" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "Tür/Sanatçı/Albüme göre grupla" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "Gruplandırma" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "HTML sayfası herhangi bir RSS beslemesi içermiyor" #: internet/subsonicsettingspage.cpp:135 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:163 msgid "HTTP proxy" msgstr "HTTP vekil sunucu" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "Mutlu" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "Donanım bilgisi" #: ../bin/src/ui_deviceproperties.h:372 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:202 msgid "High" msgstr "Yüksek" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "Yüksek (%1 fps)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "Yüksek (1024x1024)" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "Sunucu bulunamadı, sunucu adresini denetleyin. Örnek: http://localhost:4040/" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "Saat" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "Magnatune hesabım yok" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Simge" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "Üstteki simgeler" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "Şarkı teşhis ediliyor" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 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:77 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:204 msgid "Ignore \"The\" in artist names" msgstr "Sanatçı isimlerinde \"The\" kelimesini önemseme" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Resimler (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "%1 günde" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "%1 haftada" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "Dinamik modda yeni şarkılar seçilerek, her şarkı bittiğinde çalma listesine eklenecektir." #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "Gelen Kutusu" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "Bildirimde albüm resimlendirmesini göster" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "Tüm şarkıları içer" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Uyumsuz Subsonic REST protokol sürümü. İstemci yükseltilmeli." #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Uyumsuz Subsonic REST protokol sürümü. Sunucu yükseltilmeli." #: internet/subsonicsettingspage.cpp:127 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:158 msgid "Increase the volume by 4%" msgstr "Ses seviyesini 4% arttır" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr " oranında sesi artırın" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Sesi arttır" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "%1 İndekslendi" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "Bilgi" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "Ekle..." #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Kuruldu" #: core/database.cpp:673 msgid "Integrity check" msgstr "Bütünlük doğrulaması" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "İnternet sağlayıcılar" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "Geçersiz API anahtarı" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Geçersiz biçim" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "Geçersiz metod" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "Geçersiz parametreler" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "Geçersiz kaynak belirtildi" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "Geçersiz servis" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "Geçersiz oturum anahtarı" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "Geçersiz kullanici adi yada şifre" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "Jamendo En Çok Dinlenen Parçalar" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "Jamendo Zirvedeki Parçalar" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "Jamendo Ayın Zirvedeki Parçaları" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "Jamendo Haftanın Zirvedeki Parçaları" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "Jamendo veritabanı" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "Şu anda çalınan parçaya atla" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Düğmeleri %1 saniye tut..." #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Düğmeleri %1 saniye tut..." #: ../bin/src/ui_behavioursettingspage.h:193 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:193 msgid "Keep the original files" msgstr "Orijinal dosyaları sakla" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "Kedicikler" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Dil" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "Dizüstü/Kulaklık" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Geniş Salon" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "Geniş albüm kapağı" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "Büyük kenar çubuğu" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "Son çalınan" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "Las.fm Kişisel Radyo: %1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Last.fm Kütüphanesi - %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "Last.fm Karışık Radyo - %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Last.fm Komşu Radyo - %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Last.fm Radyo İstasyonu - %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Last.fm %1 ile Benzer Sanatçılar" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Last.fm Etiket Radyosu: %1" #: internet/lastfmservice.cpp:437 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:154 msgid "Last.fm password" msgstr "Last.fm parolası" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "Last.fm çalma sayısı" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Last.fm etiketleri" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Last.fm kullanıcı adı" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Last.fm wiki" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "Az beğenilen parçalar" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "Öntanımlıların kullanılması için boş bırakın. Örnekler: \"/dev/dsp\", \"front\" vs." #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "So" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Süre" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Kütüphane" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "Kütüphane gelişmiş gruplama" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "Kütüphane yeniden tarama bildirisi" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "Kütüphane araması" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Limitler" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "Daha önceden dinlediğiniz şarkılar temel alınarak Grooveshark şarkıları dinleyin" #: ui/equalizer.cpp:123 msgid "Live" msgstr "Canlı" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Yükle" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "Bağlantıdan kapak al" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "Kapağı bu URL'den yükle..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "Diskten kapak yükle" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "Albüm kapağını diskten yükle..." #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "Çalma listesini yükle" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "Çalma listesi yükle..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Last.fm radyosu yükleniyor" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "MTP aygıtı yükleniyor" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "iPod veritabanı yükleniyor" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "Akıllı çalma listesi yükleniyor" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "Şarkılar yükleniyor" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "Yayın akışı yükleniyor" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "Parçalar yükleniyor" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "Parça bilgileri yükleniyor" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "Yükleniyor..." #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "Dosyaları/URLleri yükler, mevcut çalma listesinin yerine koyar" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Oturum aç" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "Giriş başarısız oldu." #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "Long term prediction profile (LTP)" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "Beğen" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Düşük (%1 fps)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "Düşük (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "Düşük karmaşıklık profili (LC)" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "Şarkı sözleri" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "%1'den şarkı sözleri" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Magnatune İndir" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Magnatune indirme bitti" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "Ana profil (MAIN)" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "Make it so!" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "Çalma listesini çevrim dışındayken kullanılabilir yap" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "Bozuk yanıt" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "Elle vekil sunucu yapılandırma" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "El ile" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "Üretici" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "Dinlenmiş olarak işaretle" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "Yeni olarak işaretle" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "Her arama terimiyle eşleştir (VE)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "Bir veya daha fazla arama terimiyle eşleştir (VEYA)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "Maksimum bit oranı" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "Orta (%1 fps)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "Orta (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "Üyelik türü" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "Minimum bit oranı" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "Eksik projectM ayarları" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "Model" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "Kütüphanede olacak değişiklikleri izle" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "Tekli oynat" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "Ay" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "Atmosfer" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "Atmosfer çubuğu tasarımı" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "Atmosfer çubukları" #: library/library.cpp:74 msgid "Most played" msgstr "En fazla çalınan" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "Bağlama noktası" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "Bağlama noktaları" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "Aşağı taşı" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "Kütüphaneye taşı..." #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "Yukarı taşı" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "Müzik" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Müzik Kütüphanesi" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "Sessiz" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "Last.fm Kütüphanem" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "Last.fm Karışık Radyom" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "Last.fm Komşularım" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "Last.fm Önerilen Radyom" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "Karışık Radyom" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "Müziğim" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "Komşularım" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "Radyom" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "Önerdiklerim" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "İsim" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "İsimlendirme seçenekleri" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "Dar band (NB)" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "Komşular" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "Ağ" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "Vekil Sunucu" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "Uzak ağ" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "Hiçbir zaman" #: library/library.cpp:67 msgid "Never played" msgstr "Hiç çalınmamış" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "Asla çalarak başlama" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "Yeni klasör" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "Yeni çalma listesi" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "Yeni akıllı çalma listesi..." #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "Yeni şarkılar" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "Yeni parçalar otomatik olarak eklenecektir." #: library/library.cpp:80 msgid "Newest tracks" msgstr "En yeni parçalar" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "İleri" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Sonraki parça" #: core/utilities.cpp:147 msgid "Next week" msgstr "Gelecek hafta" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "Çözümleyici yok" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "Arkaplan resmi yok" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "Aktarılacak kapak yok." #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "Uzun blok yok" #: playlist/playlistcontainer.cpp:366 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:145 msgid "No short blocks" msgstr "Kısa blok yok" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "Hiçbiri" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 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:155 msgid "Normal" msgstr "Normal" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "Normal blok tipi" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "Dinamik şarkı listesi kullanırken geçerli değil" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "Bağlı Değil" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "Yeterli içerik yok" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "Yeterli hayran yok" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "Yeterli üye yok" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "Yeterli komşu yok" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Kurulu değil" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "Giriş yapmadınız" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "Bağlı değil - bağlamak için çift tıklayın" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "Bildirim türü" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Bildirimler" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Şimdi Çalıyor" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "OSD Önizleme" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "Opaklık" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "Tarayıcıda aç: %1" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "&Ses CD'si aç..." #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "OPML dosyası aç" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "OPML dosyasını aç..." #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "Aygıtı aç" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "Dosya aç..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "Google Drive'da aç" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "Yeni çalma listesinde aç" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Aç..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "İşlem başarısız" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "Bit oranı için optimize et" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "Kalite için optimize et" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "Seçenekler..." #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "Dosyaları Düzenle" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "Dosyaları düzenle..." #: core/organise.cpp:65 msgid "Organising files" msgstr "Dosyalar düzenleniyor" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "Özgün etiketler" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Diğer seçenekler" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "Çıktı" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "Çıktı aygıtı" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "Çıktı seçenekleri" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "Çıktı eklentisi" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "Tümünün üzerine yaz" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "Mevcut dosyaların üzerine yaz" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "Sadece daha küçük olanların üzerine yaz" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "Sahibi" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "Jamendo kataloğu ayrıştırılıyor" #: ui/equalizer.cpp:124 msgid "Party" msgstr "Parti" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "Parola" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Duraklat" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "Beklet" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Duraklatıldı" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "Sanatçı" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "Piksel" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "Düz kenar çubuğu" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Çal" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "Sanatçı veya Etiket Çal" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "Sanatçı radyosu çal..." #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "Çalma sayısı" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "Özel radyo çal..." #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "Duraklatılmışsa çal, çalıyorsa beklet" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "Çalan birşey yoksa çal" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "Etiket radyosu çal..." #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "Listedeki numaralı parçayı çal" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "Çal/Duraklat" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Oynat" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Oynatıcı seçenekleri" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "Çalma Listesi" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "Parça listesi tamamlandı" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "Çalma listesi seçenekleri" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "Çalma listesi türü" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "Çalma listeleri" #: ../data/oauthsuccess.html:36 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:214 msgid "Plugin status:" msgstr "Eklenti durumu:" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "Podcastlar" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Pop" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "Popüler şarkılar" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "Bu ayın popüler şarkıları" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "Bugünün popüler şarkıları" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "Açılır pencere süresi" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "Port" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "Ön yükseltici" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "Tercihler" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "Tercihler..." #: ../bin/src/ui_librarysettingspage.h:202 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:167 msgid "Preferred audio format" msgstr "Tercih edilen ses biçimleri" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "Tercih edilen bit oranı" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "Tercih edilen biçim" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "Premium ses tipi" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "Ayar:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "Kullanmak için bir tuş kombinasyonuna basın" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "Bir tuşa basın" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, 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_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "OSD seçenekleri" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "Önizleme" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "Önceki" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 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:131 msgid "Profile" msgstr "Profil" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "İlerleme" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 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:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "Kalite" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "Aygıt sorgulanıyor..." #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "Kuyruk Yöneticisi" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "Seçili parçaları kuyruğa ekle" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "Parçayı kuyruğa ekle" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "Radyo (tüm parçalar için eşit ses seviyesi)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "Radyolar" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "Yağmur" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "Karışık görseller" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "Geçerli şarkıyı 0 yıldızla oyla" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "Geçerli şarkıyı 1 yıldızla oyla" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "Geçerli şarkıyı 2 yıldızla oyla" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "Geçerli şarkıyı 3 yıldızla oyla" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "Geçerli şarkıyı 4 yıldızla oyla" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "Geçerli şarkıyı 5 yıldızla oyla" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "Beğeni" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "Gerçekten iptal edeyim mi?" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "Yönlendirme limiti aşıldı, sunucu yapılandırmasını doğrulayın." #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "Yenile" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "Kataloğu yenile" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "Kanalları yenile" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "Arkadaş listesini yenile" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "İstasyon listesini yenile" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "Akışları yenile" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Reggae" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "Wii kumanda sallamayı hatırla" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "Son seferkinden hatırla" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Kaldır" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "Eylemi kaldır" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "Şarkı listesindeki çiftleri birleştir" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "Klasörü kaldır..." #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "Müziklerimden sil" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "Favorilerden kaldır" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "Çalma listesinden kaldır" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "Çalma listesini kaldır" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "Çalma listesini kaldır" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "Parçalar müziklerimden siliniyor" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "Parçalar favorilerimden siliniyor" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "\"%1\" çalma listesini yeniden adlandır" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "Grooveshark çalma listesini yeniden adlandır" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "Çalma listesini yeniden adlandır" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "Çalma listesini yeniden adlandır..." #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "Parçaları bu sırada hatırla..." #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Tekrarla" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "Albümü tekrarla" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "Çalma listesini tekrarla" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "Parçayı tekrarla" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Şu anki çalma listesinin yerine geç" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "Çalma listesinin yerine geç" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "Boşlukları alt çizgiyle değiştirir" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "Replay Gain" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "Yeniden Oynatma Kazanç kipi" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "Yeniden doldur" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "Doğrulama kodu iste" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "Sıfırla" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" msgstr "Çalma sayısını sıfırla" #: 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:206 msgid "Restrict to ASCII characters" msgstr "ASCII karakterler olarak kısıtla" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "Başlarken çalmaya devam et" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "Grooveshark'tan My Music şakıları çekiliyor" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "Grooveşark favori şarkılar alınıyor" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "Grooveshark çalma listeleri alınıyor" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "Clementine'e Geri Dön" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "Sağ" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "Çalıştır" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "SOCKS vekil sunucu" #: internet/subsonicsettingspage.cpp:122 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:202 msgid "Safely remove device" msgstr "Aygıtı güvenli kaldır" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "Kopyalama işleminden sonra aygıtı güvenli kaldır" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "Örnekleme oranı" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "Örneklemeoranı" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr ".mood dosyalarını müzik kütüphaneme kaydet" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "Kapağı kaydet" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "Kapağı diske kaydet..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "Görüntüyü kaydet" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "Çalma listesini kaydet" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "Çalma listesini kaydet..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "Ayarı kaydet" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "Mümkün olduğunda beğenileri dosya etiketlerine kaydet" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "Mümkün olduğunda istatistikleri dosya etiketlerine kaydet" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "Bu akışı Internet sekmesine kaydet" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "Şarkı istatistikleri şarkı dosyalarına kaydediliyor" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "Parçalar kaydediliyor" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "Ölçeklenebilir örnekleme oranı profili (SSR)" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "ÖLçek boyutu" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "Puan" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "Dinlediğim parçaları skropla" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "Ara" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "Icecast istasyonları ara" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "Jamendo'da ara" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Magnatune'da Ara" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "Subsonic'de Ara" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "Albüm kapaklarını ara..." #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "Herhangi birşey ara" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "gpodder.net'i ara" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "iTunes'u ara" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "Arama kipi" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "Arama seçenekleri" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "Arama sonuçları" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "Arama terimleri" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "Grooveshark'da Ara" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "İkinci seviye" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "Geriye doğru ara" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "İleri doğru ara" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "Çalan parçayı görece miktara göre ara" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "Çalan parçayı kesin bir konuma göre ara" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "Tümünü Seç" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "Hiçbirini Seçme" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "Arkaplan rengini seçin:" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "Arkaplan resmini seçin" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "En uygun eşleşmeyi seç" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "Ön plan rengi seçin:" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "Görsel seç" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "Görselleştirmeleri seç..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "Seri numarası" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "Sunucu URL'si" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "Sunucu ayrıntıları" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "Hizmet çevrim dışı" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "%1'i \"%2\" olarak ayarla" #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "Ses seviyesini yüzde yap" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "Seçili tüm parçalar için değeri ayarla..." #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "Ayarlar" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Kısayol" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "%1 için kısayol" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "%1 için kısayol zaten tanımlı" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Göster" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "OSD göster" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "Mevcut parçada parlayan bir animasyon göster" #: ../bin/src/ui_appearancesettingspage.h:293 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:434 msgid "Show a native desktop notification" msgstr "Masaüstü bildirimi göster" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Tekrarla/karıştır modunu değiştirdiğimde bir bildirim göster" #: ../bin/src/ui_notificationssettingspage.h:441 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:436 msgid "Show a popup from the system tray" msgstr "Sistem tepsisinden bir açılır pencere göster" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "Şirin bir OSD göster" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "Durum çubuğunun üzerinde göster" #: ui/mainwindow.cpp:460 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:209 msgid "Show cover art in library" msgstr "Kapak resmini kütüphanede göster" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "Ayırıcıları göster" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "Tam boyutta göster" #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "Dosya gözatıcısında göster..." #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "Çeşitli sanatçılarda göster" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "Atmosfer çubuğunu göster" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "Sadece aynı olanları göster" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "Sadece etiketi olmayanları göster" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "Arama önerilerini göster" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "\"Beğen\" ve \"Yasakla\" tuşlarını göster" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "Ana pencerede skroplama düğmesini göster" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "Sistem çekmecesi simgesini göster" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "Hangi kaynakların aktif ya da pasif olduğunu göster" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "Göster/Gizle" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Karışık" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "Albümleri karıştır" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "Hepsini karıştır" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "Çalma listesini karıştır" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "Bu albümdeki şarkıları karıştır" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "Giriş yap" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "Çıkış yap" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "Oturum açılıyor..." #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "Benzer sanatçılar" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "Boyut" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "Boyut:" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "Parça listesinde geri git" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "Atlama sayısı" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "Parça listesinde ileri git" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "Küçük albüm kapağı" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "Küçük kenar çubuğu" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "Akıllı çalma listesi" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "Akıllı çalma listeleri" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Hafif" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "Hafif Rock" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "Şarkı Bilgisi" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "Şarkı bilgisi" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "Sonogram" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "Üzgünüm" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "Türe göre sırala (alfabetik)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "Türe göre sırala (popülarite)" #: ../bin/src/ui_icecastfilterwidget.h:77 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" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "Kaynak" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "Kaynaklar" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "Spotify giriş hatası" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "Spotify eklentisi" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "Spotify eklentisi kurulu değil" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "Standard" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "Yıldızlı" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "Çalma listesini mevcut çalınanla başlat" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "Dönüştürmeye başla" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 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:405 #, qt-format msgid "Starting %1" msgstr "%1 Başlatılıyor" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "Başlatılıyor..." #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "İstasyonlar" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Durdur" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "Şundan sonra durdur" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "Bu parçadan sonra durdur" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Duraklat" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "Bu parçadan sonra durdur" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "Durduruldu" #: core/song.cpp:341 msgid "Stream" msgstr "Akış" #: internet/subsonicsettingspage.cpp:30 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:160 msgid "Streaming membership" msgstr "Yayın akış üyeliği" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "Abone olunan çalma listeleri" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "Aboneler" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "Başarılı!" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "%1 başarıyla yazıldı" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "Önerilen etiketler" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "Özet" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "Süper yüksek (%1 fps)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "Çok yüksek çözünürlük (2048x2048)" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "Desteklenen biçimler" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "İstatistikleri dosyalara şimdi eşleştir" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "Spotify gelen kutusu eşleniyor" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "Spotify çalma listesi eşleniyor" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "Spotify yıldızlı şarkılar eşleniyor" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "Sistem renkleri" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "Üstteki sekmeler" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Etiket" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "Etiket getirici" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "Etiket radyosu" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "Hedeflenen bit oranı" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Tekno" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "Metin seçenekleri" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Teşekkürler" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "\"%1\" komutu başlatılamadı." #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "Şu anda çalan şarkının albüm kapağı" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "%1 dizini geçersiz" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "Çalma listesi '%1' boş veya yüklenemiyor." #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "İstediğiniz site bir resim değil!" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "Bu albümde başka şarkılar da var" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "gpodder.net ile iletişimde bir sorun oluştu." #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Magnatude servisinden veri alınırken hata oluştu" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "iTunes Store'dan gelen yanıtı çözümlemede bir sorun oluştu" #: ui/organiseerrordialog.cpp:56 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:389 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:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 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:187 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:174 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:151 msgid "Third level" msgstr "Üçüncü seviye" #: internet/jamendoservice.cpp:171 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/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "Bu albüm istenilen biçimde mevcut değil" #: ../bin/src/ui_deviceproperties.h:381 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:375 msgid "This device supports the following file formats:" msgstr "Bu aygıt aşağıdaki dosya biçimlerini destekler:" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Bu aygıt düzgün çalışmayacak" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Bu seçenek \"Davranış\" tercihlerinden değiştirilebilir" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "Bu yayın sadece abone olan kullanıcılar içindir" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "Bu tür bir aygıt desteklenmiyor: %1" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "Zaman Aşımı" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Başlık" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "Grooveshark radyosu dinleyebilmeniz için öncelikle birkaç tane Grooveshark şarkısı dinlemelisiniz." #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "Bugün" #: core/globalshortcuts.cpp:59 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:1369 msgid "Toggle queue status" msgstr "Kuyruk durumunu göster/gizle" #: ../bin/src/ui_mainwindow.h:718 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:143 msgid "Tomorrow" msgstr "Yarın" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "Çok fazla yeniden yönlendirme" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "En çok dinlenen parçalar" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "Toplam albüm:" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "Aktarılan toplam bayt" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "Yapılmış toplam ağ istemi" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Parça" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "Müzik Dönüştür" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "Dönüştürücü Kaydı" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "Kod çevrimi" #: transcoder/transcoder.cpp:312 #, 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:54 msgid "Transcoding options" msgstr "Kod çevrimi seçenekleri" #: core/song.cpp:338 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "Türbin" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "Kapat" #: devices/giolister.cpp:161 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "URL(ler)" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "Ubuntu One parolası" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "Ubuntu One kullanıcı adı" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "Engin frekans bandı (UWB)" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "%1 indirilemedi (%2)" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Bilinmeyen" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "Bilinmeyen içerik türü" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Bilinmeyen hata" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "Albüm kapağını çıkar" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "Abonelikten çık" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "Yaklaşan Konserler" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "Grooveshark çalma listesini güncelle" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "Bütün podcastları güncelle" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "Değişen kütüphane klasörlerini güncelle" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "Clementine başladığında kütüphaneyi güncelle" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "Bu podcast'ı güncelle" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "Güncelliyor" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "%1 Güncelleniyor" #: devices/deviceview.cpp:103 #, 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:150 msgid "Usage" msgstr "Kullanım" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "Varsa Albüm sanatçısı etiketini kullan" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "Gnome kısayol tuşlarını kullan" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "Varsa Replay Gain verisini kullan" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "SSLv3 kullan" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "Wii kumandasını kullan" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "Özel bir renk düzeni kullan" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "Bildirimler için özel bir mesaj kullan" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "Bir ağ uzak denetimi kullan" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "Kimlik denetimi kullan" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "Bir oranı kontrolü yönetimini kullan" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "Dinamik kip kullan" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "Wii kumanda durumunu raporlamak için bildirimleri kullan" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "Temporal noise shaping kullan" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "Sistem öntanımlıyı kullan" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "Varsayılan sistem renk düzenini kullan" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "Sistem vekil sunucu ayarlarını kullan" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "Ses normalleştirme kullan" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "Kullanılan" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "%1 Kullanicinin Grooveshark Anywhere hasabi yok" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "Kullanıcı arayüzü" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Kullanıcı Adı" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "Menü kullanarak şarkı eklemek..." #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "Değişken bit oranı" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "Çeşitli sanatçılar" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "Sürüm %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "Görünüm" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "Görüntüleme kipi" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "Görseller" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "Görüntüleme Ayarları" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "Ses aktivitesi algılama" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "Ses %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "Bir çalma listesi sekmesini kapatırken beni uyar" #: core/song.cpp:337 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "İnternet sitesi" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "Haftalar" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "Clementine başladığında" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "Liste boş olduğunda..." #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "Neden denemeyelim..." #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "Geniş Bant (WB)" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii Kumanda %1: etkin" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii Kumanda %1: bağlandı" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii Kumanda %1: kritik pil seviyesi (%2%) " #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii Kumanda %1: etkin değil" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii Kumanda %1: çıkarıldı" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Kumanda %1: düşük pil seviyesi (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "Windows Medya 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "Windows Medya 64k" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "Windows Media audio" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "Kapak resmi olmayan:" #: library/libraryview.cpp:530 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:2088 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:151 msgid "Write all songs statistics into songs' files" msgstr "Tüm şarkı istatistiklerini şarkı dosyalarına yaz" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "Yanlış kullanıcı adı veya parola." #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "Yıl" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "Yıl - Albüm" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "Yıl" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "Dün" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "Aşağıdaki albümleri indirmek üzeresiniz" #: playlist/playlistlistcontainer.cpp:311 #, 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:177 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:172 msgid "You are not signed in." msgstr "Oturum açmadınız." #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "%1 olarak oturum açtınız." #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "Oturum açtınız." #: ../bin/src/ui_groupbydialog.h:123 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/digitallyimportedsettingspage.cpp:46 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/magnatunesettingspage.cpp:53 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:57 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." #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "Parçaları ücretsiz olarak skroplayabilirsiniz, fakat sadece ücretli aboneler Last.fm radyosunu dinleyebilir." #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "Bir Grooveshark Anywhere hesabınız yok" #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Spotify Premium hesabınız yok." #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "Aktif bir aboneliğiniz yok" #: internet/spotifyservice.cpp:170 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/spotifysettingspage.cpp:158 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:87 msgid "You love this track" msgstr "Bu şarkıyı seviyorsunuz" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "Clementine'da genel kısayolları kullanabilmek için Sistem Ayarlarına girin ve \"Yardımcı aygıtlara erişimi etkinleştir\" seçeneğini açın." #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "Dili değiştirdiyseniz programı yeniden başlatmanız gerekmektedir." #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "Last.fm abonesi olmadığınız için Last.fm kanallarını dinleyemeyeceksiniz." #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "IP adresiniz:" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Last.fm giriş bilgileriniz doğru değil" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "Magnatune kimlik bilgileriniz hatalı" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "Kütüphaneniz boş!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "Radyo yayın akışlarınız" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "Skroplarınız: %1" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "Sisteminizde OpenGL desteği yok, görselleştirmeler çalışmayacak." #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "Kullanıcı adı veya parolanız yanlış." #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Sıfır" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "%n şarkıyı ekle" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "sonra" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "önce" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "ve" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "otomatik" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "önce" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "arasında" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "ilk önce en büyüğü" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "şunu içeriyor" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "devre dışı" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "disk %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "şunu içermiyor" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "şununla bitiyor" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "eşittir" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "gpodder.net" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "gpodder.net dizini" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "büyüktür" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "Sonuncu" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "küçüktür" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "ilk önce en uzunu" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "%n şarkıyı taşı" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "ilk önce en yenisi" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "eşit değiller" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "şu süreden beri değil:" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "değil" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "ilk önce en eskisi" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "açık" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "seçenekler" #: ../bin/src/ui_networkremotesettingspage.h:203 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:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "%n şarkıyı kaldır" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "ilk önce en kısası" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "Parçaları karıştır" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "ilk önce en küçüğü" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "şarkıları sırala" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "şununla başlıyor" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "durdur" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "parça %1" clementine-1.2.0+dfsg/src/translations/tr_TR.po000066400000000000000000003737011223327513400214730ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # devingregory , 2012 # Erhan BURHAN <>, 2012 # Necdet Yücel , 2012 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:08+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Turkish (Turkey) (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr "gün" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr "kbps" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr "ms" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr "pt" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr "saniye" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "şarkılar" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 albümler" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 gün" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 gün önce" #: podcasts/gpoddersync.cpp:79 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 çalma listesi (%2)" #: playlist/playlistmanager.cpp:413 #, qt-format msgid "%1 selected of" msgstr "" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 parça" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 şarkı" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 parça bulundu" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 şarkı bulundu (gösterilen: %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 parça" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 aktarıldı" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, qt-format msgid "%L1 other listeners" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:92 #, qt-format msgid "%L1 total plays" msgstr "%L1 toplam oynatma" #: ../bin/src/ui_notificationssettingspage.h:427 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n başarısız" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n tamamlandı" #: transcoder/transcodedialog.cpp:192 #, c-format msgid "%n remaining" msgstr "%n kaldı" #: playlist/playlistheader.cpp:37 msgid "&Align text" msgstr "Metni &hizala" #: playlist/playlistheader.cpp:40 msgid "&Center" msgstr "&Merkeze" #: ../bin/src/ui_globalshortcutssettingspage.h:178 msgid "&Custom" msgstr "&Özel" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "&Yardım" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "&Sakla %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "&Gizle" #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Sola" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Hiçbiri" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Çıkış" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Sağa" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "&Araçlar" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 gün" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 şarkı" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 rasgele şarkı" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "Bir Grooveshark Anywhere hesabı gereklidir." #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "Bir Spotify Premium hesabı gereklidir." #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:78 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:153 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Parça bu şartlara uyarsa çalma listesine eklenecek" #: smartplaylists/searchterm.cpp:297 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "%1 hakkında" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "Clementine hakkında..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "Qt hakkında..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Hesap detayları" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "Hesap detayları (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Eylem" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Aç/kapat Wiiremote" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Stream ekle" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "Eylem ekle" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Başka bir stream ekle" #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Dizin ekle..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Dosya ekle..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Klasör ekle" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Klasör ekle..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Yeni klasör ekle..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "" #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Arama terimi ekle" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "Parça albüm etiketi ekle" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "Parça albüm sanatçısı etiketi ekle" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "Sanatçı etiketi ekle" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "Bestekar etiketi ekle" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "Parça türü etiketi ekle" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "Parça uzunluğu etiketi ekle" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "Parça çalma sayacı ekleyin" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "Parça atlama sayacı ekleyin" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "Parça adı etiketi ekle" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "Parça yılı etiketi ekle" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Akış ekleyin..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "Başka bir çalma listesi ekle" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Çalma listesine ekle" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "Sıraya ekle" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Ekle..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Bu ay eklendi" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Bu hafta eklendi" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Bu yıl eklendi" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Bugün eklendi" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Üç ay içinde eklendi" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "Müziğim'e parça ekle" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "" #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "Sonra" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "Kopyalandıktan sonra..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Albüm" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Albüm sanatçısı" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "Albüm kapağı" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Jamendo.com'da albüm bilgisi..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Kapaklı albümler" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Kapaksız albümler" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Bütün Dosyalar (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Tüm albümler" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Tüm sanatçılar" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "Bütün dosyalar (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Bütün çalma listeleri (%1)" #: ui/about.cpp:74 msgid "All the translators" msgstr "" #: library/library.cpp:84 msgid "All tracks" msgstr "Bütün parçalar" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "Orjinalleriyle beraber" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Her zaman ana pencereyi sakla" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Her zaman ana pencereyi göster" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "Her zaman çalmaya başla" #: internet/spotifyblobdownloader.cpp:60 msgid "" "An additional plugin is required to use Spotify in Clementine. Would you " "like to download and install it now?" msgstr "" #: devices/gpodloader.cpp:61 msgid "An error occurred loading the iTunes database" msgstr "" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:78 msgid "And:" msgstr "Ve:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "Kızgın" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Görünüm" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Sanatçı" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Sanatçı bilgisi" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "Sanatçı radyosu" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "Sanatçı etiketi" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Ses biçimi" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "" #: ui/about.cpp:65 msgid "Authors" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Otomatik" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Otomatik güncelleme" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "Hazır" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "Ortamala bit hızı" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "Ortalama resim boyutu" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Arkaplan rengi" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "Arkaplan resmi" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Arkaplan saydamlığı" #: core/database.cpp:734 msgid "Backing up database" msgstr "Veritabanı yedekleniyor" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Yasakla" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Davranış" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "En iyi" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Bit rate" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "Bitrate" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Gözat..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Düğmeler" #: core/song.cpp:339 msgid "CDDA" msgstr "" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "İptal" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Kapağı değiştir" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Yazı boyunu değiştir..." #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "Yineleme modunu değiştir" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Kısayolu değiştir..." #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "Karıştırma modunu değiştir" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Dili değiştir" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Güncellemeleri kontrol et..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "Akıllı çalma listesine ad seçin" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Otomatik olarak seç" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Renk değiştir..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "Yazı tipini değiştir..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Listeden seç" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "" #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "" #: ui/equalizer.cpp:115 msgid "Classical" msgstr "Klasik" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Temizle" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Çalma listesini temizle" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Clementine Hatası" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Clementine Turuncu" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "" #: ../bin/src/ui_deviceproperties.h:376 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "" #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "Clementine parça değiştiğince mesaj gösterebilir" #: ../bin/src/ui_podcastsettingspage.h:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: internet/lastfmsettingspage.cpp:110 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 "" #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Biraz müzik eklemek için tıklayın" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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 "Kapat" #: playlist/playlisttabbar.cpp:54 msgid "Close playlist" msgstr "Çalma listesini kapat" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "Pencereyi kapatmak indirmeyi durduracak" #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "" #: ui/equalizer.cpp:116 msgid "Club" msgstr "Kulüp" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Colors" msgstr "Renkler" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Yorum" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "Etiketleri otomatik tamamla" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "Etiketleri otomatik tamamla..." #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Bestekâr" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "" #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "Grooveshark'ı düzenle" #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "" #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Kısayolları yapılandır" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "Spotify'ı yapılandır" #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "Kütüphaneyi yapılandır" #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "" #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "Ayarla..." #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "Aygıt bağla" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "Spotify'a bağlanıyor" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "Sabit bit hızı" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "Tüm müzikleri çevir" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "Aygıtın çalamadığı herhangi müziği çevir" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Aygıta kopyala" #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Kütüphaneye kopyala" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:64 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: transcoder/transcoder.cpp:432 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Kapak yöneticisi" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "Gömülü resimden kapak resmi" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "Özel" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "İsteğe bağlı resim" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "İsteğe göre mesaj ayarları" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "İsteğe göre radyo" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "İsteğe göre..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Dans" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Veri oluşturuldu" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Tarih değiştirildi" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "Günler" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Sesi azalt" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "Varsayılan arkaplan resmi" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "Varsayılanlar" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "Sil" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Dosyaları sil" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Aygıttan sil..." #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Diskten sil..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "Akıllı çalma listesini sil" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "Orjinal dosyaları sil" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Dosyalar siliniyor" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Konum" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Ayrıntılar..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Aygıt" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Aygıt özellikleri" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Aygıt adı" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Aygıt özellikleri..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Aygıtlar" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Demek istediğiniz" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "Dijital olarak alındı" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Disk" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Tekrar etme" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "Karıştırma" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "Durdurma" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Açmak için çift tıklayın" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "" #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "" #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "" #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "" #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "" #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "" #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "" #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "" #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "Dosya adını giriniz" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Hata" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "" #: library/library.cpp:63 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "Hızlı" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "Favori parçalar" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "Dosya uzantısı" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "Dosya formatları" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Dosya adı" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "Dosya adı (konum olmadan)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Dosya boyutu" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Dosya türü" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Dosya adı" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Dosyalar" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "" #: core/song.cpp:328 msgid "Flac" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "Donmuş" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Genel ayarlar" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Tür" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "Bir ad verin:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "Sonraki çalma listesi sekmesine git" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "Önceki çalma listesi sekmesine git" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "HTTP prozy" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "Mutlu" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "Donanım bilgisi" #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "Yüksek" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "Yüksek (%1 fps)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "Yüksek (1024x1024)" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "Saat" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "Magnatune hesabım yok" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Simge" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "Parça tanımlanıyor" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:43 msgid "Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)" msgstr "" #: ui/albumcoverchoicecontroller.cpp:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "%1 gün içinde" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "%1 hafta içinde" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "Gelen kutusu" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "Tüm parçaları içer" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "Sesi 4% arttır" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Sesi arttır" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "Listeliyor %1" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "Bilgi" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Yüklendi" #: core/database.cpp:673 msgid "Integrity check" msgstr "Bütünlük kontrolü" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "İnternet" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "Geçersiz API anahtarı" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Geçersiz format" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "Geçersiz yöntem" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "Jamendo veritabanı" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "Çalan parçaya atla" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "Orjinal dosyaları sakla" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "Kedicikler" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Dil" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "Dizüstü/Kulaklık" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "Büyük albüm kapağı" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "Son çalan" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "Last.fm İsteğe bağlı radyo: %1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Last.fm Kütüphanesi - %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "Last.fm Karışık Radyo - %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Last.fm Komşu radyo - %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Last.fm Radyo istasyonu - %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Last.fm Radyoyu etiketle: %1" #: internet/lastfmservice.cpp:437 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm şu an meşgul, lütfen sonra deneyin" #: ../bin/src/ui_lastfmsettingspage.h:154 msgid "Last.fm password" msgstr "Last.fm şifresi" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "Last.fm çalma sayacı" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Last.fm etiketleri" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Last.fm kullanıcı adı" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Last.fm viki" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Süre" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Kütüphane" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "Kütüphane taraması" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Sınırlar" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "" #: ui/equalizer.cpp:123 msgid "Live" msgstr "Canlı" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Yükle" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "Kapağı URL'den yükle" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "Kapağı URL'den yükle..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "Kapağı diskten yükle" #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "Çalma listesi yükle" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "Çalma listesi yükle..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Last.fm radio yükleniyor" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "MTP aygıtı yükleniyor" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "iPod veritabanı yükleniyor" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "Akıllı çalma listesi yükleniyor" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "Parçalar yükleniyor" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "Akış yükleniyor" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "Parçalar yükleniyor" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "Parça bilgileri yükleniyor" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "Yükleniyor..." #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Giriş" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Düşük (%1 fps)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "Düşük (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "Sözler" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "%1 sözleri" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr " MP3 96k" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Magnatune indir" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Magnatune indirme tamamlandı" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "Çalma listesinin çevrimdışı kullanılabilir yap" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "Elle vekil sunucu ayarı" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "Üretici" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "Tüm arama terimleri eşleştir (AND)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "Bir ya da birkaç arama terimini eşleştir (OR)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "Maksimum bit hızı" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "Orta (%1 fps)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "Üyelik türü" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "Minimum bit hızı" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "" #: library/library.cpp:74 msgid "Most played" msgstr "" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "Müzik" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "Müziğim" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "" #: library/library.cpp:67 msgid "Never played" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "Yeni dosya" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "" #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:80 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "" #: core/utilities.cpp:147 msgid "Next week" msgstr "Gelecek hafta" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "Arkaplan resmi yok" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:366 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "Normal" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "" #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "" #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "Google Drive'da aç" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "" #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "" #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "" #: core/organise.cpp:65 msgid "Organising files" msgstr "" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:124 msgid "Party" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "" #: widgets/osd.cpp:156 msgid "Paused" msgstr "" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "" #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "" #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "Çalma listeleri" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "Lütfen tarayıcınızı seçin ve Clementine dönün" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "" #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "Tercih edilen bit hızı" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "Radyolar" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "Yenile" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "Müziğim'den sil" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "Müziğim'den parçaları siliyor" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" 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:206 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "Clementine dön" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "" #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "Arama sonuçları" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "Arkaplan rengini seç" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "Arkaplan resmi seçin" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "" #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:460 msgid "Show all songs" msgstr "" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "" #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "" #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "Arama tavsiyelerini göster" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "Albümleri karıştır" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "Albümdeki parçaları karıştır" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 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 "" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "Kaynak" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "" #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "İstasyonlar" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "" #: core/song.cpp:341 msgid "Stream" msgstr "" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "Başarılı!" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "Sistem renkleri" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "" #: ui/about.cpp:70 msgid "Thanks to" msgstr "" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "" #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:56 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:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:174 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:151 msgid "Third level" msgstr "" #: internet/jamendoservice.cpp:171 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "Yarın" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "" #: core/song.cpp:338 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "" #: devices/giolister.cpp:161 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "Web sitesi" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "" #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "" #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "" #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "" #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "" #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "" #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "Parçaları karıştır" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "Parçaları sırala" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "" clementine-1.2.0+dfsg/src/translations/uk.po000066400000000000000000005552451223327513400210650ustar00rootroot00000000000000# 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-2013 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:09+0000\n" "Last-Translator: Yuri Chornoivan \n" "Language-Team: Ukrainian (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr " днів" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " кб/с" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " мс" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " тчк" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " секунд" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " композицій" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 альбом(ів)" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 д." #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 день тому" #: podcasts/gpoddersync.cpp:79 #, 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:413 #, qt-format msgid "%1 selected of" msgstr "обрано %1 з" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 композиція" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 пісень" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "Знайдено %1 пісень" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "Знайдено %1 пісень (показано %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 доріжок" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 передано" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Модуль Wiimotedev" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n з помилкою" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n завершено" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "&Нетипово" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "Додатково" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "&Довідка" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "Приховати %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "Приховати…" #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Ліворуч" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "Музика" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Немає" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "Список відтворення" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "Ви&йти" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "Режим повтору" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Праворуч" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "Режим перемішування" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "Розтягнути стовпчики відповідно вмісту вікна" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "&Інструменти" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(відрізняється поміж багатьма піснями)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "…та всім розробникам Amarok" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "0 т." #: core/utilities.cpp:108 msgid "1 day" msgstr "1 день" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 доріжка" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "127.0.0.1" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "40%" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 випадкових доріжок" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "Оновитися до Premium зараз" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "Створити обліковий запис або відновити ваш пароль" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "Потрібен обліковий запис Grooveshark Anywhere." #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "Потрібен обліковий запис Spotify Premium." #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "Клієнтське з’єднання стане можливим лише після введення належного коду." #: smartplaylists/wizard.cpp:78 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:153 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "Пісню буде включено до списку відтворення якщо вона відповідає наступним умовам." #: smartplaylists/searchterm.cpp:297 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "AAC, 128 кб" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC, 32 кб" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC, 64 кб" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "ВСЯ СЛАВА ГІПНОЖАБІ" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "Перервати" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "Про %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "Про Clementine…" #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "Про Qt…" #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Параметри облікового запису" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "Параметри облікового запису (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Дія" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Активувати/деактивувати Wiiremote" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "Додати подкаст" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Додати потік" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "Додати новий рядок, якщо підтримується типом сповіщення" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "Додати дію" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Додати інший потік…" #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Додати теку…" #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "Додати файл" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "Додати файл для перекодування" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "Додати файли для перекодування" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Додати файл…" #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Додати файли для перекодування" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Додати теку" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Додати теку…" #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Додати нову теку…" #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "Додати подкаст" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "Додати подкаст..." #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Додати критерій пошуку" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "Додати мітку альбому пісні" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "Додати мітку виконавця альбому" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "Додати мітку виконавця пісні" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "Додати автоматично визначену оцінку композиції" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "Додати мітку композитора пізні" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "Додати мітку диску пісні" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "Додати ім’я файлу композиції" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "Додати мітку жанру пісні" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "Додати мітку групування композицій" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "Додати мітку тривалості пісні" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "Додати мітку виконавця композиції" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "Додати мітку кількості відтворень" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "Додати оцінку композиції" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "Додати мітку кількості пропусків" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "Додати мітку назви пісні" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "Додати мітку номеру доріжки" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "Додати мітку року пісні" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Додати потік…" #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "Додати до улюблених на Grooveshark" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "Додати до списків відтворення Grooveshark" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "Додати до іншого списку відтворення" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Додати до списку відтворення" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "Додати до черги" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Додати дію wiimotedev" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Додати…" #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Додано у цьому місяці" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Додано цього тижня" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Додано цього року" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Додано сьогодні" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Додано за три місяці" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "Додавання композицій до теки Моя музика" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "Додавання пісні до улюблених" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Розширене групування…" #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "Після " #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "Після копіювання…" #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Альбом" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Альбом (ідеальна гучність для всіх композицій)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Виконавець альбому" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "Обкладинка альбому" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Дані про альбом на jamendo.com…" #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Альбоми з обкладинками" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Альбоми без обкладинок" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Всі файли (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "Вся слава Гіпножабі!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Всі альбоми" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Всі виконавці" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "Всі файли (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Всі списки відтворення (%1)" #: ui/about.cpp:74 msgid "All the translators" msgstr "Всім перекладачам" #: library/library.cpp:84 msgid "All tracks" msgstr "Всі доріжки" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "Дозволити клієнту отримувати музику з цього комп’ютера." #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "Дозволити отримання" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "Дозволити mid/side кодування" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "Разом з оригіналами" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Завжди приховувати головне вікно" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Завжди показувати головне вікно" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "Завжди починати відтворення" #: internet/spotifyblobdownloader.cpp:60 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:61 msgid "An error occurred loading the iTunes database" msgstr "Виникла помилка завантаження бази даних iTunes" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Трапилася помилка під час запису метаданих до '%1'" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "Сталася неочікувана помилка." #: ui/about.cpp:78 msgid "And:" msgstr "Та:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "Злість" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Вигляд" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Додати файли/адреси до списку відтворення" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "Додати до списку відтворення" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "Додати до списку відтворення" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "Застосувати стиснення для запобігання зрізанню" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "Ви дійсно хочете вилучити задане \"%1\"?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "Ви справді хочете вилучити цей список відтворення?" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "Впевнені, що бажаєте скинути статистику цієї композиції?" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Виконавець" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Про виконавця" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "Радіо виконавця" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "Мітки виконавця" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "Ініціали виконавця" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Аудіо-формат" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Помилка автентификації" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "Автор" #: ui/about.cpp:65 msgid "Authors" msgstr "Автори" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Автоматично" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Автоматичне оновлення" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "Автоматично відкривати одиночні категорії в дереві фонотеки" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "Доступне" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "Середня бітова швидкість" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "Середній розмір малюнку" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "Подкасти BBC" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "Бітів за хвилину" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "Фонові Потоки" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Колір фону" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "Зображення тла" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Прозорість фону" #: core/database.cpp:734 msgid "Backing up database" msgstr "Створення резервної копії бази даних" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "Баланс" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Додати до заборонених" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "Смужка аналізатора" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Стандартний синій" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "Основний тип звуку" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Поведінка" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "Найкраще" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "Біографія з %1" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Бітова швидкість" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "Бітова швидкість" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "Блок аналізатора" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "Тип блоку" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "Рівень розмивання" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "Текст" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "Плаваючий аналізатор" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Огляд…" #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "Місткість буфера" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "Буферизація" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "Ці джерела вимкнено:" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Кнопки" #: core/song.cpp:339 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "Підтримка листів CUE" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "Скасувати" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Змінити обкладинку" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Змінити розмір шрифту…" #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "Змінити режим повторення" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Змінити комбінацію клавіш…" #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "Змінити режим перемішування" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Змінити мову" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "Зміни, внесені до параметрів монофонічного відтворення, набудуть чинності лише для наступних композицій" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "Перевіряти наявність нових випусків" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Перевірити оновлення…" #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "Оберіть ім’я для вашого розумного списку відтворення" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Вибрати автоматично" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Вибрати колір…" #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "Вибрати шрифт…" #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Вибрати зі списку" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Вибрати спосіб сортування списку та кількість композицій в ньому." #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "Обрати теку для завантаження подкастів" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "Оберіть веб-сайти, які Clementine має використати для пошуку текстів пісень." #: ui/equalizer.cpp:115 msgid "Classical" msgstr "Класична" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "Вичищаю" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Очистити" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Очистити список відтворення" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Помилка Clementine" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Помаранчевий Clementine" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Візуалізація Clementine" #: ../bin/src/ui_deviceproperties.h:376 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine може автоматично конвертувати скопійовану до цього пристрою музику в потрібний формат." #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine може відтворювати файли звукових даних, вивантажені на Box" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine може відтворювати музичні дані, які ви вивантажили на Dropbox" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine може відтворювати музику, вивантажену вами на Google Drive" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "Clementine може відтворювати музичні дані, які вивантажили на Ubuntu One" #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "Clementine може показувати повідомлення під час зміни доріжки." #: ../bin/src/ui_podcastsettingspage.h:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine може синхронізувати список ваших підписок з іншими комп’ютерами та додатками для подкастів. Створити рахунок." #: visualisations/projectmvisualisation.cpp:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine не вдалось завантажити візуалізації projectM. Перевірте чи ви правильно встановили Clementine." #: internet/lastfmsettingspage.cpp:110 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 "Clementine не вдається отримати стан вашої передплати через проблеми зі зв'язком. Відтворювані доріжки буде кешовано і надіслано до Last.fm пізніше." #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Переглядач зображень Clementine" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "Clementine не зміг здобути результатів для цього файлу" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "Clementine шукатиме музику у:" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Клацніть тут, щоб додати музику" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "Клацніть аби перемкнутися між часом, що залишився, та загальним" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "Закрити список відтворення" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "Закрити візуалізацію" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "Закриття цього вікна скасує завантаження." #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "Закриття цього вікна зупинить пошук обкладинок альбомів." #: ui/equalizer.cpp:116 msgid "Club" msgstr "Клубна" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Colors" msgstr "Кольори" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "Список, розділений комами, виду клас:рівень, рівень може бути від 0 до 3" #: playlist/playlist.cpp:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Коментар" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "Заповнити мітки автоматично" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "Заповнити мітки автоматично…" #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Композитор" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "Налаштувати %1…" #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "Налаштувати Grooveshark…" #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Налаштування Last.fm…" #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "Налаштувати Magnatune…" #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Налаштування комбінацій клавіш" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "Налаштування Spotify…" #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "Налаштувати Subsonic…" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "Налаштувати загальні правила пошуку…" #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "Налаштувати фонотеку" #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "Налаштувати подкасти..." #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "Налаштувати…" #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "Під’єднати Wii Remotes через дію активувати/деактивувати" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "З’єднати пристрій" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "З'єднання зі Spotify" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "Сервер відмовив у з’єднанні. Переконайтеся, що адресу сервера вказано правильно. Приклад: http://localhost:4040/" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "Вичерпано строк очікування на з’єднання. Переконайтеся, що адресу сервера вказано правильно. Приклад: http://localhost:4040/" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "Консоль" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "Стала бітова швидкість" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "Конвертувати всю музику" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "Конвертувати всю музику, яку не може відтворити пристрій" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "Копіювати до буфера" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Копіювати до пристрою…" #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Скопіювати до фонотеки…" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "Копірайт" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "Не вдалося встановити з’єднання з Subsonic, перевірте адресу сервера. Приклад: http://localhost:4040/" #: transcoder/transcoder.cpp:64 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "Не вдалось створити елемент GStreamer \"%1\" - переконайтесь, що всі потрібні для GStreamer модулі встановлені" #: transcoder/transcoder.cpp:432 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "Не вдалось знайти ущільнювач для %1, перевірте чи правильно встановлений модуль GStreamer" #: transcoder/transcoder.cpp:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "Не вдалось знайти кодер для %1, перевірте чи правильно встановлений модуль GStreamer" #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "Не вдалось завантажити радіостанцію last.fm" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "Не вдалось відкрити вихідний файл %1" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Менеджер обкладинок" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "Обкладинка з вбудованого малюнка" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Обкладинку завантажено з %1" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "Обкладинку прибрано вручну" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "Обкладинку не встановлено" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "Обкладинку встановлено з %1" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "Обкладинки з %1" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "Створити список відтворення Grooveshark" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "Перехресне згасання під час автоматичної зміни доріжок" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "Перехресне згасання під час ручної зміни доріжок" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Вниз" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Вгору" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "Інша" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "Нетипове зображення:" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "Власні налаштування повідомлень" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "Інша радіостанція" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Нетиповий…" #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "Шлях DBus" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Танцювальна" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Дата створення" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Дата зміни" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "Днів" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "Ти&пово" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "Зменшити гучність на 4%" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "Зменшити гучність на відсотків" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Зменшити гучність" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "Типове зображення тла" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "Типові значення" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "Затримка між візуалізаціями" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "Вилучити" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "Вилучити список відтворення Grooveshark" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "Видалити завантажені дані" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Вилучити файли" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Вилучити з пристрою…" #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Вилучити з диска…" #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "Видалити відтворені випуски" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "Скинути налаштування" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "Видалити розумний список відтворення" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "Вилучити оригінальні файли" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Вилучення файлів" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "Вилучити з черги вибрані доріжки" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "Вилучити з черги доріжки" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Призначення" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Детальніше…" #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Пристрій" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Налаштування пристрою" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Назва пристрою" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Налаштування пристрою…" #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Пристрої" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Може ви мали на увазі" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "Пароль Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "Ім’я користувача Digitally Imported" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "Пряме з'єднання з Інтернет" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Тека" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "Вимкнути тривалість" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "Вимкнути створення смужок настрою" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Вимкнено" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Диск" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "Переривчаста передача" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "Налаштування відображення" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "Показувати екранні повідомлення" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "Повторити повне сканування фонотеки" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "Не конвертувати ніяку музику" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "Не перезаписувати" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Не повторювати" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "Не показувати в «різних виконавцях»" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "Не перемішувати" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "Не зупиняти!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "Підтримати фінансово" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Подвійне клацання, щоб відкрити" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "Подвійне клацання на пісні:" #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "Завантажити %n випусків" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "Тека завантаження" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "Завантажити епізоди до" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "Завантажити членство" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "Завантажувати нові епізоди автоматично" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "Завантаження поставлено в чергу" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "Отримати програму для Android" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Завантажити цей альбом" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Завантажити цей альбом…" #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "Завантажити цей випуск" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "Звантажити…" #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "Завантажую (%1%)..." #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "Завантажую каталог Icecast" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "Завантажую каталог Jamendo" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "Завантаження каталогу Magnatune" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "Завантаження модуля Spotify" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "Завантажую метадані" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "Перетягніть, щоб змінити розташування" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "Dropbox" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "Динамічний режим увімкнено" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "Динамічний випадковий мікс" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "Редагувати розумний список відтворення…" #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Редагувати мітку \"%1\"" #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "Редагувати мітку…" #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "Редагувати мітки" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Редагувати дані доріжки" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "Редагувати дані про доріжку…" #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Редагувати дані про доріжки…" #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Змінити…" #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "Увімкнути підтримку Wii Remote" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "Увімкнути еквалайзер" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "Використовувати глобальні скорочення лише коли Clementine у фокусі" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "Включити наведені нижче адреси до джерел пошуку. Результати буде показано відповідно до вказаного вами порядку." #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "Увімкнути/вимкнути скроблінг в Last.fm" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "Складність кодування" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "Якість кодування" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "Режим кодування" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "Введіть посилання" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "Введіть посилання для завантаження обкладинки з нетрів:" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "Вкажіть назву файла для експортованих обкладинок (без суфікса назви):" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "Введіть нову назву для цього списку відтворення" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Вкажіть виконавця або мітку, щоб слухати радіо Last.fm." #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "Вище ви можете вказати ключові слова пошуку музичних творів на вашому комп’ютері та у інтернеті" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "Введіть критерії пошуку для пошуку подкастів у iTunes Store" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "Введіть критерії пошуку для пошуку подкастів на gpodder.net" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "Введіть сюди критерії пошуку" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "Введіть адресу радіо-потоку:" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "Вкажіть назву теки" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "Вкажіть цю IP-адресу у програмі для встановлення з’єднання з Clementine." #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "Вся фонотека" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Помилка" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Помилка з’єднання з пристроєм MTP" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "Помилка копіювання композицій" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "Помилка вилучення композицій" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "Помилка завантаження модуля Spotify" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "Помилка завантаження %1" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Помилка завантаження списку відтворення di.fm" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "Помилка обробляння %1: %2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "Помилка завантаження аудіо CD" #: library/library.cpp:63 msgid "Ever played" msgstr "Будь-коли відтворений" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "Кожні 10 хвилин" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "Кожні 12 годин" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "Кожні 2 години" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "Кожні 20 хвилин" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "Кожні 30 хвилин" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "Кожні 6 годин" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "Кожну годину" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "Крім як між треками на одному альбомі, або в тому ж CUE листі" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "Наявні обкладинки" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "Розгорнути" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "Діє до %1" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "Експортування обкладинок" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "Експортувати обкладинки" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "Експортувати отримані обкладинки" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "Експортувати вбудовані обкладинки" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "Експортування завершено" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "Експортовано %1 обкладинок з %2 (%3 пропущено)" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "Зтишувати під час призупинення і робити голоснішим під час відновлення" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "Згасання під час зупинки відтворення" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "Згасання" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "Тривалість згасання" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "Не вдалося отримати каталог" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "Не вдалося отримати подкасти" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "Не вдалося завантажити подкаст" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "Не вдалося розібрати XML для цієї RSS стрічки" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "Швидко" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "Улюблені" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "Улюблені композиції" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "Отримати обкладинки, котрих бракує" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "Отримувати автоматично" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "Отримання завершено" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "Отримуємо бібліотеку Subsonic" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Не вдалося отримати обкладинку" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "Розширення файлу" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "Формати файлів" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Назва файлу" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "Назва файлу (без шляху)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Розмір файлу" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Тип файлу" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Назва файлу" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Файли" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "Файли для перекодування" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "Знайти композиції у фонотеці, що відповідають вказаним вами критеріям." #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "Роблю відбиток пісні" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "Готово" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "Перший рівень" #: core/song.cpp:328 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Розмір шрифту" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "З підстав ліцензування, для підтримки Spotify потрібен спеціальний модуль." #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "Примусове моно-кодування" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "Забути пристрій" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Форма" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "Формат" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Частота кадрів" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "Кадрів на буфер" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Друзі" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "Холодність" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Повні баси" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "Повні баси + верхи" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "Повні верхи" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "Аудіо-рушій GStreamer" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "Загальне" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Загальні налаштування" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Жанр" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "Отримати адресу цього списку Grooveshark для оприлюднення" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "Отримати адресу цієї композиції Grooveshark для оприлюднення" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "Отримання популярних пісень з Grooveshark" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "Отримання каналів" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "Отримання потоків" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "Дати назву:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "Вперед" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "До наступної вкладки списку відтворення" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "До попередньої вкладки списку відтворення" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "Отримано %1 обкладинок з %2 (%3 не вдалось)" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "Позначати сірим пісні у списках відтворення, що не існують" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "Помилка під час спроби увійти до Grooveshark" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "Адреса списку відтворення Grooveshark" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "Радіо Grooveshark" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "Адреса пісні у Grooveshark" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "Групувати фонотеку за…" #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "Групувати за" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "Групувати за альбомом" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "Групувати за виконавцем" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "Групувати за виконавецем/альбомом" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "Групувати зак виконавцем/роком - альбомом" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "Групувати за жанром/альбомом" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "Групувати за жанром/Виконавцем/альбомом" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "Групування" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "HTML сторінка не містить жодних RSS стрічок" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "Отримано код стану HTTP 3xx без адреси. Перевірте налаштування сервера." #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "HTTP проксі" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "Щастя" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "Відомості про обладнання" #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "Відомості про обладнання доступні лише після під’єднання пристрою." #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "Високий" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "Висока (%1 к/с)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "Висока (1024x1024)" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "Вузол не знайдено. Переконайтеся, що адресу сервера вказано правильно. Приклад: http://localhost:4040/" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "Годин" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "Гіпножаба" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "У мене немає облікового запису на Magnatune" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Значок" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "Значки зверху" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "Визначаю пісню" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "Якщо продовжите, цей пристрій буде працювати повільно і скопійовані на нього композиції можуть не відтворюватись." #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "Якщо ви знаєте URL подкасту, введіть його та натисніть Вперед." #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "Ігнорувати «The» в іменах виконавців" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Зображення (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "За %1 днів" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "За %1 тижнів" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "У динамічному режимі нові доріжку буде обрано та додано до списку відтворення кожного разу як завершується пісня." #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "Вхідні" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "Показувати обкладинку в повідомлені" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "Включити всі композиції" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Несумісна версія протоколу REST Subsonic. Слід оновити клієнтську частину." #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Несумісна версія протоколу REST Subsonic. Слід оновити серверну частину." #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "Налаштовування не завершено! Переконайтеся, що заповнено всі поля." #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "Збільшити гучність на 4%" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "Збільшити гучність на відсотків" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Збільшити гучність" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "Індексуємо %1" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "Інформація" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "Вставити…" #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Встановлено" #: core/database.cpp:673 msgid "Integrity check" msgstr "Перевірка цілісності даних" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Інтернет" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "Інтернет-джерела" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "Неправильний ключ API" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Не чинний формат" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "Неправильний метод" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "Неправильні параметри" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "Неправильно вказане джерело" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "Нечинна служба" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "Неправильний ключ сеансу" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "Некоректне ім’я користувача і/або пароль" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "Композиції Jamendo, що прослуховувалися найбільше" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "Найпопулярніші композиції Jamendo" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "Найпопулярніші композиції місяця в Jamendo" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "Найпопулярніші композиції тижня в Jamendo" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "База даних Jamendo" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "Перейти до відтворюваної доріжки" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Тримати кнопки %1 секунду…" #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Тримати кнопки %1 секунд…" #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "Продовжувати виконання у фоні коли вікно зачинено" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "Зберегти оригінальні файли" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "Кошенята" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Мова" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "портативний комп’ютер/навушники" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Велика зала" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "Велика обкладинка альбому" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "Велика бічна панель" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "Востаннє відтворено" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "Last.fm Custom Radio: %1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Збірка Last.fm - %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "Last.fm Mix Radio - %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Радіо сусідів Last.fm - %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Радіостанція Last.fm - %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Подібні виконавці Last.fm на %1" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Радіо мітки Last.fm: %1" #: internet/lastfmservice.cpp:437 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "На цей час Last.fm зайнятий, спробуйте через кілька хвилин" #: ../bin/src/ui_lastfmsettingspage.h:154 msgid "Last.fm password" msgstr "Пароль Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "Статистика Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Мітки Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Користувач Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Вікі Last.fm" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "Найменш улюблені композиції" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "Типово, залишити порожнім. Наприклад: \"/dev/dsp\", \"front\" тощо." #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "Ліворуч" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Тривалість" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Фонотека" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "Розширене групування фонотеки" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "Повідомлення про повторне сканування фонотеки" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "Пошук у фонотеці" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Обмеження" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "Слухати пісні з Grooveshark на основі того, що ви слухали раніше" #: ui/equalizer.cpp:123 msgid "Live" msgstr "Наживо" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Завантажити" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "Завантажити обкладинку з нетрів" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "Завантажити обкладинку з нетрів…" #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "Завантажити обкладинку з диска" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "Завантажити обкладинку з диска" #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "Завантажити список відтворення" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "Завантажити список відтворення…" #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Завантаження радіо Last.fm" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Завантаження пристрою MTP" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "Завантаження бази даних iPod" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "Завантаження «розумного» списку відтворення" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "Завантаження пісень" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "Завантаження потоку" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "Завантаження доріжок" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "Завантажую дані доріжок" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "Завантаження…" #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "Завантажити файли/адреси, замінюючи поточний список відтворення" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Увійти" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "Не вдалося увійти" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "Профіль довготривалого передбачення (LTP)" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "Додати до улюблених" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Низька (%1 к/с)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "Низька (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "Профіль низької складності (LC)" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "Тексти пісень" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "Текст пісні з %1" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP3, 256 кб" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3, 96 кб" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Завантаження з Magnatune" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Завантаження з Magnatune завершено" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "Основний профіль (MAIN)" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "Гаразд!" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "Зробити список відтворення доступним онлайн" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "Спотворений відгук" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "Ручне налаштування проксі" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "Вручну" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "Виробник" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "Позначити як прослуханий" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "Позначити як новий" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "Враховувати кожний пошуковий термін (AND)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "Враховувати один чи більше пошукових термінів (OR)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "Найбільша бітова швидкість" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "Середня (%1 к/с)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "Середня (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "Тип членства" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "Найменша бітова швидкість" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "Відсутні типові налаштування projectM" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "Модель" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "Стежити за змінами у фонотеці" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "Відтворення у режимі моно" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "Місяців" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "Настрій" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "Стиль смужки настрою" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "Смужки настрою" #: library/library.cpp:74 msgid "Most played" msgstr "Найчастіше відтворювані" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "Точка монтування" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "Точки монтування" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "Перемістити вниз" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "Перемістити до фонотеки…" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "Перемістити вгору" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "Музика" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Фонотека" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "Вимкнути звук" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "Моя бібліотека на Last.fm" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "Моє Mix Radio на Last.fm" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "Мої сусіди на Last.fm" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "Моє Recommended Radio на Last.fm" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "Моє Mix Radio" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "Моя музика" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "Моє сусідство" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "Моя радіостанція" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "Мої рекомендації" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Назва" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "Налаштування найменування" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "Вузька смуга (NB)" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "Сусіди" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "Мережа" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "Проксі мережі" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "Дистанційне керування з мережі" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "Ніколи" #: library/library.cpp:67 msgid "Never played" msgstr "Ніколи не відтворені" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "Ніколи не починати відтворення" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "Нова тека" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "Новий список відтворення" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "Новий «розумний» список відтворення" #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "Нові композиції" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "Нові композиції буде додано автоматично" #: library/library.cpp:80 msgid "Newest tracks" msgstr "Найновіші доріжки" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "Наступна" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Наступна доріжка" #: core/utilities.cpp:147 msgid "Next week" msgstr "Наступного тижня" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "Без аналізатора" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "Без зображення тла" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "Немає зображень обкладинок для експортування." #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "Без довгих блоків" #: playlist/playlistcontainer.cpp:366 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "Нічого не знайдено. Очистіть вікно пошуку, щоб знову показати весь список відтворення." #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "Без коротких блоків" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "Немає" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "Жодна з вибраних композицій не придатна для копіювання на пристрій" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "Звичайний" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "Нормальний тип блоку" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "Недоступно при використанні динамічних списків відтворення" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "Не з’єднано" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "Не достатньо вмісту" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "Недостатньо фанів" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "Не достатньо учасників" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "Недостатньо сусідів" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Не встановлено" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "Вхід не здійснено" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "Не змонтовано — двічі клацніть, щоб змонтувати" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "Тип повідомлення" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Сповіщення" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Зараз відтворюється" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "Повідомлення OSD" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "Opus Ogg" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "Непрозорість" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "Відкрити %1 у переглядачі" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "Відкрити &аудіо CD…" #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "Відкрити файл OPML" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "Відкрити файл OPML…" #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "Відкрити пристрій" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "Відкрити файл…" #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "Відкрити у Google Drive" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "Відкрити у новому списку відтворення" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Відкрити…" #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "Помилка виконання операції" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "Оптимізувати для бітової швидкості" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "Оптимізувати для якості" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "Налаштування…" #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "Упорядкування файлів" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "Упорядкування файлів…" #: core/organise.cpp:65 msgid "Organising files" msgstr "Упорядкування файлів" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "Початкові мітки" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Інші налаштування" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "Результат" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "Пристрій відтворення" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "Налаштування виведення" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "Додаток відтворення" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "Перезаписати все" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "Перезаписати існуючі файли" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "Перезаписати лише менші" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "Власник" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "Опрацьовую каталог Jamendo" #: ui/equalizer.cpp:124 msgid "Party" msgstr "Вечірка" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "Пароль" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Призупинити" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "Призупинити відтворення" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Призупинено" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "Виконавець" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "Піксель" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "Звичайна бічна панель" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Відтворити" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "Відтворити «Виконавця» або «Мітку»" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "Відтворити радіо виконавця…" #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "Кількість відтворень" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "Слухати іншу радіостанцію…" #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "Відтворити, якщо зупинено; призупинити, якщо відтворюється" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "Відтворювати, якщо зараз нічого не відтворюється" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "Відтворювати радіо за міткою…" #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "Відтворити доріжку в списку відтворення" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "Відтворити/Призупинити" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Відтворення" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Налаштування програвача" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "Список відтворення" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "Список відтворення завершився" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "Налаштування списку відтворення" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "Тип списку відтворення" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "Списки відтворення" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "Будь ласка, закрийте вікно програми для перегляду інтернету і поверніться до роботи з Clementine." #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "Статус модуля:" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "Подкасти" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Поп" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "Популярні пісні" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "Популярні пісні за місяць" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "Популярні пісні за день" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "Тривалість виринаючого повідомлення" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "Порт" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "Підсилення" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "Параметри" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "Параметри…" #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "Бажані імена файлів для обкладинок, розділені комами" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "Бажаний аудіо формат" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "Бажана бітова швидкість" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "Бажаний формат" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "Тип звуку вищого класу" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "Шаблон:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "Натисніть комбінацію кнопок для" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "Натисніть клавішу" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Натисніть комбінацію клавіш для %1…" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "Налаштування OSD" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "Перегляд" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "Попередня" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "Попередня доріжка" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "Відобразити дані про версію" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "Профіль" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "Поступ" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 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:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "Якість" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "Опитування пристрою…" #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "Керування чергою" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "Поставити в чергу вибрані доріжки" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "Поставити в чергу доріжки" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "Радіо (однакова гучність всіх композицій)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "Радіо" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "Дощ" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "Випадкова візуалізація" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "Поставити поточній композиції нуль зірочок" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "Поставити поточній композиції одну зірочку" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "Поставити поточній композиції дві зірочки" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "Поставити поточній композиції три зірочки" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "Поставити поточній композиції чотири зірочки" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "Поставити поточній композиції п’ять зірочок" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "Оцінка" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "Дійсно скасувати?" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "Досягнено максимальної кількості переспрямовувань, перевірте налаштування сервера." #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "Оновити" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "Оновити каталог" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "Оновити канали" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "Оновити список друзів" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "Оновити список станцій" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "Оновити потоки" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Реґґі" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "Пам’ятати рухи в Wii remote" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "Пам'ятати з минулого разу" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Вилучити" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "Вилучити дію" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "Вилучити повтори зі списку відтворення" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "Вилучити теку" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "Вилучити з теки Моя музика" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "Вилучити з улюблених" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "Вилучити зі списку відтворення" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "Вилучення списку відтворення" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "Вилучення списків відтворення" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "Вилучення з теки Моя музика" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "Вилучення композицій зі списку улюблених" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "Перейменувати список відтворення \"%1\"" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "Перейменувати список відтворення Grooveshark" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "Перейменувати список відтворення" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "Перейменувати список відтворення…" #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "Пронумерувати доріжки в такому порядку…" #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Повторювати" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "Повторювати альбом" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "Повторювати список відтворення" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "Повторювати композицію" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Замінити список відтворення" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "Замінити список відтворення" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "Замінити пробіли підкресленнями" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "Replay Gain" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "Режим вирівнювання гучності" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "Знов наповнити" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "Потрібен код розпізнавання" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "Скинути" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" 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:206 msgid "Restrict to ASCII characters" msgstr "Обмежитись символами ASCII" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "Відновлювати відтворення після запуску" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "Отримання даних щодо композицій теки Моя музика з Grooveshark" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "Отримання улюблених пісень з Grooveshark" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "Отримання списків відтворення з Grooveshark" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "Повернутися до Clementine" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "Праворуч" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Рок" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "Виконати" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "SOCKS проксі" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "Помилка під час спроби встановлення з’єднання SSL. Перевірте налаштування сервера. За допомогою наведеного нижче пункту використання SSLv3 можна уникнути деяких проблем." #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "Безпечно вилучити пристрій" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "Безпечне вилучення пристрою після копіювання" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "Частота вибірки" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "Частота вибірки" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "Зберегти файли .mood до вашої музичної бібліотеки" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "Зберегти обкладинку" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "Зберегти обкладинку на диск…" #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "Зберегти зображення" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "Зберегти список відтворення" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "Зберегти список відтворення…" #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "Зберегти налаштування" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "Зберігати дані щодо оцінки у мітках файлів, якщо можна" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "Зберігати статистичні дані у мітках файлів, якщо можна" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "Зберегти цей потік на вкладці «Інтернет»" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "Зберігаємо статистичні дані щодо композицій до файлів композицій" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "Зберігаю доріжки" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "Профіль масштабованої частоти вибірки (SSR)" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "Масштабований розмір" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "Рахунок" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "Скробблити доріжки, які я слухаю" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "Пошук" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "Шукати станції Icecast" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "Шукати на Jamendo" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Пошук на Magnatune" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "Шукати на Subsonic" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "Пошук обкладинок альбомів…" #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "Шукати всюди" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "Пошук по gpodder.net" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "Пошук по iTunes" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "Режим пошуку" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "Налаштування пошуку" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "Результати пошуку" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "Умови пошуку" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "Пошук на Grooveshark" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "Другий рівень" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "Перемотати назад" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "Перемотати вперед" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "Трохи перемотати поточну доріжку" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "Перемотати поточну доріжку на абсолютну позицію" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "Вибрати все" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "Скасувати вибір" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "Оберіть колір заднього плану:" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "Вибір зображення тла" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "Оберіть найкращий збіг" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "Оберіть колір переднього плану:" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "Вибрати візуалізації" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "Вибрати візуалізації…" #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "Серійний номер" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "Адреса сервера" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "Параметри сервера" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "Служба вимкнена" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Встановити %1 до \"%2\"…" #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "Встановити гучність до відсотків" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "Встановити значення для всіх вибраних доріжок…" #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "Параметри" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Комбінація клавіш" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "Комбінація клавіш для %1" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Комбінація клавіш для %1 вже є" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Показати" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "Показувати OSD" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "Показувати для поточної доріжки блимаючу анімацію" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "Показувати смужку настрою на панелі поступу композиції" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "Показувати системні повідомлення" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "Показувати сповіщення коли я змінюю режим повторення чи перемішування" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "Показувати повідомлення, коли я змінюю гучність" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "Показувати підказки в системному лотку" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "Показувати приємні повідомлення OSD" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "Показати вище, в рядку стану" #: ui/mainwindow.cpp:460 msgid "Show all songs" msgstr "Показати всі композиції" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "Показати всі композиції" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show cover art in library" msgstr "Показувати обкладинки у фонотеці" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "Показати розділювачі" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "Показати на повний розмір…" #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "Показати в оглядачі файлів…" #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "Показувати в різних виконавцях" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "Показувати смужку настрою" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "Показати тільки дублікати" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "Показати тільки без міток" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "Показувати пропозиції щодо пошуку" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "Показувати кнопки \"Додати до улюблених\" та \"Додати до заборонених\"" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "Показувати кнопку скроблінга в головному вікні" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "Показувати значок в лотку" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "Показати список увімкнених та вимкнених джерел" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "Показати/приховати" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Режим перемішування" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "Перемішати альбоми" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "Перемішати все" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "Перемішати список відтворення" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "Перемішати поточний альбом" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "Увійти" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "Вийти" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "Реєстрація…" #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "Подібні виконавці" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "Розмір" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "Розмір:" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ска" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "Перескочити назад в списку композицій" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "Кількість пропусків" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "Перескочити вперед у списку композицій" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "Маленька обкладинка альбому" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "Маленька бічна панель" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "«Розумний» список відтворення" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "«Розумні» списки відтворення" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Легка" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "Легкий рок" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "Про композицію" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "Про композицію" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "Сонограма" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "Вибачте" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "Сортувати за жанром (за абеткою)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "Сортувати за жанром (за популярністю)" #: ../bin/src/ui_icecastfilterwidget.h:77 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 "Сортування" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "Джерело" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "Джерела" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "Помилка входу до Spotify" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "Модуль Spotify" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "Модуль Spotify не встановлено" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "Типово" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "Оцінені" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "Запустити список відтворення, що відтворюється на цей час" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "Почати перекодування" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "Введіть щось у полі пошуку, розташованому вище, щоб побачити на цій панелі список результатів пошуку" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "Запуск %1" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "Запуск…" #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "Станції" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Зупинити" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "Зупинити після" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "Зупинити після цієї доріжки" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Зупинити відтворення" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "Зупинити відтворення після цієї доріжки" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "Зупинено" #: core/song.cpp:341 msgid "Stream" msgstr "Потік" #: internet/subsonicsettingspage.cpp:30 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:160 msgid "Streaming membership" msgstr "Потокове членство" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "Підписки на списки відтворення" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "Передплатники" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "Виконано!" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "Успішно записано %1" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "Пропоновані мітки" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "Зведення" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "Найвища (%1 к/с)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "Надвисока (2048x2048)" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "Підтримувані формати" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "Синхронізувати статистичні дані з файлами" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "Синхронізація вхідних Spotify" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "Синхронізація списку відтворення Spotify" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "Синхронізація оцінених доріжок Spotify" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "Кольори системи" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "Вкладки зверху" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Мітка" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "Упорядник міток" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "Радіо мітки" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "Цільова бітова швидкість" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Техно" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "Налаштування тексту" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Подяки" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "Команда \"%1\" не може бути виконана" #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "Обкладинка альбому, до якого увійшла композиція, яка зараз відтворюється" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "Тека %1 не чинна" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "Список відтворення '%1' порожній або не може бути завантажений." #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "Вказана вами адреса не є малюнком!" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "У цьому альбомі є інші композиції" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "Виникла проблема зв’язку з gpodder.net" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Не вдалося отримати метадані з Magnatune" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "Виникла проблема розбору відповіді iTunes Store" #: ui/organiseerrordialog.cpp:56 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:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "Ці файли будуть вилучені з пристрою. Ви впевнені? Вилучити їх?" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "Ці файли буде остаточно вилучено з диска. Ви справді цього хочете?" #: ../bin/src/ui_librarysettingspage.h:187 msgid "These folders will be scanned for music to make up your library" msgstr "В цих теках виконуватиметься пошук музики для створення фонотеки" #: ../bin/src/ui_transcodersettingspage.h:174 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:151 msgid "Third level" msgstr "Третій рівень" #: internet/jamendoservice.cpp:171 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/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "Цей альбом не доступний в запитуваному форматі" #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "Потрібно під’єднати та відкрити пристрій, щоб Clementine розпізнала, які формати файлів він підтримує." #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "Цей пристрій підтримує такі формати файлів:" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "Цей пристрій не працюватиме як слід" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "Значення цього параметра можна змінити на сторінці «Поведінка» налаштувань програми." #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "Цей потік лише для платних передплатників" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "Цей тип пристрою не підтримується: %1" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "Затримка" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Назва" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "Щоб започаткувати Grooveshark радіо, вам варто спочатку прослухати кілька пісень на Grooveshark." #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "Сьогодні" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "Змінити режим приємних OSD" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "Повноекранний режим" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "Перемикнути статус черги" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "Змінити режим скроблінгу" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "Змінити режим видимості приємних OSD" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "Завтра" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "Забагато перенапрямлень" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "Найкращі композиції" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "Загалом альбомів:" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "Всього передано байтів" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "Всього зроблено запитів до мережі" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Доріжка" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "Перекодування музики" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "Журнал перекодування" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "Перекодування" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "Перекодовано %1 файлів, використовуючи %2 гілки" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "Налаштування перекодування" #: core/song.cpp:338 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "Турбіна" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "Вимкнути" #: devices/giolister.cpp:161 msgid "URI" msgstr "Адреса" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "Адреса(и)" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "Пароль до Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "Ім’я користувача Ubuntu One" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "Надзвичайно широка смуга (UWB)" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Не вдалось завантажити %1 (%2)" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Невідомо" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "Невідомий content-type" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Невідома помилка" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "Вилучити обкладинку" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "Відписатися" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "Найближчі виступи" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "Оновити список відтворення на Grooveshark" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "Оновити всі подкасти" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "Оновити змінені теки у фонотеці" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "Оновлювати фонотеку під час запуску Clementine" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "Оновити цей подкаст" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "Оновлення" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "Оновлення %1" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "Оновлення %1%…" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "Оновлення фонотеки" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "Використання" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "Використовувати мітку виконавця альбому, якщо є" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "Використовувати комбінації клавіш Gnome" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "Використовувати метадані Replay Gain, якщо такі є" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "Використовувати SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "Використовувати Wii Remote" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "Використати власну палітру" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "Використати власне повідомлення для сповіщень" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "Використовувати віддалене керування мережею" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "Використовувати автентифікацію" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "Використати двигун контролю бітової швидкості" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "Використовувати динамічний режим" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "Використовувати повідомлення для звітів про стан Wii Remote" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "Використати тимчасове формування шуму" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "Використовувати системну" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "Використати системну палітру" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "Використовувати системні налаштування проксі" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "Використати нормалізацію гучності" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "Використано" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "У користувача %1 немає облікового запису Grooveshark Anywhere" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "Інтерфейс користувача" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Користувач" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "Використання меню для додавання композиції…" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "Змінна бітова швидкість" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "Різні виконавці" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "Версія %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "Перегляд" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "Режим візуалізації" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "Візуалізації" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "Налаштування візуалізацій" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "Визначення голосової активності" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "Гучність %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "Попереджати про закриття вкладки списку відтворення" #: core/song.cpp:337 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "Веб-сайт" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "Тижнів" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "Під час запуску Clementine" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "Якщо список є порожнім…" #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "Чому б не спробувати…" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "Широка смуга (WB)" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii Remote %1: активовано" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii Remote %1: під’єднано" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii Remote %1: критичний розряд батареї (%2%) " #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii Remote %1: деактивовано" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii Remote %1: від’єднано" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Remote %1: низький заряд батареї (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "Windows Media, 128 кб" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "Windows Media, 40 кб" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "Windows Media, 64 кб" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "Windows Media audio" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "Без обкладинки:" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "Хочете пересунути всі ініші композиції цього альбому до розділу «Різні виконавці»?" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "Бажаєте зараз виконати повторне сканування фонотеки?" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "Записати статичні дані щодо всіх композицій до файлів композицій" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "Помилкове ім’я користувача або пароль." #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "Рік" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "Рік - Альбом" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "Років" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "Вчора" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "Ви збираєтеся завантажити такі альбоми" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "Ви маєте намір вилучити %1 списків відтворення зі списку улюблених. Ви впевнені у цьому?" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "Вас не зареєстровано." #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "Вас зареєстровано як %1." #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "Вас зареєстровано." #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "Ви можете змінити спосіб упорядкування композицій у фонотеці." #: internet/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "Ви можете безкоштовно слухати будь-яку музику без облікового запису, але учасники з Premium мають змогу покращити якість звукового потоку та усунути рекламу." #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "Ви можете чути фонові звуки разом з іншою музикою." #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "Ви можете вільно скробблити доріжки, але лише платні передплатники можуть слухати потокове радіо Last.fm з Clementine." #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "У вас немає облікового запису Grooveshark Anywhere." #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "У вас немає облікового запису Spotify Premium." #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "У вас немає оформленої передплати" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "Ви вийшли зі Spotify, введіть ваш пароль знов у налаштуваннях, будь ласка." #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "Ви вийшли зі Spotify, введіть ваш пароль знов, будь ласка." #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "Улюблена композиція" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "Потрібно запустити «Системні налаштування» та увімкнути параметр \"Увімкнути доступ для допоміжних пристроїв\", щоб використовувати глобальні скорочення в Clementine." #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "Потрібно перезапустити Clementine, щоб змінити мову." #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "Ви не зможете прослуховувати радіостанції Last.fm, якщо ви не передплатник Last.fm." #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "Ваша IP-адреса:" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Ваші облікові дані Last.fm неправильні" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "Введені дані облікового запису Magnatune некоректні" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "Ваша фонотека порожня!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "Ваші радіо-потоки" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "%1 відтворень у вас" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "У вашій системі не передбачено підтримки OpenGL, отже візуалізаціями не можна буде скористатися." #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "Вами вказано помилкове ім’я користувача або пароль." #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Zero" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "додати %n композицій" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "після" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "тому" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "та" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "автоматично" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "до" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "між" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "спочатку найбільші" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "такт/хв." #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "містить" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "вимкнено" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "диск %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "не містить" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "закінчується на" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "збігається з" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "gpodder.net" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "Каталог gpodder.net " #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "більше ніж" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "за останні" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "кбіт/с" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "менше ніж" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "спочатку найдовші" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "пересунути %n композицій" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "спочатку найновіші" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "не дорівнює" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "не за останні" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "не на" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "спочатку найстаріші" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "на" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "налаштування" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "або скануйте QR-код!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "натисніть клавішу «enter»" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "вилучити %n композицій" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "спочатку найкоротші" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "перемішати композиції" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "спочатку найменші" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "впорядкувати композиції" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "починається з" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "зупинити" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "доріжка %1" clementine-1.2.0+dfsg/src/translations/uz.po000066400000000000000000004103071223327513400210710ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Umidjon Almasov , 2013 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:08+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Uzbek (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr "kun" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr "kb/s" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " ms" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " punkt" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr "soniya" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr "qo'shiq" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 albom" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 kun" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 kun oldin" #: podcasts/gpoddersync.cpp:79 #, 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:413 #, qt-format msgid "%1 selected of" msgstr "%1 tanlangan" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 qo'shiq" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 qo'shiq" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 qo'shiq topildi" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 qo'shiq topildi (ko'rsatildi %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 trek" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 ko'chirildi" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimotedev moduli" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n muvaffaqiyatsiz tugadi" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n tugadi" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "&Boshqa" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "&Extras" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "&Yordam" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "%1 &Yashirish" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "&Yashirish..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "&Chap" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "&Musiqa" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Yo'q" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "&Pleylist" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "&Chiqish" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "&Takrorlash" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&O'ng" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "&Tasodifan" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "&Ustunlarni oynaga moslash" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "&Vositalar" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(har xil bir nechta qo'shiqlar orqali)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "...va barcha Amarok tuzuvchilariga" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "0px" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 kun" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 trek" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 tasodifiy trek" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "Premium versiyagacha yangilash" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "Grooveshark Anywhere uchun hisob kerak." #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "Spotify Premium uchun hisob kerak." #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:78 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:153 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:297 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "ALL GLORY TO THE HYPNOTOAD" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "%1 haqida" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "Clementine haqida..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "Qt haqida..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Hisob tafsilotlari" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "Hisob tafsilotlari (Premium)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Amal" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Wiiremote yoqish/o'chirish" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "Podcast qo'shish" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "To'lqinni qo'shish" #: ../bin/src/ui_notificationssettingspage.h:425 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:193 msgid "Add action" msgstr "Amal qo'shish" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Boshqa to'lqinni qo'shish..." #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Jild qo'shish..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "Fayl qo'shish" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "Fayl qo'shish..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Transkodlash uchun fayllar qo'shish" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Jild qo'shish" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Jild qo'shish..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Yangi jild qo'shish..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "Podcast qo'shish" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "Podcast qo'shish..." #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Qidirish shartini qo'shish" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "Qo'shiq albomi tegini qo'shish" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "Qo'shiq albomi artisti tegini qo'shish" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "Qo'shiq artisti tegini qo'shish" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "Qo'shiq bastakori tegini qo'shish" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "Qo'shiq diski tegini qo'shish" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "Qo'shiq fayl nomi tegini qo'shish" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "Qo'shiq janri tegini qo'shish" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "Qo'shiq uzunligi tegini qo'shish" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "Qo'shiq ijro ettirish soni tegini qo'shish" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "Qo'shiq o'tkazib yuborishlar soni tegini qo'shish" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "Qo'shiq nomi tegini qo'shish" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "Qo'shiq treki tegini qo'shish" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "Qo'shiq yili tegini qo'shish" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "To'lqinni qo'shish..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "Grooveshark xatcho'plariga qo'shish" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "Grooveshark pleylistlariga qo'shish" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "Boshqa pleylistga qo'shish" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Pleylistga qo'shish" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "Navbatga qo'shish" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Wiimotedev amalini qo'shish" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Qo'shish..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Shu oy qo'shilgan" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Shu hafta qo'shilgan" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Shu yil qo'shilgan" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Bugun qo'shilgan" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Uch oy ichida qo'shilgan" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "Qo'shiqni xatcho'plariga qo'shmoqda" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Kengaytirilgan guruhlarga bo'lish..." #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "Keyin" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "Nusxa olgandan keyin..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Albom" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Albom (hamma treklar uchun ideal ovoz balandligi)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Albom artisti" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "Albom rasmi" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "jamendo.com sahifasida albom haqida ma'lumot..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Rasmli albomlar" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Rasmsiz albomlar" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Hamma fayllar (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "Gipnobaqaga shon-sharaflar!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Hamma albomlar" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Hamma artistlar" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "Hamma fayllar (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "Hamma pleylistlar (%1)" #: ui/about.cpp:74 msgid "All the translators" msgstr "Hamma tarjimonlar" #: library/library.cpp:84 msgid "All tracks" msgstr "Hamma treklar" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "Mid/side kodlashga ruxsat berish" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "Asl nusxalari bilan birga" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Bosh oynani hamisha yashirish" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Bosh oynani hamisha ko'rsatish" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "Hamisha ijro ettirish" #: internet/spotifyblobdownloader.cpp:60 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:61 msgid "An error occurred loading the iTunes database" msgstr "iTunes ma'lumot bazasini yuklaganda xato ro'y berdi" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "'%1'ga meta-ma'lumot yozilganda xato ro'y berdi" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:78 msgid "And:" msgstr "Va:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Ko'rinish" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Fayllarni/URL'larni pleylistga qo'shish" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "Joriy pleylistga qo'shish" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "Pleylistga qo'shish" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "Kesilmaslik uchun qisishni qo'llash" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "\"%1\" presetini o'chirishga ishonchingiz komilmi?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "Ushbu pleylistni o'chirishga ishonchingiz komilmi?" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "Statistikani boshlang'ich holatga qaytarishga ishonchingiz komilmi?" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Artist" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Artist haqida ma'lumot" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "Artist radio" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "Artist teglari" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "Artistning ismi-sharifi" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Audio format" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Tasdiqlash muvaffaqiyatsiz tugadi" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "Muallif" #: ui/about.cpp:65 msgid "Authors" msgstr "Mualliflar" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Avto" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Avomatik yangilash" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "Mavjud" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "O'rtacha bitreyt" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "O'rtacha rasm o'lchami" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "BBC Podcasts" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "Orqa fon to'lqinlari" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Orqa fon rangi" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "Orqa fon rasmi" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Orqa fon tiniqligi" #: core/database.cpp:734 msgid "Backing up database" msgstr "" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Taqiqlash" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "Bar analizatori" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Asosiy ko'k" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "Asosiy audio turi" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Amal" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "Zo'r" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "%1'dan tarjimai holi" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Bitreyt" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "Bitreyt" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "Blok analizatori" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "Blok turi" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "Boom analizatori" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Ko'rib chiqish..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "Buferizatsiya" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Tugmalar" #: core/song.cpp:339 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "CUE sheet qo'llash" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "Bekor qilish" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Albom rasmini o'zgartirish" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Shrift o'lchamini o'zgartirish..." #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "Takrorlash usulini o'zgartirish" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Tugmalar birikmasini o'zgartirish..." #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "Tasodifiy usulini o'zgartirish" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Tilni o'zgartirish" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "Yangi epizodlarni tekshirish" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Yangilanishlarni tekshirish..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "Aqlli pleylist nomini tanlang" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Avtomatik ravishda tanlash" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Rang tanlash..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "Shrift tanlash..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Ro'yxatdan tanlash" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "Pleylist qanday saralashini va nechta qo'shiq borligini tanlash" #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "Podkast yuklab olish direktoriyasini tanlash" #: ../bin/src/ui_songinfosettingspage.h:188 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:115 msgid "Classical" msgstr "Classical" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "Tozalanmoqda" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Tozalash" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Pleylistni tozalash" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Clementine xatosi" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Apelsin Clementine" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Clementine vizualizatsiyasi" #: ../bin/src/ui_deviceproperties.h:376 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_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine Dropboxga yuklangan musiqangizni ijri ettirishi mumkin" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "Clementine trek o'zgarganda xabar ko'rsatishi mumkin." #: ../bin/src/ui_podcastsettingspage.h:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "" #: visualisations/projectmvisualisation.cpp:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "" #: internet/lastfmsettingspage.cpp:110 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 "" #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Clementine rasm ko'ruvchisi" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Musiqani qo'shish uchun shu joyga bosing" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "Vizualizatsiyani yopish" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "Ushbu oynani yopganda yuklab olish bekor qilinadi." #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "Ushbu oynani yopganda albom rasmlarini qidirish to'xtatiladi." #: ui/equalizer.cpp:116 msgid "Club" msgstr "Club" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Colors" msgstr "Ranglar" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "" #: playlist/playlist.cpp:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Izoh" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "" #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Bastakor" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "" #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "Grooveshark moslash..." #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Last.fm moslash..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "Magnatune moslash..." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Tugmalar birikmalarini moslash" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "Spotify moslash..." #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "" #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "Podkastlarni moslash..." #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "Moslash..." #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "Uskunaga ulanish" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "Spotify'ga ulanmoqda" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "Konsol" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "Hamma musiqani konvertasiya qilish" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "Klipbordga nusxa olish" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Uskunaga nusxa olish..." #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "Mualliflik huquqlari" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:64 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "" #: transcoder/transcoder.cpp:432 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "" #: transcoder/transcoder.cpp:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "" #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Albom rasmi boshqaruvchisi" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Albom rasmi avtomatik ravishda %1'dan yuklandi" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "%1'dan albom rasmlari" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "Yangi Grooveshark pleylistini yaratish" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "Boshqa" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "Boshqa rasm:" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "Boshqa xabar moslamalari" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "Boshqa radio" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Boshqa..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "DBus yo'li" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Dance" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Yaratilgan sanasi" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "O'zgartirilgan sanasi" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "Kun" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "&Andoza" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "Ovoz balandligini 4%'ga kamaytirish" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Ovoz balandligini kamaytirish" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "Orqa fon andoza rasmi" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "Andoza" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "O'chirish" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "Grooveshark pleylistini o'chirish" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "Yuklab olingan ma'lumotni o'chirish" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Fayllarni o'chirish" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Uskunadan o'chirish..." #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Diskdan o'chirish..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "Ijro etilgan epizodlarni o'chirish" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "Presetni o'chirish" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "Aqlli pleylistni o'chirish" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "Asl faylini o'chirish" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "Fayllar o'chirilmoqda" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Tafsilotlar..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Uskuna" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Uskuna hossalari" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Uskuna nomi" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Uskuna hossalari..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Uskunalar" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Direktoriya" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Disk" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "Ko'rsatish parametrlari" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Takrorlanmasin" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "Boshqa artistlarda ko'rsatilmasin" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "To'xtatilmasin!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Ochish uchun ikki marta bosish" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "Qo'shiqni ikki marta bosganda..." #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "%n epizodlarni yuklab olish" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "Direktoriyani yuklab olish" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "Epizodlarni yuklash" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "A'zolikni yuklab olish" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "Yangi epizodlarni avtomatik ravishda yuklab olish" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "Yuklab olish navbatga qo'yildi" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Ushbu albomni yuklab olish" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Ushbu albomni yuklab olish..." #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "Ushbu epizodni yuklab olish" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "Yuklab olish..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "(%1%) yuklab olinmoqda..." #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "Icecast direktoriyasi yuklab olinmoqda" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "Jamendo katalogi yuklab olinmoqda" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "Magnatune katalogi yuklab olinmoqda" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "Spotify plagini yuklab olinmoqda" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "Meta-ma'lumot yuklab olinmoqda" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "Dropbox" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "" #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "\"%1\" tegini tahrirlash..." #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "Tegni tahrirlash..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "Teglarni tahrirlash" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Trek ma'lumotini tahrirlash" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "Trek ma'lumotini tahrirlash..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Treklar ma'lumotini tahrirlash" #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Tahrirlash..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "Ekvalayzer yoqish" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "Kodlash usuli" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "URL kiriting" #: ../bin/src/ui_coverfromurldialog.h:103 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:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "Ushbu pleylist uchun yangi nom kiriting" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Last.fm radio eshitish uchun artistni yoki tegni kiriting." #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:77 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:77 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:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "Qidirish shartlarini kiriting" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "Internet radio to'lqini uchun URL kiriting:" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "Jild nomini kiriting" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Xato" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "MTP uskunasiga ulanganda xato ro'y berdi" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "Qo'shiqlar nusxa olinganda xato ro'y berdi" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "Qo'shiqlarni o'chirganda xato ro'y berdi" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "Spotify plaginini yuklab olganda xato ro'y berdi" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "%1'ni yuklaganda xato ro'y berdi" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "di.fm pleylistini yuklaganda xato ro'y berdi" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "Audio CD yuklanganda xato ro'y berdi" #: library/library.cpp:63 msgid "Ever played" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "Har 10 daqiqa" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "Har 12 soat" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "Har 2 soat" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "Har 20 daqiqa" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "Har 30 daqiqa" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "Har 6 soat" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "Har soat" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "Podkast olish muvaffaqiyatsiz tugadi" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "Podkast yuklash muvaffaqiyatsiz tugadi" #: podcasts/podcasturlloader.cpp:167 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:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "Fayl formatlari" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Fayl nomi" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Fayl hajmi" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Fayl turi" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Fayl nomi" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Fayllar" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "Transkodlash uchun fayllar" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "" #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "" #: core/song.cpp:328 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Shrift o'lchami" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Do'stlar" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Full Bass" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "Full Bass + Treble" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "Full Treble" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "Umumiy" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Umumiy moslamalar" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Janr" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "Kanallarni olish" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "To'lqinlarni olish" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "O'tish" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "Grooveshark'ga kirish xatosi" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "Grooveshark radio" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "" #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "HTTP proksi" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "" #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "Soat" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Nishoncha" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "" #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Rasmlar (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "%1 kundan so'ng" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "%1 haftadan so'ng" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "" #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "Ma'lumot" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "O'rnatilgan" #: core/database.cpp:673 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "Internet provayderlari" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "API kaliti haqiqiy emas" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Format haqiqiy emas" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "Usul haqiqiy emas" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "Parametrlar haqiqiy emas" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "Xizmat haqiqiy emas" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "Seans kaliti haqiqiy emas" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "Foydalanuvchi nomi yoki maxfiy so'z haqiqiy emas" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "Jamendo ma'lumot bazasi" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "Mushukchalar" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Til" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "" #: internet/lastfmservice.cpp:437 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:154 msgid "Last.fm password" msgstr "Last.fm maxfiy so'zi" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Last.fm teglari" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Last.fm foydalanuvchi nomi" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Last.fm wiki" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "" #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Uzunligi" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "" #: ui/equalizer.cpp:123 msgid "Live" msgstr "" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Yuklash" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "Albom rasmini URL'dan yuklash" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "Albom rasmini URL'dan yuklash..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "Albom rasmini diskdan yuklash" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "Albom rasmini diskdan yuklash..." #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "Pleylistni yuklash" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "Pleylistni yuklash..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Last.fm radio yuklanmoqda" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "MTP uskunasi yuklanmoqda" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "iPod ma'lumot bazasi yuklanmoqda" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "Aqlli pleylist yuklanmoqda" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "Qo'shiqlar yuklanmoqda" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "To'lqin yuklanmoqda" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "Treklar yuklanmoqda" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "Treklar haqida ma'lumot yuklanmoqda" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "Yuklanmoqda..." #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Kirish" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "Kirish muvaffaqiyatsiz tugadi" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "Qo'shiq matnlari" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "%1'dan qo'shiq matnlari" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Magnatune Download" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "Shunday qilinsin!" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "" #: library/library.cpp:74 msgid "Most played" msgstr "" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "Musiqa" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "Mening musiqam" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "Tarmoq" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "Tarmoq proksi" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "Hech qachon" #: library/library.cpp:67 msgid "Never played" msgstr "Hech qachon ijro ettirilmagan" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "Yangi jild" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "Yangi pleylist" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "Yangi aqlli pleylist..." #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "Yangi qo'shiqlar" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "" #: library/library.cpp:80 msgid "Newest tracks" msgstr "" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "Keyingi" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Keyingi trek" #: core/utilities.cpp:147 msgid "Next week" msgstr "Kelasi hafta" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "" #: playlist/playlistcontainer.cpp:366 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "Yo'q" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "Ulanmagan" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "Hajmi yetarli emas" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "%1 brauzerda ochish" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "&Audio CD ochish..." #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "Uskunani ochish" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "Failni ochish..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "Google Driveda ochish" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "Yangi pleylistda ochish" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Ochish..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "Jarayon muvaffaqiyatsiz tugadi" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "Parametrlar..." #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "Fayllarni boshqarish" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "Fayllarni boshqarish..." #: core/organise.cpp:65 msgid "Organising files" msgstr "Fayllarni tashkillashtirish" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "Asl teglar" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Boshqa parametrlar" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "Chiqarish parametrlari" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "Mavjud fayllarni almashtirish" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:124 msgid "Party" msgstr "" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "Maxfiy so'z" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "" #: widgets/osd.cpp:156 msgid "Paused" msgstr "" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "" #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "" #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "" #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Pleyer parametrlari" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "Pleylist" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "Pleylist parametrlari" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "Pleylist turi" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "Pleylistlar" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "Brauzerni yopib Clementinega qayting" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "Plagin holati:" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "Podkastlar" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Pop" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "Mashhur qo'shiqlar" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "Bugun mashhur qo'shiqlar" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "Port" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "Moslamalar" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "Moslamalar..." #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "Afzal audio formati" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "Afzal bitreyt" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "Tugmani bosing" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "Ko'rib chiqish" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "Oldingi" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "Oldingi trek" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 msgid "Push Wiiremote button" msgstr "" #: ../bin/src/ui_querysortpage.h:138 msgid "Put songs in a random order" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "Sifati" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "" #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "Radio" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "Joriy qo'shiqni baholash 0 yulduz" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "Joriy qo'shiqni baholash 1 yulduz" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "Joriy qo'shiqni baholash 2 yulduz" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "Joriy qo'shiqni baholash 3 yulduz" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "Joriy qo'shiqni baholash 4 yulduz" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "Joriy qo'shiqni baholash 5 yulduz" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "Baho" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "Rostdan bekor qilinsinmi?" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "Yangilash" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "Mening musiqamdan o'chirish" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "Mening musiqamdan o'chirilmoqda" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "\"%1\" pleylistning nomini o'zgartirish" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "" #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "" #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" 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:206 msgid "Restrict to ASCII characters" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "Clementinega qaytish" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "Albom rasmini saqlash" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "Albom rasmini diskka saqlash..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "Rasmni saqlash" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "Pleylistni saqlash" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "Pleylistni saqlash..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "Treklar saqlanmoqda" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "Qidirish" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "Icecast stansiyalarni qidirish" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "Jamendo qidirish" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Magnatune qidirish" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "" #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "gpodder.net qidirish" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "iTunes qidirish" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "Qidirish usuli" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "Qidirish parametrlari" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "Qidirish shartlari" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "Grooveshark'da qidirilmodqa" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "Hammasini tanlash" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "Hech qaysini tanlamaslik" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "Orqa fon rangini tanlash:" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "Orqa fon rasmini tanlash" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "" #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "Seriya raqami" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "" #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Tugmalar birikmasi" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "%1 uchun tugmalar birikmasi" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "%1 uchun tugmalar birikmasi mavjud" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Ko'rsatish" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "OSD ko'rsatish" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "" #: ui/mainwindow.cpp:460 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:209 msgid "Show cover art in library" msgstr "" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "" #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "" #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "Trey nishonchasini ko'rsatish" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "Ko'rsatish/Yashirish" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "" #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "Qo'shiq haqida ma'lumot" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "Qo'shiq haqida ma'lumot" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "" #: ../bin/src/ui_icecastfilterwidget.h:77 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 "" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "Manba" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "Manbalar" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "Spotify kirish xatosi" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "Spotify plagini" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "Spotify plagini o'rnatilmagan" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "" #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "Stansiyalar" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "" #: core/song.cpp:341 msgid "Stream" msgstr "To'lqin" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "Muvaffaqiyat!" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "Muvaffaqiyatli yozilgan %1" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "Tizim ranglari" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Teg" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Tashakkurlar" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "" #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "%1 direktoriyasi haqiqiy emas" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "" #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "Ushbi albomda boshqa qo'shiqlar mavjud" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:56 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:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "These folders will be scanned for music to make up your library" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:174 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:151 msgid "Third level" msgstr "" #: internet/jamendoservice.cpp:171 msgid "" "This action will create a database which could be as big as 150 MB.\n" "Do you want to continue anyway?" msgstr "" #: internet/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "" #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "" #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "Bugun" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "Ertaga" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Trek" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "Musiqani transkodlash" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "Transkodlash parametrlari" #: core/song.cpp:338 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "" #: devices/giolister.cpp:161 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "URL(lar)" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "%1 (%2) yuklab olib bo'lmadi" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Noma'lum" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Noma'lum xato" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "Grooveshark pleylistini yangilash" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "" #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "Foydalanuvchi interfeysi" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Foydalanuvchi nomi" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "Versiya %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "Ko'rish" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "Vizualizatsiya usuli" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "Vizualizatsiyalar" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "Vizualizatsiya moslamalari" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "Veb sahifa" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "Hafta" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "Clementine ishga tushganda" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "Keng band (WB)" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii Remote %1: yoqilgan" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii Remote %1: ulangan" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii Remote %1: critical battery (%2%) " #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii Remote %1: o'chirilgan" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii Remote %1: ulanmagan" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Remote %1: low battery (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "Windows Media audio" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "Yil" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "Yil - Albom" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "Yillar" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "Kecha" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "" #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "" #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "" #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "" #: internet/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "" #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "" #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "Sizda Grooveshark Anywhere hisobi yo'q." #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "Sizda Spotify Premium hisobi yo'q." #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "" #: internet/spotifyservice.cpp:170 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/spotifysettingspage.cpp:158 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:87 msgid "You love this track" msgstr "Usbu trek sizga yoqdi" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "Tilni o'zgartirganda Clementine'dan chiqib qaytadan kirish kerak." #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "Radio to'lqinlaringiz" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "Skrobbling: %1" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "Foydalanuvchi nomi yoki maxfiy so'z noto'g'ri." #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Andoza" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "%n qo'shiqni qo'shish" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "keyin" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "avval" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "va" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "avtomatik" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "oldin" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "orasida" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "kattasidan boshlab" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "disk %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "tugaydi" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "teng" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "gpodder.net" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "gpodder.net direktoriyasi" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "kb/s" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "uzunidan boshlab" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "yangisidan boshlab" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "teng emas" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "oldingisidan boshlab" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "parametrlar" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "Enter bosing" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "%n qo'shiqni o'chirish" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "qisqasidan boshlab" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "kichigidan boshlab" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "boshlanadi" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "to'xtatish" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "trek %1" clementine-1.2.0+dfsg/src/translations/vi.po000066400000000000000000004712441223327513400210600ustar00rootroot00000000000000# 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 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-10 19:07+0000\n" "Last-Translator: Clementine Buildbot \n" "Language-Team: Vietnamese (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr " ngày" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " mili giây" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " điểm" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " giây" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " bài hát" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 album" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 ngày" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 ngày trước" #: podcasts/gpoddersync.cpp:79 #, 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:413 #, qt-format msgid "%1 selected of" msgstr "%1 chọn" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 bài hát" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 bài hát" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 bài hát được tìm thấy" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "%1 bài hát được tìm thấy (đang hiện %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 bài" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "Đã tải %1" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: mô-đun tay cầm Wii" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n thất bại" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n kết thúc" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "&Tùy chọn" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "&Hiệu ứng" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "Trợ &giúp" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "Ẩ&n %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "Ẩ&n..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "T&rái" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "&Nhạc" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "&Không" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "&Danh sách" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "T&hoát" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "&Chế độ lặp lại" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "&Phải" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "Chế độ phát n&gẫu nhiên" #: playlist/playlistheader.cpp:34 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:731 msgid "&Tools" msgstr "&Công cụ" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(mỗi bài mỗi khác)" #: ui/about.cpp:77 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:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "0 điểm ảnh" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 ngày" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 bài" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "127.0.0.1" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "40%" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 bài ngẫu nhiên" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "Nâng cấp lên tài khoản cao cấp ngay" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "Cần có tài khoản Grooveshark Anywhere." #: internet/spotifysettingspage.cpp:162 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:189 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:78 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:153 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:297 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "ALL GLORY TO THE HYPNOTOAD" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "Huỷ bỏ" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "Giới thiệu %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "Giới thiệu Clementine..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "Giới thiệu Qt..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "Chi tiết tài khoản" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "Chi tiết tài khoản (Cao cấp)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "Hoạt động" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "Kích hoạt/vô hiệu tay cầm Wii" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "Thêm Podcast" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "Thêm luồng dữ liệu" #: ../bin/src/ui_notificationssettingspage.h:425 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:193 msgid "Add action" msgstr "Thêm hành động" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "Thêm luồng dữ liệu khác..." #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "Thêm thư mục..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "Thêm tập tin" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "Thêm tập tin vào bộ chuyển mã" #: ../bin/src/ui_mainwindow.h:721 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:681 msgid "Add file..." msgstr "Thêm tập tin..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "Thêm các tập tin để chuyển mã" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "Thêm thư mục" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "Thêm thư mục..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "Thêm thư mục mới..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "Thêm podcast" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "Thêm podcast..." #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "Thêm điều kiện tìm kiếm" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "Thêm thẻ album bài hát" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "Thêm thẻ nghệ sĩ album" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "Thêm thẻ nghệ sĩ của bài hát" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "Thêm thẻ người soạn nhạc" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "Thêm thẻ đĩa của bài hát" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "Thêm tên tập tin bài hát" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "Thêm thẻ thể loại bài hát" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "Thêm thẻ thời lượng" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "Thêm số lần phát" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "Thêm đánh giá" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "Thêm bỏ qua đếm bài hát" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "Thêm thẻ tựa đề bài hát" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "Thêm thẻ bài hát" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "Thêm thẻ năm của bài hát" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "Thêm luồng dữ liệu..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "Thêm vào yêu thích của Grooveshark" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "Thêm vào danh sách Grooveshark" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "Thêm vào danh sách khác" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "Thêm vào danh sách" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "Thêm vào danh sách đợi" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "Thêm hoạt động tay cầm wii" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "Thêm..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "Đã thêm vào trong tháng này" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "Đã thêm vào trong tuần này" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "Đã thêm vào trong năm nay" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "Đã thêm vào trong ngày" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "Đã thêm vào trong ba tháng" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "Thêm bài hát vào Nhạc của tôi" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "Đang thêm bài hát vào yêu thích" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "Nhóm nâng cao..." #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "Sau " #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "Sau khi sao chép..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "Album" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "Album (âm lượng lớn cho mọi bài hát)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "Nghệ sĩ của Album" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "Ảnh bìa" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "Thông tin của album trên jamendo.com..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "Album có ảnh bìa" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "Album không có ảnh bìa" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "Mọi tập tin (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "All Glory to the Hypnotoad!" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "Tất cả album" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "Tất cả nghệ sĩ" #: ui/albumcoverchoicecontroller.cpp:47 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:74 msgid "All the translators" msgstr "Tất cả những người dịch" #: library/library.cpp:84 msgid "All tracks" msgstr "Tất cả bài hát" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "Cho phép tải về" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "Cho phép mã hóa song song" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "Thư mục chứa tập tin gốc" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "Luôn ẩn cửa sổ chính" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "Luôn hiện cửa sổ chính" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "Bắt đầu phát nhạc" #: internet/spotifyblobdownloader.cpp:60 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:61 msgid "An error occurred loading the iTunes database" msgstr "Có lỗi khi nạp cơ sở dữ liệu iTunes" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "Có lỗi khi ghi thông tin vào '%1'" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "Lỗi không xác định." #: ui/about.cpp:78 msgid "And:" msgstr "Và:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "Angry" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "Giao diện" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "Thêm tập tin/URLs vào danh sách" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "Thêm vào danh sách hiện tại" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "Thêm vào danh sách" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "Nén để chặn việc ngắt đoạn" #: ui/equalizer.cpp:197 #, 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\"?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "Bạn có chắc muốn xóa danh sách này?" #: ui/edittagdialog.cpp:769 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:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "Nghệ sĩ" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "Nghệ sĩ" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "Kênh phát thanh nghệ sĩ" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "Thẻ nghệ sĩ" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "Tên viết tắt của nghệ sĩ" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "Định dạng" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "Xác thực thất bại" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "Tác giả" #: ui/about.cpp:65 msgid "Authors" msgstr "Các tác giả" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "Tự động" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "Tự động cập nhật" #: ../bin/src/ui_librarysettingspage.h:208 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:45 msgid "Available" msgstr "Còn trống" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "Bitrate trung bình" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "Kích thước ảnh trung bình" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "Podcast BBC" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "Âm thanh nền" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "Màu nền" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "Ảnh nền" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "Độ mờ của khung nền" #: core/database.cpp:734 msgid "Backing up database" msgstr "Đang sao lưu cơ sở dữ liệu" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "Cấm" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "Phân tích theo các thanh" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "Xanh dương" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "Âm bình thường" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "Hành động" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "Tốt nhất" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "Thông tin từ %1" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "Bit rate" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "Bitrate" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "Phân tích theo các khối vuông" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "Kiểu khối" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "Nội dung" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "Phân tích theo dạng cây" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "Box" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "Duyệt tìm..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "Đang tạo bộ đệm" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "Những nguồn này đã bị vô hiệu:" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "Nút" #: core/song.cpp:339 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "Hỗ trợ danh sách CUE" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "Hủy bỏ" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "Đổi ảnh bìa" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "Đổi kích cỡ phông chữ..." #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "Thay đổi chế độ lặp lại" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "Đổi phím tắt..." #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "Thay đổi chế độ phát ngẫu nhiên" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "Đổi ngôn ngữ" #: ../bin/src/ui_playbacksettingspage.h:330 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:228 msgid "Check for new episodes" msgstr "Kiểm tra tập mới" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "Kiểm tra cập nhật..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "Đặt tên cho danh sách nhạc của bạn" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "Tự động lựa chọn" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "Chọn màu..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "Chọn phông chữ..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "Chọn từ danh sách" #: smartplaylists/querywizardplugin.cpp:155 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 đó." #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "Chọn thư mục lưu podcast tải về" #: ../bin/src/ui_songinfosettingspage.h:188 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:115 msgid "Classical" msgstr "Cổ điển" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "Dọn dẹp" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "Loại bỏ tất cả" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "Loại bỏ tất cả b.hát trong d.sách" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Lỗi Clementine" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Clementine Orange" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Clementine - Hình ảnh ảo" #: ../bin/src/ui_deviceproperties.h:376 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_boxsettingspage.h:104 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:104 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:104 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_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "Clementine có thể phát nhạc trong tài khoản Ubuntu One" #: ../bin/src/ui_notificationssettingspage.h:431 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:250 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:128 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." #: internet/lastfmsettingspage.cpp:110 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 "Clementine không thể lấy trạng thái chuyển tải thông tin vì kết nối mạng có vấn đề. Các bài hát đã phát sẽ được lưu vào bộ đệm và sau đó được gửi đến Last.fm." #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Clementine - Xem ảnh" #: ../bin/src/ui_trackselectiondialog.h:206 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:210 msgid "Clementine will find music in:" msgstr "Clementine sẽ tìm nhạc trong:" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "Nhấp vào đây để thêm nhạc" #: playlist/playlisttabbar.cpp:293 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:72 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_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "Đóng danh sách" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "Đóng hiệu ứng hình ảnh ảo" #: internet/magnatunedownloaddialog.cpp:280 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:216 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:116 msgid "Club" msgstr "Hội" #: ../bin/src/ui_appearancesettingspage.h:272 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:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "Lời bình" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "Điền thông tin bài hát" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "Điền thông tin bài hát..." #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "Soạn nhạc" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "Cấu hình %1..." #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "Cấu hình Grooveshark..." #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "Cấu hình Last.fm..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "Cấu hình Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "Phím tắt" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "Cấu hình Spotify..." #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "Cấu hình Subsonic..." #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "Cấu hình tìm kiếm chung..." #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "Cấu hình thư viện..." #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "Cấu hình podcast..." #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "Cấu hình..." #: ../bin/src/ui_wiimotesettingspage.h:186 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:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "Kết nối thiết bị" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "Kết nối đến Spotify" #: internet/subsonicsettingspage.cpp:107 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/subsonicsettingspage.cpp:117 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/" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "Console" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "Bitrate cố định" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "Chuyển đổi toàn bộ nhạc" #: ../bin/src/ui_deviceproperties.h:378 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" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "Chép vào bộ đệm" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "Chép vào thiết bị..." #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "Chép vào thư viện..." #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "Bản quyền" #: internet/subsonicsettingspage.cpp:81 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:64 #, 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" #: transcoder/transcoder.cpp:432 #, 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:426 #, 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/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "Không thể nạp đài phát thanh last.fm" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "Không thể mở tập tin %1" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "Quản lí ảnh bìa" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "Ảnh bìa từ ảnh nhúng" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "Ảnh bìa được nạp tự động từ %1" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "Bỏ thiết đặt ảnh bìa một cách thủ công" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "Chưa có ảnh bìa" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "Ảnh bìa được thiết lập từ %1" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "Ảnh bìa từ %1" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "Tạo danh sách Grooveshark mới" #: ../bin/src/ui_playbacksettingspage.h:302 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:301 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:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "Ctrl+Shift+T" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "Tuỳ chọn" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "Chọn ảnh:" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "Thiết lập tùy chọn tin nhắn" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "Tùy chọn phát thanh" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "Tùy chọn..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "Đường dẫn Dbus" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "Dance" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "Ngày tạo" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "Ngày chỉnh sửa" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "Ngày" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "&Mặc định" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "Giảm 4% âm lượng" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "Giảm phần trăm âm lượng" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "Giảm âm lượng" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "Dùng ảnh nền mặc định" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "Mặc định" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "Độ trễ giữa các hiệu ứng hình ảnh ảo" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "Xóa" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "Xoá danh sách Grooveshark" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "Xóa dữ liệu đã tải về" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "Xóa các tập tin" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "Xóa khỏi thiết bị..." #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "Xóa khỏi ổ cứng..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "Xóa tập đã phát" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "Xoá thiết lập" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "Xóa danh sách thông minh" #: ../bin/src/ui_organisedialog.h:194 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:1363 msgid "Dequeue selected tracks" msgstr "Loại các bài đã chọn khỏi danh sách chờ" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "Loại bài hát khỏi d.sách chờ" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "Xuất ra" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "Chi tiết..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "Thiết bị" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "Thuộc tính của thiết bị" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "Tên thiết bị" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "Thuộc tính của thiết bị..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "Thiết bị" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "Ý bạn là" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "Mật khẩu Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "Tên người dùng Digitally Imported" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "Nối mạng trực tiếp" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "Thư mục" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "Tắt thời lượng" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "Tắt khởi tạo thanh trạng thái" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "Tắt" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "Đĩa" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "Dừng truyền tải" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 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:715 msgid "Do a full library rescan" msgstr "Quét toàn bộ thư viện" #: ../bin/src/ui_deviceproperties.h:377 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:209 msgid "Do not overwrite" msgstr "Không ghi đè" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "Không lặp lại" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "Không hiện trong mục nhiều nghệ sĩ" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "Không phát ngẫu nhiên" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "Không dừng lại!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "Quyên góp" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "Nhấn đúp chuột để mở" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "Nhấn đúp chuột vào một bài hát sẽ..." #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "Tải về %n tập" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "Tải thư mục" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "Lưu các tập tải về vào" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "Tải với tư cách thành viên" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "Tự động tải về các tập mới" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "Đợi tải về" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "Tải album này" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "Tải album này..." #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "Tải tập này" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "Tải về..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "Đang tải (%1%)..." #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "Đang tải thư mục Icecast" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "Đang tải mục lục Jamendo" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "Đang tải mục lục Magnatune" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "Đang tải phần hỗ trợ cho Spotify" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "Đang tải thông tin dữ liệu" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "Kéo để xác định lại vị trí" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "Dropbox" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "Chế độ năng động đã bật" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "Hòa trộn âm thanh động ngẫu nhiên" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "Cập nhật danh sách thông minh..." #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "Sửa \"%1\"..." #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "Cập nhật thẻ..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "Sửa thông tin" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "Sửa thông tin bài hát" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "Sửa thông tin bài hát..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "Sửa thông tin bài hát..." #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "Cập nhật..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "Bật hỗ trợ tay cầm Wii" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "Bật bộ cân chỉnh âm" #: ../bin/src/ui_wiimotesettingspage.h:187 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_globalsearchsettingspage.h:147 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:62 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:235 msgid "Encoding complexity" msgstr "Mã hóa phức tạp" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "Chất lượng engine mã hóa" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "Chế độ mã hóa" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "Nhập URL" #: ../bin/src/ui_coverfromurldialog.h:103 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:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "Nhập tên mới cho danh sách này" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "Nhập tên một nghệ sĩ hoặc thẻ để bắt đầu nghe kênh phát thanh Last.fm." #: ../bin/src/ui_globalsearchview.h:209 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:77 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:77 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:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "Nhập điều kiện tìm kiếm" #: ../bin/src/ui_addstreamdialog.h:114 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:171 msgid "Enter the name of the folder" msgstr "Nhập tên thư mục" #: ../bin/src/ui_networkremotesettingspage.h:198 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:87 msgid "Entire collection" msgstr "Trọn bộ sưu tập" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "Lỗi" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "Lỗi kết nối thiết bị MTP" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "Lỗi chép nhạc" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "Lỗi xóa bài hát" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "Lỗi khi tải phần hỗ trợ Spotify" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "Lỗi nạp %1" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "Lỗi khi nạp danh sách di.fm" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "Lỗi xử lý %1: %2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "Có lỗi xảy ra khi nạp đĩa CD" #: library/library.cpp:63 msgid "Ever played" msgstr "Chưa bao giờ được phát" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "Mỗi 10 phút" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "Mỗi 12 giờ" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "Mỗi 2 giờ" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "Mỗi 20 phút" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "Mỗi 30 phút" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "Mỗi 6 giờ" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "Mỗi giờ" #: ../bin/src/ui_playbacksettingspage.h:303 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:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "Mở rộng" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "Hết hạn vào %1" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "Xuất ảnh bìa" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "Xuất ảnh bìa" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "Đã xuất xong" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 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:299 msgid "Fading" msgstr "Giảm dần âm lượng" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "Thời gian giảm dần âm lượng" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "Lỗi tải thư mục" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "Lỗi lấy podcast" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "Lỗi nạp podcast" #: podcasts/podcasturlloader.cpp:167 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:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "Nhanh" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "Yêu thích" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "Bài hát yêu thích" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "Tải các ảnh bìa còn thiếu" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "Tự động tải" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "Đã tải xong" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "Đang tải thư viện Subsonic" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "Lỗi khi tải ảnh bìa" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "Phần mở rộng tập tin" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "Định dạng tập tin" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "Tên tập tin" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "Tên tập tin (không có đường dẫn)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "Dung lượng" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "Loại tập tin" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "Tên tập tin" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "Tập tin" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "Tập tin để chuyển mã" #: smartplaylists/querywizardplugin.cpp:90 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." #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "Đang lấy thông tin bài hát" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "Hoàn tất" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "Mức độ đầu" #: core/song.cpp:328 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "Kích cỡ phông chữ" #: ../bin/src/ui_spotifysettingspage.h:213 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:204 msgid "Force mono encoding" msgstr "Buộc mã hóa đơn kênh" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "Quên thiết bị" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "Biểu mẫu" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "Định dạng" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "Tần số khung hình" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "Số khung mỗi lần tạo bộ đệm" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "Bạn bè" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "Frozen" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "Full Bass" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "Full Bass + Treble" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "Full Treble" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "Engine âm thanh GStreamer" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "Tổng quát" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "Thiết lập chung" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "Thể loại" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "Lấy URL để chia sẻ danh sách Grooveshark này" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "Lấy URL để chia sẻ bài này " #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "Đang lấy danh sách các bài hát phổ biến trên Grooveshark" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "Đang tải các kênh" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "Đang tải các luồng" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "Đặt tên:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "Đi" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "Đến tab danh sách tiếp theo" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "Trở về tab danh sách trước" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "Google Drive" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, 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:206 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_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "Lỗi đăng nhập Grooveshark" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "URL của danh sách Grooveshark" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "Phát thanh Grooveshark" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "URL của bài hát trên Grooveshark" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "Nhóm Thư viện theo..." #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "Nhóm theo" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "Nhóm theo Album" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "Nhóm theo Nghệ sĩ" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "Nhóm theo Nghệ sĩ/Album" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "Nhóm theo Nghệ sĩ/Năm - Album" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "Nhóm theo Thể loại/Album" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "Nhóm theo Thể loại/Nghệ sĩ/Album" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "Nhóm" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "Trang HTML không chứa nguồn tin RSS" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "Proxy HTTP" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "Happy" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "Thông tin phần cứng" #: ../bin/src/ui_deviceproperties.h:372 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:202 msgid "High" msgstr "Cao" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "Cao (%1 fps)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "Cao (1024x1024)" #: internet/subsonicsettingspage.cpp:112 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:310 msgid "Hours" msgstr "Giờ" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "Hypnotoad" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "Không có tài khoản Magnatune" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "Biểu tượng" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "Biểu tượng trên cùng" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "Đang nhận diện bài hát" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 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:77 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:204 msgid "Ignore \"The\" in artist names" msgstr "Bỏ qua \"The\" trong phần tên nghệ sĩ" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "Hình ảnh (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "Trong %1 ngày" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "Trong %1 tuần" #: ../bin/src/ui_wizardfinishpage.h:86 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/spotifyservice.cpp:360 msgid "Inbox" msgstr "Hộp thư đến" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "Kèm theo ảnh bìa trong thông báo" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "Bao gồm tất cả bài hát" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:127 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:158 msgid "Increase the volume by 4%" msgstr "Tăng 4% âm lượng" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "Tăng phần trăm âm lượng" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "Tăng âm lượng" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "Đang đánh chỉ mục %1" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "Thông tin" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "Nhập..." #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "Đã cài đặt" #: core/database.cpp:673 msgid "Integrity check" msgstr "Kiểm tra tính toàn vẹn" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "Internet" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "Dịch vụ" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "Khóa API không hợp lệ" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "Định dạng không hợp lệ" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "Phương thức không hợp lệ" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "Tham số không hợp lệ" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "Nguồn được xác lập không hợp lệ" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "Dịch vụ không hợp lệ" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "Khoá phiên chạy không hợp lệ" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "Vui lòng kiểm tra lại tên người dùng và mật khẩu" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "Những bài hát được nghe nhiều nhất trên Jamendo" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "Những bài hát đầu bảng trên Jamendo" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "Những bài hát đầu bảng trong tháng trên Jamendo" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "Những bài hát đầu bảng trong tuần trên Jamendo" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "Cơ sở dữ liệu Jamendo" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "Chọn bài đang được phát" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "Giữ nút trong %1 giây..." #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "Giữ nút trong %1 giây..." #: ../bin/src/ui_behavioursettingspage.h:193 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:193 msgid "Keep the original files" msgstr "Giữ nguyên tập tin gốc" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "Kittens" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "Ngôn ngữ" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "Laptop/Headphones" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "Large Hall" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "Ảnh bìa lớn" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "Thanh bên cỡ lớn" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "Lần phát cuối" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "Tùy chọn phát thanh Last.fm: %1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Thư viện Last.fm - %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "Phát thanh Last.fm mix - %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Kênh phát thanh Last.fm lân cận - %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Đài phát thanh Last.fm - %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Nghệ sĩ tương tự trên Last.fm %1" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Thẻ phát thanh Last.fm: %1" #: internet/lastfmservice.cpp:437 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:154 msgid "Last.fm password" msgstr "Mật khẩu Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "Số lần phát trên Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Các thẻ trên Last.fm" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Tên đăng nhập Last.fm" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Last.fm wiki" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "Những bài hát ít được yêu thích nhất" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "Để trống cho mặc định. Ví dụ: \"/dev/dsp\", \"front\", ..." #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "Trái" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "Thời lượng" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "Thư viện" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "Nhóm thư viện nâng cao" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "Chú ý quét lại thư viện" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "Tìm trong thư viện" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "Giới hạn" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "Nghe nhạc từ Grooveshark dựa theo những gì bạn đã nghe trước đó" #: ui/equalizer.cpp:123 msgid "Live" msgstr "Live" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "Nạp" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "Nạp ảnh bìa từ URL" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "Nạp ảnh bìa từ URL..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "Nạp ảnh bìa từ đĩa" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "Nạp ảnh bìa từ đĩa..." #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "Mở danh sách" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "Mở danh sách..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "Đang nạp kênh phát thanh Last.fm" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "Đang nạp thiết bị MTP" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "Đang nạp cơ sở dữ liệu iPod" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "Đang nạp danh sách thông minh" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "Đang nạp bài hát" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "Đang nạp luồng dữ liệu" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "Đang nạp bài hát" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "Đang nạp thông tin bài hát" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "Đang nạp..." #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "Mở tập tin/URL, thay thế danh sách hiện tại" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "Đăng nhập" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "Đăng nhập thất bại" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "Hồ sơ dự báo lâu dài (LTP)" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "Yêu thích" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "Thấp (%1 fps)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "Thấp (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "Hồ sơ ít phức tạp (LC)" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "Lời bài hát" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "Lời bài hát từ %1" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Tải về Magnatune" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Hoàn tất tải về Magnatune" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "Hồ sơ chính (MAIN)" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "Make it so!" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "Danh sách sẵn sàng ngoại tuyến" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "Phản hồi có vẻ xấu" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "Cấu hình proxy thủ công" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "Thủ công" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "Nhà sản xuất" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "Đánh dấu là đã nghe" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "Đánh dấu mới" #: ../bin/src/ui_querysearchpage.h:116 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:117 msgid "Match one or more search terms (OR)" msgstr "Một hay nhiều điều kiện khớp (OR)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "Bitrate tối đa" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "Trung bình (%1 fps)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "Trung bình (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "Kiểu thành viên" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "Bitrate tối thiểu" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "Thiếu thiết đặt projectM" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "Model" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "Giám sát các thay đổi trong thư viện" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "Phát đơn kênh" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "Tháng" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "Sắc thái" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "Kiểu thanh sắc thái" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "Thanh sắc thái" #: library/library.cpp:74 msgid "Most played" msgstr "Phát nhiều nhất" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "Điểm gắn" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "Các điểm gắn" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "Chuyển xuống" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "Dời vào thư viện..." #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "Chuyển lên" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "Nhạc" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "Thư viện nhạc" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "Tắt âm" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "Thư viện Last.fm của tôi" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "Kênh phát thanh Last.fm mix của tôi" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "Kênh Last.fm địa phương của tôi" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "Kênh phát thanh Last.fm khuyến nghị của tôi" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "Kênh phát thanh mix của tôi" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "Nhạc của tôi" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "Địa phương của tôi" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "Đài phát thanh của tôi" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "Bài nên nghe" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "Hành động" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "Tùy chọn đặt tên" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "Băng hẹp (NB)" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "Lân cận" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "Mạng" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "Proxy" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "Điều khiển qua mạng" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "Chưa bao giờ" #: library/library.cpp:67 msgid "Never played" msgstr "Chưa bao giờ phát" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "Không phát nhạc" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "Thư mục mới" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "Tạo danh sách mới" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "Tạo danh sách thông minh..." #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "Bài hát mới" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 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:80 msgid "Newest tracks" msgstr "Những bài mới nhất" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "Tiếp theo" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "Phát bài tiếp theo" #: core/utilities.cpp:147 msgid "Next week" msgstr "Tuần sau" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "Không phân tích" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "Không dùng ảnh nền" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "Không có ảnh bìa để xuất." #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "Các khối không dài" #: playlist/playlistcontainer.cpp:366 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:145 msgid "No short blocks" msgstr "Các khối ngắn" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "Không" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 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:155 msgid "Normal" msgstr "Bình thường" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "Kiểu khối bình thường" #: playlist/playlistsequence.cpp:170 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:107 msgid "Not connected" msgstr "Chưa kết nối" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "Không đủ nội dung" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "Chưa đủ người hâm mộ" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "Chưa đủ thành viên" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "Chưa đủ những người lân cận" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "Chưa cài đặt" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "Chưa đăng nhập" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "Chưa gắn kết - nhấp đúp chuột để gắn kết" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "Thông báo" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "Thông báo" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "Đang phát" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "Xem trước hộp thông báo" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "Ogg Opus" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 msgid "Only allow connections from the local network" msgstr "" #: ../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:290 msgid "Opacity" msgstr "Độ mờ" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "Mở %1 bằng trình duyệt" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "Mở đĩa &CD..." #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "Mở tập tin OPML" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "Mở tập tin OPML..." #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "Mở thiết bị" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "Mở tập tin..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "Mở trong Google Drive" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "Mở trong danh sách mới" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "Mở..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "Thao tác thất bại" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "Tối ưu cho bitrate" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "Tối ưu cho chất lượng" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "Tuỳ chọn..." #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "Opus" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "Sao chép tập tin" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "Sao chép tập tin..." #: core/organise.cpp:65 msgid "Organising files" msgstr "Tổ chức tập tin" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "Thẻ gốc" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "Các tuỳ chọn khác" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "Thiết bị xuất" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "Tùy chọn xuất" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "Ghi đè tập tin đã tồn tại" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "Sở hữu" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "Đang phân tích mục lục Jamendo" #: ui/equalizer.cpp:124 msgid "Party" msgstr "Party" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "Mật khẩu" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "Tạm dừng" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "Tạm dừng phát" #: widgets/osd.cpp:156 msgid "Paused" msgstr "Đã tạm dừng" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "Điểm ảnh" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "Thanh bên đơn giản" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "Phát" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "Phát theo Nghệ sĩ hoặc theo Thẻ" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "Phát kênh phát thanh nghệ sĩ..." #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "Số lần phát" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "Phát kênh phát thanh tùy chọn..." #: core/commandlineoptions.cpp:152 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:211 #: ../bin/src/ui_behavioursettingspage.h:225 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" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "Phát thẻ phát thanh..." #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "Phát bài hát thứ trong danh sách" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "Phát/Tạm dừng" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "Phát nhạc" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "Tùy chỉnh phát nhạc" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "Danh sách" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "Kết thúc danh sách" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "Tùy chọn danh sách" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "Loại danh sách" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "Danh sách" #: ../data/oauthsuccess.html:36 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:214 msgid "Plugin status:" msgstr "Trạng thái phần mở rộng:" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "Podcast" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "Pop" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "Những bài hát phổ biến" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "Bài hát phổ biến trong tháng" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "Bài hát phổ biến hôm nay" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "Thời gian xuất hiện" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "Cổng" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "Pre-amp" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "Tùy chỉnh" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "Tùy chỉnh..." #: ../bin/src/ui_librarysettingspage.h:202 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:167 msgid "Preferred audio format" msgstr "Định dạng âm thanh được ưu tiên" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "Bitrate ưu tiên" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "Định dạng được ưu tiên" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "Âm cao cấp" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "Thể loại:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "Ấn tổ hợp phím để" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "Ấn một phím" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "Bấm tổ hợp phím để %1..." #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "Tùy chọn hộp thông báo" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "Xem trước" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "Trước" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 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:131 msgid "Profile" msgstr "Hồ sơ" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "Tiến độ" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 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:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "Chất lượng" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "Truy vấn thiết bị..." #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "Quản lý danh sách chờ" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "Chờ phát những bài đã chọn" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "Chờ phát sau" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "Phát thanh (âm thanh bằng nhau cho mọi bài hát)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "Phát thanh" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "Rain" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "Hiệu ứng hình ảnh ảo ngẫu nhiên" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "Đánh giá 0 sao cho bài hiện tại" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "Đánh giá 1 sao cho bài hiện tại" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "Đánh giá 2 sao cho bài hiện tại" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "Đánh giá 3 sao cho bài hiện tại" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "Đánh giá 4 sao cho bài hiện tại" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "Đánh giá 5 sao cho bài hiện tại" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "Đánh giá" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "Thực sự hủy bỏ?" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "Cập nhật" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "Cập nhật mục lục" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "Cập nhật kênh" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "Cập nhật danh sách bạn" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "Cập nhật danh sách đài" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "Cập nhật các luồng" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Reggae" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "Ghi nhớ dao động của tay cầm Wii" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "Nhớ từ lần trước" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "Loại bỏ" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "Loại bỏ hành động" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "Loại bỏ mục trùng nhau khỏi d.sách" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "Loại bỏ thư mục" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "Loại bỏ khỏi Nhạc của tôi" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "Loại bỏ khỏi yêu thích" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "Loại bỏ khỏi danh sách" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "Loại bỏ danh sách" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "Loại bài hát khỏi Nhạc của tôi" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "Loại bài hát khỏi yêu thích" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "Đổi tên danh sách \"%1\"" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "Đổi tên danh sách Grooveshark" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "Đổi tên danh sách" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "Đổi tên danh sách..." #: ../bin/src/ui_mainwindow.h:671 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:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "Lặp lại" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "Lặp lại album" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "Lặp lại danh sách" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "Lặp lại bài hát" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "Thay thế danh sách hiện tại" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "Thay thế danh sách" #: ../bin/src/ui_organisedialog.h:205 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:309 msgid "Replay Gain" msgstr "Tăng thêm âm lượng" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "Phục hồi số lượng" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "Thiết lập lại" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" msgstr "Thiết lập lại bộ đếm số lần phát" #: 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:206 msgid "Restrict to ASCII characters" msgstr "Phải dùng kí tự mã ASCII" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "Tiếp tục phát nhạc khi khởi động" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "Đang lấy các bài hát Grooveshark trong Nhạc của tôi" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "Đang tải các bài hát yêu thích trên Grooveshark" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "Đang tải danh sách Grooveshark" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "Trở lại Clementine" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "Phải" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "Rock" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "Chạy" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "SOCKS proxy" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "Tháo gỡ thiết bị an toàn" #: ../bin/src/ui_organisedialog.h:196 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:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "Tần số âm" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "Tần số âm thanh" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "Lưu tập tin .mood trong thư viện nhạc" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "Lưu ảnh bìa album" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "Lưu lại ảnh bìa..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "Lưu ảnh" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "Lưu danh sách" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "Lưu danh sách..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "Lưu thiết lập" #: ../bin/src/ui_librarysettingspage.h:193 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:197 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:115 msgid "Save this stream in the Internet tab" msgstr "Lưu luồng dữ liệu này trong thẻ Internet" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "Đang lưu các bài hát" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "Hồ sơ tỉ lệ mẫu có thể mở rộng (SSR)" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "Điểm" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "Tự động gửi tên các bài hát tôi nghe" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "Tìm kiếm" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "Tìm trên Icecast" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "Tìm trên Jamendo" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "Tìm trên Magnatune" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "Tìm trên Subsonic" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "Tìm ảnh bìa..." #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "Tìm tất cả" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "Tìm trên gpodder.net" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "Tìm trên iTunes" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "Chế độ tìm kiếm" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "Tùy chỉnh tìm kiếm" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "Kết quả tìm kiếm" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "Điều kiện tìm kiếm" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "Đang tìm trên Grooveshark" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "Mức độ hai" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "Lùi về sau" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "Tiến về trước" #: core/commandlineoptions.cpp:163 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:162 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" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "Chọn hết" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "Bỏ chọn hết" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "Chọn màu nền:" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "Chọn ảnh nền" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "Chọn mục khớp nhiều nhất" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "Chọn màu lớp trên:" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "Chọn hiệu ứng hình ảnh ảo" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "Chọn hiệu ứng hình ảnh ảo..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "Số sê-ri" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "URL máy chủ" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "Chi tiết máy chủ" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "Dịch vụ ngoại tuyến" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "Thiết lập %1 sang \"%2\"..." #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "Đặt âm lượng ở mức phần trăm" #: ../bin/src/ui_mainwindow.h:672 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:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "Phím tắt" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "Phím tắt để %1" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "Đã có phím tắt để %1" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "Hiển thị" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "Hiện hộp thông báo" #: ../bin/src/ui_playbacksettingspage.h:298 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:293 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:434 msgid "Show a native desktop notification" msgstr "Hiện hộp thông báo" #: ../bin/src/ui_notificationssettingspage.h:442 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:441 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:436 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:435 msgid "Show a pretty OSD" msgstr "Tùy chỉnh thông báo" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "Hiện phía trên thanh trạng thái" #: ui/mainwindow.cpp:460 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:209 msgid "Show cover art in library" msgstr "Hiện ảnh bìa trong thư viện" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "Hiện đường phân cách" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "Hiện với kích thước gốc..." #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "Mở thư mục lưu..." #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "Hiện trong mục nhiều nghệ sĩ" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "Hiện thanh sắc thái" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "Chỉ hiện những mục bị trùng" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "Chỉ hiện những mục không được gán thẻ" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "Hiện đề nghị tìm kiếm" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "Hiện các nút \"yêu thích\" và \"cấm\"" #: ../bin/src/ui_lastfmsettingspage.h:158 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:192 msgid "Show tray icon" msgstr "Hiện biểu tượng dưới khay hệ thống" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "Hiện những nguồn đã được bật và tắt" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "Hiện/Ẩn" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "Phát ngẫu nhiên" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "Phát ngẫu nhiên album" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "Phát ngẫu nhiên tất cả" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "Phát ngẫu nhiên danh sách" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "Phát ngẫu nhiên trong album này" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "Đăng nhập" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "Đăng xuất" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "Đang đăng nhập..." #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "Nghệ sĩ tương tự" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "Kích thước" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "Kích thước:" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "Không cho lùi lại trong danh sách" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "Không đếm" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "Không cho chuyển bài trong danh sách" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "Ảnh bìa nhỏ" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "Thanh bên nhỏ" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "Danh sách thông minh" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "Danh sách thông minh" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "Thông tin bài hát" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "Bài hát" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "Sonogram" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "Rất tiếc" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "Sắp xếp theo thể loại (theo thứ tự abc)" #: ../bin/src/ui_icecastfilterwidget.h:76 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:77 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" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "Nguồn" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "Nguồn" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "Lỗi đăng nhập Spotify" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "Phần hỗ trợ Spotify" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "Phần hỗ trợ Spotify chưa được cài đặt" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "Chuẩn" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "Đã đánh giá" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "Bắt đầu danh sách đang phát" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "Bắt đầu chuyển mã" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 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:405 #, qt-format msgid "Starting %1" msgstr "Bắt đầu %1" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "Đang bắt đầu..." #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "Đài" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "Dừng" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "Dừng lại sau khi" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "Dừng sau khi phát xong bài này" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "Dừng lại" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "Dừng khi phát xong bài hiện tại" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "Đã dừng" #: core/song.cpp:341 msgid "Stream" msgstr "Truyền tải" #: internet/subsonicsettingspage.cpp:30 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:160 msgid "Streaming membership" msgstr "Truyền tải thông tin thành viên" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "Danh sách đã đăng kí" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "Người đăng kí" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "Thành công!" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "Đã ghi vào %1" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "Thẻ được đề nghị" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "Tóm tắt" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "Rất cao (%1 fps)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "Rất lớn (2048x2048)" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "Các định dạng được hỗ trợ" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "Đồng bộ thống kê vào tập tin ngay" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "Đang đồng bộ hộp thư đến Spotify" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "Đang đồng bộ danh sách Spotify" #: internet/spotifyservice.cpp:565 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:159 msgid "System colors" msgstr "Màu hệ thống" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "Các thẻ ở phía trên" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "Thẻ" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "Trình tải thẻ" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "Thẻ phát thanh" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "Bitrate mục tiêu" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "Tùy chỉnh văn bản" #: ui/about.cpp:70 msgid "Thanks to" msgstr "Xin gửi lời cám ơn đến" #: ui/globalshortcutssettingspage.cpp:175 #, 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:282 msgid "The album cover of the currently playing song" msgstr "Ảnh bìa của bài hát hiện tại" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "Thư mục %1 không hợp lệ" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "Danh sách '%1' rỗng hoặc không thể nạp được." #: smartplaylists/searchtermwidget.cpp:330 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:82 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/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "Có bài khác trong album này" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "Có một vấn đề khi giao tiếp với gpodder.net" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "Có vấn đề khi lấy thông tin từ Magnatune" #: podcasts/itunessearchpage.cpp:76 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:56 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:389 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:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 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:174 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:151 msgid "Third level" msgstr "Mức độ ba" #: internet/jamendoservice.cpp:171 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/magnatunedownloaddialog.cpp:175 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_deviceproperties.h:381 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:375 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:566 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:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "Luồng này chỉ dành cho người trả phí" #: devices/devicemanager.cpp:587 #, 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_songinfosettingspage.h:185 msgid "Timeout" msgstr "Thời gian chờ" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "Tựa đề" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "Để mở kênh phát thanh Grooveshark, bạn nên nghe vài bài hát trên Grooveshark trước" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "Hôm nay" #: core/globalshortcuts.cpp:59 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:1369 msgid "Toggle queue status" msgstr "Tắt/Bật trạng thái chờ" #: ../bin/src/ui_mainwindow.h:718 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:143 msgid "Tomorrow" msgstr "Ngày mai" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "Quá nhiều chuyển hướng" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "Những bài đứng đầu" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "Số byte đã truyền tải" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "Số lần gửi yêu cầu" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "Bài hát" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "Chuyển mã nhạc" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "Nhật kí chuyển mã" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "Chuyển mã" #: transcoder/transcoder.cpp:312 #, 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:54 msgid "Transcoding options" msgstr "Tùy chỉnh chuyển mã" #: core/song.cpp:338 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "Turbine" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "Tắt" #: devices/giolister.cpp:161 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "URL(s)" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "Ubuntu One" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "Băng siêu rộng (UWB)" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "Không thể tải về %1 (%2)" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "Chưa xác định" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "Không hiểu nội dung" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "Lỗi không xác định" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "Bỏ thiết đặt ảnh bìa" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "Hủy đăng kí" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "Các buổi hòa nhạc sắp diễn ra" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "Cập nhật danh sách Grooveshark" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "Cập nhật tất cả podcast" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "Cập nhập thư mục thư viện đã thay đổi" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "Cập nhật thư viện khi Clementine khởi động" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "Cập nhật podcast này" #: ../bin/src/ui_podcastsettingspage.h:227 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:103 #, 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:150 msgid "Usage" msgstr "Cách sử dụng" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "Dùng thẻ Nghệ sĩ của album khi có thể" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "Sử dụng phím tắt của Gnome" #: ../bin/src/ui_playbacksettingspage.h:310 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:129 msgid "Use SSLv3" msgstr "Dùng SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "Sử dụng tay cầm điều khiển Wii" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "Chọn màu" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "Tùy chọn tin nhắn thông báo" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "Sử dụng xác thực" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "Dùng engine quản lí bitrate" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "Sử dụng chế độ năng động" #: ../bin/src/ui_wiimotesettingspage.h:188 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:139 msgid "Use temporal noise shaping" msgstr "Tạo tiếng ồn tạm thời" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "Mặc định của hệ thống" #: ../bin/src/ui_appearancesettingspage.h:273 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:158 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:218 msgid "Use volume normalisation" msgstr "Sử dụng cân bằng âm lượng" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "Đã dùng" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "Người dùng %1 không có tài khoản Grooveshark Anywhere" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "Giao diện người dùng" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "Tên người dùng" #: ../bin/src/ui_behavioursettingspage.h:207 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:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "Bit rate thay đổi" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "Nhiều nghệ sỹ" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "Phiên bản %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "Hiển thị" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "Chế độ hình ảnh ảo" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "Hình ảnh ảo" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "Thiết đặt hiệu ứng hình ảnh ảo" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "Nhận dạng âm thanh hoạt động" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "Âm lượng %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "Trang web" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "Tuần" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "Khi Clementine khởi động" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "Khi danh sách trống..." #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "Tại sao không thử..." #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "Băng rộng (Wb)" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "Tay cầm Wii %1: đã kích hoạt" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "Tay cầm Wii %1: đã kết nối" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Tay cầm Wii %1: sắp hết pin (%2%) " #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Tay cầm Wii %1: đã tắt" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Tay cầm Wii %1: đã ngắt kết nối" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Tay cầm Wii %1: Pin yếu (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "Tay cầm Wii" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "Âm thanh Windows Media" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "Không có ảnh bìa:" #: library/libraryview.cpp:530 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:2088 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:151 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" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "Sai tên người dùng hoặc mật khẩu." #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "Năm" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "Năm - Album" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "Năm" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "Hôm qua" #: ../bin/src/ui_magnatunedownloaddialog.h:132 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:311 #, 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:177 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:172 msgid "You are not signed in." msgstr "Bạn chưa đăng nhập." #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "Bạn đã đăng nhập với tên %1." #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "Bạn đã đăng nhập." #: ../bin/src/ui_groupbydialog.h:123 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/digitallyimportedsettingspage.cpp:46 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/magnatunesettingspage.cpp:53 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:57 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." #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "Bạn có thể gửi thông tin các bài hát một cách miễn phí nhưng chỉ những thành viên đã thanh toán mới có thể lấy dữ liệu của kênh phát thanh Last.fm từ Clementine." #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "Bạn không có tài khoản Grooveshark Anywhere." #: internet/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/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "Bạn không có một đăng kí được kích hoạt" #: internet/spotifyservice.cpp:170 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/spotifysettingspage.cpp:158 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:87 msgid "You love this track" msgstr "Bạn thích bài hát này" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "Bạn cần mở Tùy chỉnh hệ thống và bật \" Cho phép truy cập vào thiết bị bổ trợ\" để sử dụng toàn bộ phím tắt trong Clementine." #: ../bin/src/ui_behavioursettingspage.h:200 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ữ." #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "Bạn không thể nghe đài phát thanh Last.fm vì bạn không phải là thành viên trả phí của Last.fm." #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "Địa chỉ IP của bạn:" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "Thông tin tài khoản Last.fm không đúng" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "Thông tin tài khoản Magnatune không đúng" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "Thư viện của bạn chưa có gì!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "Kênh phát thanh của bạn" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "Thông tin bài hát của bạn: %1" #: visualisations/visualisationcontainer.cpp:152 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/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 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:297 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "Không" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "và %n bài hát" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "sau" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "trước" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "và" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "tự động" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "trước" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "giữa" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "lớn nhất trước" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "có chứa" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "đã tắt" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "đĩa %1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "không chứa" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "kết thúc với" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "bằng" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "gpodder.net" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "Thư mục gpodder.net" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "lớn hơn" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "cuối" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "nhỏ hơn" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "dài nhất trước" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "di chuyển %n bài hát" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "mới nhất trước" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "không bằng" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "không ở cuối" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "không có ở" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "cũ nhất trước" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "vào" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "tùy chọn" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "nhấn enter" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "loại bỏ %n bài hát" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "ngắn nhất trước" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "phát ngẫu nhiên" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "nhỏ nhất trước" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "sắp xếp bài hát" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "bắt đầu với" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "dừng" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "bài %1" clementine-1.2.0+dfsg/src/translations/zh_CN.po000066400000000000000000004477131223327513400214470ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # Aron Xu , 2011 # bingmou , 2012 # bingmou , 2012 # xaojan , 2012 # walking , 2013 # xaojan , 2012 # Xinkai Chen , 2012 # Xinkai Chen , 2012 # zhangmin , 2013 # zhangmin , 2013 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-08-19 13:09+0000\n" "Last-Translator: xtoaster \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr "天" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " 毫秒" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " 磅" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " 秒" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " 首" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 个专辑" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 天" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 天前" #: podcasts/gpoddersync.cpp:79 #, 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:413 #, qt-format msgid "%1 selected of" msgstr "%1 选定" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 首" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 首" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "找到 %1 首" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "找到 %1 首(显示 %2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 首" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "%1 已传输" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wii 遥控器设备模块" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "%filename%" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n 失败" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n 完成" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "自定义(&C)" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "附件" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "帮助" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "隐藏 %1(&H)" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "隐藏(&H)..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "左(&L)" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "音乐" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "无(&N)" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "播放列表" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "退出(&Q)" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "循环模式" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "右(&R)" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "随机播放模式&S" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "拉伸栏以适应窗口(&S)" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "工具" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(多个曲目间不同)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "...和所有 Amarok 的贡献者" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "0" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "0px" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 天" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 个曲目" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "127.0.0.1" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "40%" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 个随机曲目" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "立即升级至豪华版" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "创建新账户或重置您的密码" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "需要一个 Grooveshark Anywhere 帐户。" #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "需要一个 Spotify 的付费账户。" #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "只有在输入正确代码后,客户端才能连接。" #: smartplaylists/wizard.cpp:78 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:153 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "一首歌如果满足这些条件就会被加入此播放列表。" #: smartplaylists/searchterm.cpp:297 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "ALL GLORY TO THE HYPNOTOAD" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "中止" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "关于 %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "关于 Clementine..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "关于 Qt..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "帐号详情" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "帐号详情 (付费账户)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "操作" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "启用/禁用 Wii 遥控器" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "添加播客" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "添加流媒体" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "如果消息提示支持的话则添加一个新行" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "添加动作" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "添加其他流媒体..." #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "添加目录..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "添加文件" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "添加文件至转码器" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "添加文件至转码器" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "添加文件..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "添加需转码文件" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "添加文件夹" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "添加文件夹..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "添加新文件夹..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "添加播客" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "添加播客..." #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "添加查询条件" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "添加歌曲专辑标签" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "添加歌曲专辑作者标签" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "添加歌曲艺术家标签" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "添加歌曲自动评分" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "添加歌曲作曲家标签" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "添加歌曲盘片标签" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "添加音乐文件" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "添加歌曲流派标签" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "添加歌曲分组标签" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "添加歌曲长度标签" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "添加歌曲表演者标签" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "统计音乐播放次数" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "添加歌曲评级" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "统计跳过歌曲的次数" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "添加歌曲标题标签" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "添加歌曲曲目标签" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "添加歌曲年份标签" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "添加流媒体..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "添加到 Grooveshark 收藏夹" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "添加到 Grooveshark 播放列表" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "添加到另一播放列表" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "添加到播放列表" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "添加到队列" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "添加 Wii 遥控器设备动作" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "添加..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "本月加入" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "本周加入" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "今年加入" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "今日加入" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "于三个月内加入" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "添加到我的音乐" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "添加歌曲到收藏夹" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "高级分组..." #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "之后 " #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "复制后..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "专辑" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "专辑(所有曲目采用合适音量)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "专辑艺人" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "专辑封面" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr "jamendo.com 上的专辑信息..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "有封面的专辑" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "无封面的专辑" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "全部文件 (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "全部专辑" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "全部艺人" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "全部文件 (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "全部播放列表 (%1)" #: ui/about.cpp:74 msgid "All the translators" msgstr "所有翻译人员" #: library/library.cpp:84 msgid "All tracks" msgstr "全部曲目" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "允许客户端从本机下载音乐。" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "允许下载" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "允许 M/S 编码 (和差编码)" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "原始歌曲同一目录下" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "总是隐藏主窗口" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "总是显示主窗口" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "总是开始播放" #: internet/spotifyblobdownloader.cpp:60 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:61 msgid "An error occurred loading the iTunes database" msgstr "加载 iTunes 数据库时出错" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "向 '%1' 写入元数据时出错" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "出现了意外错误。" #: ui/about.cpp:78 msgid "And:" msgstr "和:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "愤怒" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "外观" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "添加文件/URL 到播放列表" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "追加至当前播放列表" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "追加至播放列表" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "允许压缩以阻止剪切" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "您确定要删除预设 %1 吗?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "您确定要删除这个播放列表吗?" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "您确定要重置此曲目的统计信息吗?" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "艺人" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "艺人信息" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "艺人电台" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "艺人标签" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "艺术家名字的首字母" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "音频格式" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "认证失败" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "作者" #: ui/about.cpp:65 msgid "Authors" msgstr "作者" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "自动" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "自动更新" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "自动打开媒体库树重的单个分类" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "可用" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "平均位速率" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "图片平均大小" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "BBC 播客" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "背景流媒体" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "背景颜色" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "背景图片" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "背景透明度" #: core/database.cpp:734 msgid "Backing up database" msgstr "备份数据库" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "均衡" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "禁止" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "条形分析器" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "基础蓝" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "基本音频类型" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "行为" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "最佳" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "%1 上的个人档案" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "位速率" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "位速率" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "块状分析器" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "屏蔽类型" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "模糊量" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "通知正文" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "浏览..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "缓冲时长" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "缓冲中" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "但这些资源已经被禁止" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "按钮" #: core/song.cpp:339 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "CUE 支持" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "取消" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "更改封面" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "更改字号..." #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "改变重复模式" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "更改快捷键..." #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "更改乱序模式" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "更改语言" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "单声道回放设置的改变将在下首歌曲播放时生效" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "检测新节目" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "检查更新..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "为您的智能播放列表起名" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "自动选择" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "选择颜色..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "选择字体..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "从列表中选择" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "选择播放列表的排序方式和包含歌曲数量。" #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "选择播客下载目录" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "选择 Clementine 搜索歌词的网站。" #: ui/equalizer.cpp:115 msgid "Classical" msgstr "古典" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "清理" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "清空" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "清空播放列表" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Clementine 错误" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Clementine 橙" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Clementine 视觉效果" #: ../bin/src/ui_deviceproperties.h:376 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine 可自动将要复制到设备的文件转换为它可以播放的格式。" #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "Clementine 可以播放你上传到 Box 云存储的音乐" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "Clementine 可以播放你上传到 Dropbox 的音乐" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine 可以播放你上传到Google云存储的音乐" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "Clementine 可以播放你上传到 Ubuntu One 中的音乐" #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "Clementine 可在曲目发生变化时显示提示。" #: ../bin/src/ui_podcastsettingspage.h:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine 能够同步您在不同计算机和播客程序订阅的博客。创建新帐户。" #: visualisations/projectmvisualisation.cpp:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine 无法加载 projectM 可视化效果。请确定您已正确安装了 Clementine。" #: internet/lastfmsettingspage.cpp:110 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 "由于连接问题,Clementine不能读取您的订阅状态。已播放的曲目将会被缓存并稍后发送到Last.fm。" #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Clementine 图像查看器" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "Clementine 无法为此文件查找结果" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "Clementine 将在这些地方搜索音乐:" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "点击此处添加一些音乐" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "单击切换剩余时间和总计时间模式" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "关闭播放列表" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "关闭视觉效果" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "关闭此窗口将取消下载。" #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "关闭此窗口将停止寻找专辑封面。" #: ui/equalizer.cpp:116 msgid "Club" msgstr "俱乐部" #: ../bin/src/ui_appearancesettingspage.h:272 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:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "备注" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "自动补全标签" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "自动补全标签..." #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "作曲" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "配置 %1 ..." #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "正在配置 Grooveshark..." #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "配置 Last.fm..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "配置 Magnatune..." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "配置快捷键" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "配置Spotify..." #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "配置 Subsonic..." #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "配置全局搜索…" #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "配置媒体库..." #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "正在设置播客..." #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "配置..." #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "连接 Wii 遥控器" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "连接设备" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "连接Spotify" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "连接被服务器拒绝,请检查服务器链接。例如: http://localhost:4040/" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "连接超时,请检查服务器链接。例如: http://localhost:4040/" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "终端" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "固定位速率" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "转换全部音乐" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "转换设备不能播放的音乐" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "复制到剪切板" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "复制到设备..." #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "复制到媒体库..." #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "版权所有" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "无法连接至 Subsonic,请检查服务器链接。例如: http://localhost:4040/" #: transcoder/transcoder.cpp:64 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "无法创建GStreamer元素 \"%1\" - 请确认您已安装了所需GStreamer插件" #: transcoder/transcoder.cpp:432 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "无法为%1找到混音器,请检查是否安装了正确的Gstreamer插件" #: transcoder/transcoder.cpp:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "无法找到适合 %1 的解码器,请确认您正确安装了GStreamer插件" #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "无法加载 last.fm 电台" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "无法打开输出文件 %1" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "封面管理器" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "从内嵌图片获取封面" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "从 %1 自动加载封面" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "手工清除了封面" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "未设置封面" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "从 %1 中设置封面" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "来自%1的封面" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "创建一个新的 Grooveshark 播放列表" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "自动换曲时淡入淡出" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "手动换曲时淡入淡出" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "自定义" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "自定义图片:" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "自定义消息设置" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "自定义广播" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "自定义..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "DBus 路径" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "舞曲" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "创建日期" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "修改日期" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "天" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "默认(&F)" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "音量减少 4%" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "降低音量 %" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "降低音量" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "默认背景图片" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "默认" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "在两个视觉化效果间延迟切换" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "删除" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "删除 Grooveshark 播放列表" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "删除已下载的数据" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "删除文件" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "从设备删除..." #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "从硬盘删除..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "删除收听过的节目" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "删除预设" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "删除智能播放列表" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "删除原始文件" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "删除文件" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "移除选定曲目" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "移除曲目" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "目标" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "详情..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "设备" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "设备属性" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "设备名称" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "设备属性..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "设备" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "您是想搜索" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "Digitally Imported 密码" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "Digitally Imported 用户名" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "直接连接到互联网" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "目录" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "关闭时长" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "禁止生成心情指示条" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "禁用" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "盘片" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "断续传输" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "显示选项" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "显示屏幕显示" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "重新扫描整个媒体库" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "不转换任何曲目" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "不要覆盖" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "不循环播放" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "不在群星中显示" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "不随机播放" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "不要停止!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "捐助" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "双击打开" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "双击歌曲将..." #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "已经下载了 %n 个节目" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "下载目录" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "下载节目到" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "下载会员" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "自动下载新的节目" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "下载队列" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "下载 Android 应用" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "下载此专辑" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "下载此专辑..." #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "下载此节目" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "下载..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "下载中 (%1%)..." #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "正在下载 Icecast 目录" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "正在下载 Jamendo 分类" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "正在下载 Magnatune 分类" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "下载Spotify插件中" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "下载元数据" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "拖拽以重新定位" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "已打开动态模式" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "动态随机混音" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "编辑智能播放列表..." #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "编辑标签 %1..." #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "编辑标签..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "编辑标签" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "编辑曲目信息" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "编辑曲目信息..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "编辑曲目信息..." #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "编辑..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "启用 Wii 遥控支持" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "启用均衡器" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "仅当 Clementine 在焦点时启用快捷键" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "在搜索结果中启用以下来源。结果将按以下顺序显示。" #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "启用/禁用 Last.fm 的音乐记录" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "编码复杂度" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "编码引擎质量" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "编码模式" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "输入网址(URL)" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "输入 URL 以便从网络下载封面:" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "输入导出封面的文件名(不含扩展名):" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "输入播放列表的新名称" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "输入一个 艺人标签 来开始收听 Last.fm 电台。" #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "输入搜索项,在本地电脑和网络搜索" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "使用下方输入的内容在 iTunes商店 上搜索播客" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "使用下方输入的内容在 gpodder.net 上搜索播客" #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "在此输入查找条件" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "请输入互联网广播流媒体地址:" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "输入文件夹名字" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "在应用中输入此 IP 来连接上 Clementine。" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "整个集合" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "错误" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "连接 MTP 设备出错" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "复制曲目出错" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "删除曲目出错" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "下载Spotify插件出错" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "载入 %1 出错" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "读取di.fm播放列表错误" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "处理 %1 出错:%2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "读取CD时发生错误" #: library/library.cpp:63 msgid "Ever played" msgstr "曾经播放" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "每10分钟" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "每12小时" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "每2小时" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "每20分钟" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "每30分钟" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "每6小时" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "每小时" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "同一专辑歌曲或者同一CUE sheet不淡出" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "现有封面" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "扩展" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "于%1过期" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "导出封面" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "导出封面" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "导出下载的封面" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "导出内嵌封面" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "导出完成" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "已导出 %1 个封面,共 %2 个(跳过 %3 个)" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "暂停时淡出/恢复时淡入" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "停止播放曲目时淡出" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "淡出" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "淡出时长" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "无法获取目录" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "无法获取播客" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "无法读取播客" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "无法解析此 RSS 种子的XML" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "快速" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "收藏夹" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "收藏的曲目" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "获取缺少的封面" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "自动获取" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "读取完毕" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "正在获取 Subsonic 曲目库" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "获取封面出错" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "文件扩展名" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "文件格式" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "文件名" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "文件名(无路径)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "文件大小" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "文件类型" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "文件名" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "文件" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "要转换的文件" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "在你的媒体库里查找符合条件的歌曲。" #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "识别音乐" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "完成" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "第一阶段" #: core/song.cpp:328 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "字号" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "由于许可证原因 Spotify 支持位于单独的插件中。" #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "强制单声道编码" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "忘记设备" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "表格" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "格式" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "帧速率" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "每帧缓冲" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "好友" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "冻结" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "重低音" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "低音饱满 + 高音清丽" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "高音" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "GStreamer 音频引擎" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "一般" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "常规设置" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "流派" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "获取一个分享该 Grooveshark 播放列表的地址" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "获取一个分享该 Grooveshark 音乐的地址" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "正在获取 Grooveshark 的流行榜单" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "获得频道" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "获取流" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "给它起个名字" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "Go" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "转到下一播放列表标签" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "转到上一播放列表标签" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "Google云存储" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "获取了 %1 个封面,共 %2 个(失败 %3 个)" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "灰色显示播放列表中不存在的歌曲" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "Grooveshark 登录错误" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "Grooveshark 的播放列表地址" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "Grooveshark 电台" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "Grooveshark 歌曲地址" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "媒体库分组..." #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "分组" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "按专辑分组" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "按艺人分组" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "按艺人/专辑分组" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "按艺人/年份分组 - 专辑" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "按流派/专辑分组" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "按流派/艺人/专辑分组" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "分组" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "HTML页面没有包含任何 RSS 种子" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "未获得 URL 返回 HTTP 3xx 状态代码, 请检查服务器配置。" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "HTTP 代理" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "高兴" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "硬件信息" #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "硬件信息仅在设备连接上后可用。" #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "高" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "高(%1 fps)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "高(1024x1024)" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "主机未找到,请检查服务器链接。例如: http://localhost:4040/" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "小时" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "我没有 Magnatune 帐号" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "图标" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "图标在上" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "识别曲目" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "如果您选择继续,设备运行将会变慢并且复制歌曲工作可能无法正常进行。" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "如果您知道播客地址,请在下面填入地址并且点击 Go。" #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "忽略艺人名称中的“The”" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "图像 (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "在 %1 天内" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "%1 周内" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "在动态模式中, 每次歌曲播放完之后会被选择并添加新歌曲到播放列表.使用动态模式将忽略您的播放列表大小设定值。" #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "收件夹" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "在提示中中加入专辑封面" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "包含所有的歌曲" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "Subsonic REST 协议版本不兼容。客户端需更新。" #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "Subsonic REST 协议版本不兼容。服务端需更新。" #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "配置不完整,请确认所有字段都已填好。" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "以 4% 为单位增大音量" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "提升音量 %" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "增大音量" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "正在索引 %1" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "信息" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "插入..." #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "已安装" #: core/database.cpp:673 msgid "Integrity check" msgstr "完整性检验" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "互联网" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "互联网提供商" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "无效的 API 密钥" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "无效格式" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "无效方式" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "无效参数" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "指定的资源无效" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "服务无效" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "会话钥匙无效" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "用户名/密码无效" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "Jamedo 最受欢迎曲目" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "Jamendo 曲目排行" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "Jamendo 本月曲目排行" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "Jamendo 本周曲目排行" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "Jamendo 数据库" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "跳转到当前播放的曲目" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "保持按钮 %1 秒..." #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "保持按钮 %1 秒..." #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "当窗口关闭时仍在后台运行" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "保留原始文件" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "猫咪" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "语言" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "笔记本电脑/耳机" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "大礼堂" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "大专辑封面" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "大侧边栏" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "最近播放" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "Last.fm 自定义广播:%1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Last.fm 媒体库 - %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "last.fm混音电台 - %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Last.fm 邻居电台 - %1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Last.fm 电台 - %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Last.fm 上 %1 的相似艺人" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Last.fm 标签电台:%1" #: internet/lastfmservice.cpp:437 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm 正忙,请及分钟后再试" #: ../bin/src/ui_lastfmsettingspage.h:154 msgid "Last.fm password" msgstr "Last.fm 密码" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "Last.fm 播放计数" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Last.fm 标签" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Last.fm 用户名" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Last.fm 维基" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "最不喜欢的曲目" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "空白为默认,例如: \"/dev/dsp\",\"front\" 等。" #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "左" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "长度" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "媒体库" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "媒体库高级分组" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "重新扫描媒体库提示" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "媒体库搜索" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "限制" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "以您之前收听过的音乐为基础来收听 Grooveshark 的歌曲" #: ui/equalizer.cpp:123 msgid "Live" msgstr "直播" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "载入" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "从 URL 载入封面" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "从 URL 载入封面..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "从磁盘读取封面" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "从磁盘载入封面..." #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "载入播放列表" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "载入播放列表..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "正在载入 Last.fm 电台" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "正在载入 MTP 设备" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "正在载入 iPod 数据库" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "正在载入智能播放列表" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "加载曲目" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "正在载入媒体流" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "正在载入曲目" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "正在加载曲目信息" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "正在载入..." #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "载入文件或URL,替换当前播放列表" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "登录" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "登录失败" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "长期预测 (LTP)" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "喜爱" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "低(%1 fps)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "低(256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "低复杂度 (LC)" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "歌词" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "歌词来自 %1" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Magnatune 下载" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Magnatune 下载完成" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "主要档案(MAIN)" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "就这样吧!" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "播放列表离线可用" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "无效的响应" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "手工设置代理" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "手动" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "生产商" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "标记为已听" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "标记为新的" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "匹配每个查询条件(与)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "匹配一个或多个查询条件(或)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "最大位速率" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "中(%1 fps)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "中(512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "会员类型" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "最小位速率" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "projectM 设置缺失" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "型号" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "监控媒体库的更改" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "单曲循环" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "月" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "心情" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "心情指示条风格" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "心情指示条" #: library/library.cpp:74 msgid "Most played" msgstr "最常播放" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "挂载点" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "挂载点" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "下移" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "移动至媒体库..." #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "上移" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "音乐" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "媒体库" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "静音" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "我的 Last.fm 媒体库" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "我的 Last.fm Mix Radio" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "我的 Last.fm 邻居" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "我的 Last.fm 推荐广播" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "我的混音电台" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "我的音乐" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "我的邻居" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "我的电台" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "我的推荐" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "名称" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "命名选项" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "窄带(NB)" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "邻居" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "网络" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "网络代理" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "网络远程" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "从不" #: library/library.cpp:67 msgid "Never played" msgstr "从未播放" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "从未播放" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "创建新文件夹" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "新建播放列表" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "新建智能播放列表..." #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "新曲目" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "新曲目会被自动添加。" #: library/library.cpp:80 msgid "Newest tracks" msgstr "最新曲目" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "下一首" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "下一个曲目" #: core/utilities.cpp:147 msgid "Next week" msgstr "下一周" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "无均衡器" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "无背景图片" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "无封面可供导出。" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "无长块" #: playlist/playlistcontainer.cpp:366 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "无匹配。清空搜索框以重新显示整个播放列表。" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "无短块" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "无" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "已选择的曲目均不适合复制到设备" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "正常" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "普通块类型" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "使用动态播放列表时不可用" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "未连接" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "内容不足" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "歌迷不足" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "会员不足" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "邻居不足" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "未安装" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "未登录" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "尚未挂载 - 双击进行挂载" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "提示类型" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "提示" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "现在播放" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "OSD 预览" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "不透明度" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "在浏览器中打开%1" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "打开音频CD..." #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "打开 OPML 文件" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "打开 OPML 文件…" #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "打开设备" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "打开文件..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "打开 Google 云存储" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "在新播放列表中打开" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "打开..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "操作失败" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "为位速率优化" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "为质量优化" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "选项..." #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "组织文件" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "组织文件..." #: core/organise.cpp:65 msgid "Organising files" msgstr "组织文件" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "原始标签" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "其它选项" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "输出" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "输出设备" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "输出选项" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "输出插件" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "覆盖全部" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "覆盖已存在的文件" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "只覆盖体积较小的文件" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "所有者" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "正在解析 Jamendo 分类" #: ui/equalizer.cpp:124 msgid "Party" msgstr "晚会" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "密码" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "暂停" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "暂停播放" #: widgets/osd.cpp:156 msgid "Paused" msgstr "已暂停" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "表演者" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "像素" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "普通侧边栏" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "播放" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "按艺术家或标签播放" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "播放艺人电台..." #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "播放计数" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "播放自定义广播..." #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "若停止则播放,若播放则停止" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "如无歌曲播放则自动播放添加的歌曲" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "播放标签电台..." #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "播放列表中的第首" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "播放/暂停" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "播放" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "播放器选项" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "播放列表" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "已完成播放列表" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "播放列表选项" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "播放列表类型" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "播放列表" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "请关闭你的浏览器,回到 Clementine。" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "插件状态:" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "播客" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "流行" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "流行音乐" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "每月最热歌曲" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "今日最热歌曲" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "弹出时长" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "端口" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "前置放大" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "首选项" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "首选项..." #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "专辑封面的文件名(逗号分隔)" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "首选音乐格式" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "偏好的比特率" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "首选格式" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "高级音频类型" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "预设:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "按下组合键定义为" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "按一个键" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "请为 %1 按下新的组合键..." #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "漂亮的 OSD 选项" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "预览" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "上一首" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "上一个曲目" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "输出版本信息" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "档案" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "进度" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 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:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "质量" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "正在查询设备..." #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "队列管理器" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "将选定曲目加入队列" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "加入队列" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "电台(所有曲目采用相同的音量)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "电台" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "雨声" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "随机视觉效果" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "给当前曲目评级为零星" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "给当前曲目评级为一星" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "给当前曲目评级为两星" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "给当前曲目评级为三星" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "给当前曲目评级为四星" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "给当前曲目评级为五星" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "评级" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "确实取消?" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "重定向次数超过限制,请验证客户端配置。" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "刷新" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "刷新分类" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "刷新频道" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "刷新好友列表" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "刷新电台列表" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "刷新流" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "Reggae" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "记住 Wii遥控器 节奏" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "记住上次设置" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "删除" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "删除操作" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "从播放列表中移除重复项" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "删除文件夹" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "从我的音乐中移出" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "从收藏夹的中删除" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "从播放列表中移除" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "删除播放列表" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "删除播放列表" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "正在从我的音乐中移出" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "正在从收藏夹中删除歌曲" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "重命名 \"%1\" 播放列表" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "重命名 Grooveshark 播放列表" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "重命名播放列表" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "重命名播放列表..." #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "以此顺序为曲目重新编号..." #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "循环" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "专辑循环" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "播放列表循环" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "单曲循环" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "移除当前播放列表" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "移除播放列表" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "以下划线代替空格" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "回放增益" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "回放增益模式" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "重现加入队列" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "需要验证码" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "重置" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" 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:206 msgid "Restrict to ASCII characters" msgstr "仅使用 ASCII 字符" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "启动时恢复播放" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "正在获取 Grooveshark 我的音乐中的歌曲" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "正在获取 Grooveshark 收藏夹中的歌曲" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "正在检索 Grooveshark 播放列表" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "回到Clementine" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "右" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "摇滚" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "运行" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "SOCKS 代理" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "SSL 握手出错,请验证服务器配置。下面的 SSLv3 选项可能解决一些问题。" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "安全移除设备" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "复制后安全移除设备" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "采样率" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "采样率" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "保存 .mood 文件至您的音乐库" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "保存转接封面" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "保存封面至硬盘..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "保存图像" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "保存播放列表" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "保存播放列表..." #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "保存预设" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "如果可能,保存评级信息至文件标记中" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "如果可能,保存统计信息至文件标记中" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "在网络标签中收藏此媒体流" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "正在保存统计信息至歌曲文件" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "正在保存曲目" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "可变采样频率 (SSR)" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "缩放" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "得分" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "提交正在收听的音乐" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "搜索" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "搜索 Icecast 电台" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "搜索 Jamendo" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "搜索 Magnatune" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "搜索 Subsonic" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "搜索专辑封面..." #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "搜索一切" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "搜索 gpodder.net" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "搜索iTunes" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "搜索模式" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "搜索选项" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "搜索结果" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "搜索条目" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "在 Grooveshark 搜索" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "第二阶段" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "快退" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "快进" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "当前播放的曲目以相对步长快进/快退" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "当前播放的曲目快进/快退至指定时间点" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "选择全部" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "不选择" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "选择背景色:" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "选择背景图片" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "选择最可能的匹配项" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "选择前景色:" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "选择视觉效果" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "选择视觉效果..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "序列号" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "服务器 URL" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "服务器详情" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "服务离线" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "将 %1 设置为 %2..." #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "设置音量为 %" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "为全部选中的曲目设置值..." #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "设置" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "快捷键" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "%1 的快捷键" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "已存在 %1 的快捷键" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "显示" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "显示 OSD" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "当前曲目显示发光动画" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "在音轨进度条上显示心情指示条" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "使用原生桌面提示" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "在我更改了循环播放模式时弹出提示" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "改变音量是显示提示" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "系统托盘气泡通知" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "显示漂亮的 OSD" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "在状态栏之上显示" #: ui/mainwindow.cpp:460 msgid "Show all songs" msgstr "显示所有歌曲" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "显示全部曲目" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show cover art in library" msgstr "在媒体库中显示封面" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "显示分频器" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "显示完整尺寸..." #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "在文件管理器中打开..." #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "在群星中显示" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "显示心情指示条" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "只显示重复" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "只显示未加标签的" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "显示搜索建议" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "显示“标记喜爱”和“禁止”按钮" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "在主窗体中显示提交按钮" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "显示托盘图标" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "显示来源启用/禁用状态" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "显示/隐藏" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "乱序" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "乱序专辑" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "乱序全部" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "随机播放列表" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "此专辑的曲目乱序播放" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "登录" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "注销" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "登录..." #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "相似艺人" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "大小" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "大小:" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "Ska" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "在播放列表中后退" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "跳过计数" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "在播放列表中前进" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "小专辑封面" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "小侧边栏" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "智能播放列表" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "智能播放列表" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "Soft" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "Soft Rock" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "曲目信息" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "曲目信息" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "声波图" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "抱歉" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "按流派排序(字母顺序)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "按流派排序(流行度)" #: ../bin/src/ui_icecastfilterwidget.h:77 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 "正在排序" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "来源" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "来源" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "Spotify 登录失败" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "Spotify插件" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "potify 插件未安装" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "标准" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "用星号标记" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "开始播放当前播放列表" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "开始转换" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "请在上方搜索栏中输入一些词条,来充实搜索结果列表" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "正在开始 %1" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "正在开始..." #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "工作站" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "停止" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "后停止" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "在此曲目后停止" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "停止播放" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "播放完此曲目后停止" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "已停止" #: core/song.cpp:341 msgid "Stream" msgstr "流媒体" #: internet/subsonicsettingspage.cpp:30 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:160 msgid "Streaming membership" msgstr "流媒体成员" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "订阅的播放列表" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "订阅" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "Subsonic" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "成功!" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "成功写入 %1" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "推荐标签" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "总览" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "很高(%1 fps)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "超高质 (2048x2048)" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "支持的格式" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "立即同步统计数据至文件" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "同步 Spotify 收件箱" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "同步 Spotify 播放列表" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "同步 Spotify 星号标记的曲目" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "系统颜色" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "标签在上" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "标签" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "标签提取程序" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "标签电台 (Tag Radio)" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "目标位速率" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "Techno" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "文本设置" #: ui/about.cpp:70 msgid "Thanks to" msgstr "感谢" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "命令\"%1\"无法执行。" #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "目前正在播放的音乐的专辑封面" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "文件夹 %1 无效" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "播放列表 '%1' 为空或者无法加载。" #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "您请求的站点并不是一个图片!" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "此专辑中还有其它歌曲" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "与 gpodder.net 通讯时出现了问题" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "从Magnatune获取元数据出错" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "在解析 iTunes 商店的回馈信息出现了问题" #: ui/organiseerrordialog.cpp:56 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:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "将从设备中删除这些文件.确定删除吗?" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "这些文件将从磁盘中永久性删除,您确定要继续吗?" #: ../bin/src/ui_librarysettingspage.h:187 msgid "These folders will be scanned for music to make up your library" msgstr "这些文件夹将被扫描然后收录进您的媒体库" #: ../bin/src/ui_transcodersettingspage.h:174 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:151 msgid "Third level" msgstr "第三阶段" #: internet/jamendoservice.cpp:171 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/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "这张专辑不是有效的格式" #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "此设备必须在连接并打开之前,Clementine可以检测它支持什么文件格式。" #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "该设备支持以下文件格式:" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "这个设备将不会正常工作" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "这些选项可以在“行为”设置中修改" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "该流媒体只有付费用户才能收听" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "这种设备不被支持: %1" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "超时" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "标题" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "在开始收听 Grooveshark 电台之前,您需要收听几首 Grooveshark 的歌曲" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "今日" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "切换漂亮的 OSD" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "切换全屏" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "切换队列状态" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "切换歌曲记录" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "切换 OSD 可见性" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "明天" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "太多的重定向" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "热门曲目" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "专辑总数:" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "已传输字节总数" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "已发出网络连接总数" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "曲目" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "音乐转码" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "转换日志" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "转码" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "正在转码 %1 个文件,占用线程 %2 个" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "转码设置" #: core/song.cpp:338 msgid "TrueAudio" msgstr "TrueAudio" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "Turbine" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "关闭" #: devices/giolister.cpp:161 msgid "URI" msgstr "URI" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "URL" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "Ubuntu One 密码" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "Ubuntu One 用户名" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "超宽带 (UWB)" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "无法下载 %1 (%2)" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "未知" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "未知的content-type" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "未知错误" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "撤销封面" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "取消订阅" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "近期音乐会" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "更新 Grooveshark 播放列表" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "更新所有播客" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "更新改变的媒体库文件夹" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "Clementine 启动时更新媒体库" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "更新此播客" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "更新中" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "正在更新 %1" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "正在更新 %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "正在更新媒体库" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "用法" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "使用专辑艺术家标记(如果可用)" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "使用 GNOME 快捷键" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "使用播放增益元数据(如果可用)" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "使用 SSLv3" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "使用Wii控制器" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "使用自定义颜色集" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "自定义提示信息" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "使用网络远程控制" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "使用认证" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "使用位速率管理引擎" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "使用动态模式" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "使用提示显示Wii状态" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "使用瞬时降噪" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "使用系统默认" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "使用系统默认颜色集" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "使用系统代理设置" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "使用音量标准化" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "已使用" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "用户 %1 没有 Grooveshark Anywhere 帐户" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "用户界面" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "用户名" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "使用菜单添加歌曲将..." #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "可变比特率" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "群星" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "版本 %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "查看" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "视觉效果模式" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "视觉效果" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "视觉效果设置" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "语音活动检测" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "音量 %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "Vorbis" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "关闭播放列表标签时,提示我" #: core/song.cpp:337 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "网站" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "周" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "Clementine 启动时" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "列表为空的时候..." #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "为什么不试试…" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "宽带 (WB)" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii 遥控器 %1:活动" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii 遥控器 %1:已连接" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii 遥控器 %1:电池告急(%2%) " #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii 遥控器 %1:不活动" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii 遥控器 %1:已断开" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii 遥控器 %1:电池电量低(%2%)" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "Wiimotedev" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "Windows Media 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "Windows Media 40k" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "Windows Media 64k" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "Windows Media 音频" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "无封面:" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "您想要把此专辑的其它歌曲移动到 群星?" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "您要立即做个全部重新扫描?" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "所有统计信息写入至歌曲文件" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "用户名密码错误。" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "年份" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "年份 - 专辑" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "年" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "昨天" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "您即将下载以下专辑" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "您正试图从收藏夹中删除播放列表 %1 ,确定要这样做吗?" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "您未登录。" #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "您已经作为%1登录。" #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "您已经登录。" #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "您可以更改媒体库中音乐的组织形式。" #: internet/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "您无需注册即可免费收听音乐,但是高级会员可以收听无广告的高音质内容。" #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "在聆听音乐的同时,您也可以同时后台收听其它流媒体。" #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "您可以免费提交收听的音乐信息(scrobbling),但付费用户才能使用 Clementine 收听 Last.fm 提供的流媒体。" #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "您没有 Grooveshark Anywhere 帐户。" #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "您没有Spotify付费账户。" #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "您没有活动订阅" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "您已经登出了 Spotify,请在设置对话框中重新输入您的密码。" #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "您已经登出了 Spotify,请重新输入您的密码。" #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "您喜爱这个曲目" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "您需要打开系统设置并开启\"开启辅助设备访问\"以在Clementine中使用全局快捷键。" #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "如果更改语言,您需要重启 Clementine 使设置生效。" #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "因不是Last.fm的订阅者,您将不能播放Last.fm电台。" #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "您的 IP 地址:" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "你的Last.fm帐号信息有误" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "你的Magnatune帐号信息有误" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "您的媒体库是空的!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "您的广播流媒体" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "提交的音轨:%1" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "您的系统缺少OpenGL支持,可视化效果不可用。" #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "您的用户名或密码不正确。" #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "Z-A" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "00" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "添加 %n 首曲目" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "之后" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "以前" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "和" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "自动" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "之前" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "之间" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "体积大的优先" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "包含" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "关闭" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "盘片%1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "不包含" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "结尾为" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "等于" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "gpodder.net" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "gpodder.net 目录" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "大于" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "最后" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "小于" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "最长优先" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "移动 %n 首歌" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "最新优先" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "不等于" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "不在最后" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "除日期" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "最老优先" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "于日期" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "选项" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "或扫描 OR 码!" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "按回车键" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "移除 %n 首歌" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "最短优先" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "乱序歌曲" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "最小优先" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "排序歌曲" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "起始为" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "停止" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "曲目 %1" clementine-1.2.0+dfsg/src/translations/zh_TW.po000066400000000000000000004342101223327513400214650ustar00rootroot00000000000000# Clementine. # Copyright (C) 2010 David Sansome # This file is distributed under the same license as the Clementine package. # # Translators: # brli7848 , 2013 # Cheng-Hong Wu , 2012 # FIRST AUTHOR , 2010 # taijuin lee , 2011-2013 msgid "" msgstr "" "Project-Id-Version: Clementine Music Player\n" "Report-Msgid-Bugs-To: http://code.google.com/p/clementine-player/issues/list\n" "PO-Revision-Date: 2013-09-15 03:07+0000\n" "Last-Translator: brli7848 \n" "Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/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:39 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:246 msgid " days" msgstr "天" #: ../bin/src/ui_transcoderoptionsaac.h:130 #: ../bin/src/ui_transcoderoptionsmp3.h:195 #: ../bin/src/ui_transcoderoptionsopus.h:81 #: ../bin/src/ui_transcoderoptionsspeex.h:220 #: ../bin/src/ui_transcoderoptionsspeex.h:223 #: ../bin/src/ui_transcoderoptionsvorbis.h:205 #: ../bin/src/ui_transcoderoptionsvorbis.h:208 #: ../bin/src/ui_transcoderoptionsvorbis.h:211 #: ../bin/src/ui_transcoderoptionswma.h:80 msgid " kbps" msgstr " kbps" #: ../bin/src/ui_songinfosettingspage.h:186 #: ../bin/src/ui_playbacksettingspage.h:305 #: ../bin/src/ui_playbacksettingspage.h:308 #: ../bin/src/ui_playbacksettingspage.h:328 msgid " ms" msgstr " 毫秒" #: ../bin/src/ui_songinfosettingspage.h:182 msgid " pt" msgstr " pt" #: ../bin/src/ui_notificationssettingspage.h:439 #: ../bin/src/ui_visualisationselector.h:116 msgid " seconds" msgstr " 秒" #: ../bin/src/ui_querysortpage.h:143 msgid " songs" msgstr " 歌曲" #: widgets/osd.cpp:188 #, qt-format msgid "%1 albums" msgstr "%1 專輯" #: core/utilities.cpp:108 #, qt-format msgid "%1 days" msgstr "%1 天" #: core/utilities.cpp:129 #, qt-format msgid "%1 days ago" msgstr "%1 天前" #: podcasts/gpoddersync.cpp:79 #, qt-format msgid "%1 on %2" msgstr "" #: playlistparsers/playlistparser.cpp:76 #, qt-format msgid "%1 playlists (%2)" msgstr "%1 播放清單 (%2)" #: playlist/playlistmanager.cpp:413 #, qt-format msgid "%1 selected of" msgstr "%1 選定" #: devices/deviceview.cpp:123 #, qt-format msgid "%1 song" msgstr "%1 歌曲" #: devices/deviceview.cpp:125 #, qt-format msgid "%1 songs" msgstr "%1 歌曲" #: smartplaylists/searchpreview.cpp:133 #, qt-format msgid "%1 songs found" msgstr "%1 首歌曲找到" #: smartplaylists/searchpreview.cpp:130 #, qt-format msgid "%1 songs found (showing %2)" msgstr "發現%1首歌(顯示%2)" #: playlist/playlistmanager.cpp:419 #, qt-format msgid "%1 tracks" msgstr "%1 歌曲" #: ui/albumcovermanager.cpp:459 #, qt-format msgid "%1 transferred" msgstr "傳送%1" #: widgets/osd.cpp:238 widgets/osd.cpp:243 widgets/osd.cpp:248 #: widgets/osd.cpp:253 widgets/osd.cpp:258 widgets/osd.cpp:263 #, qt-format msgid "%1: Wiimotedev module" msgstr "%1: Wiimotedev 模組" #: songinfo/lastfmtrackinfoprovider.cpp:94 #, 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:427 msgid "%filename%" msgstr "%檔案名稱%" #: transcoder/transcodedialog.cpp:202 #, c-format msgid "%n failed" msgstr "%n 失敗的" #: transcoder/transcodedialog.cpp:197 #, c-format msgid "%n finished" msgstr "%n 完成的" #: transcoder/transcodedialog.cpp:192 #, c-format 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:178 msgid "&Custom" msgstr "自訂(&C)" #: ../bin/src/ui_mainwindow.h:730 msgid "&Extras" msgstr "外掛程式(&E)" #: ../bin/src/ui_mainwindow.h:729 msgid "&Help" msgstr "幫助(&H)" #: playlist/playlistheader.cpp:70 #, qt-format msgid "&Hide %1" msgstr "隱藏 %1" #: playlist/playlistheader.cpp:33 msgid "&Hide..." msgstr "隱藏(&H)..." #: playlist/playlistheader.cpp:39 msgid "&Left" msgstr "左邊(&L)" #: ../bin/src/ui_mainwindow.h:727 msgid "&Music" msgstr "音樂(&M)" #: ../bin/src/ui_globalshortcutssettingspage.h:176 msgid "&None" msgstr "無(&N)" #: ../bin/src/ui_mainwindow.h:728 msgid "&Playlist" msgstr "播放清單(&P)" #: ../bin/src/ui_mainwindow.h:656 msgid "&Quit" msgstr "結束(&Q)" #: ../bin/src/ui_mainwindow.h:694 msgid "&Repeat mode" msgstr "循環播放模式(&R)" #: playlist/playlistheader.cpp:41 msgid "&Right" msgstr "右邊(&R)" #: ../bin/src/ui_mainwindow.h:693 msgid "&Shuffle mode" msgstr "隨機播放模式(&S)" #: playlist/playlistheader.cpp:34 msgid "&Stretch columns to fit window" msgstr "將列伸展至視窗邊界(&S)" #: ../bin/src/ui_mainwindow.h:731 msgid "&Tools" msgstr "工具(&T)" #: ui/edittagdialog.cpp:48 msgid "(different across multiple songs)" msgstr "(在多首歌曲的差異)" #: ui/about.cpp:77 msgid "...and all the Amarok contributors" msgstr "...和所有的 Amarok 的貢獻者" #: ../bin/src/ui_albumcovermanager.h:223 ../bin/src/ui_albumcovermanager.h:224 msgid "0" msgstr "" #: ../bin/src/ui_trackslider.h:70 ../bin/src/ui_trackslider.h:74 msgid "0:00:00" msgstr "0:00:00" #: ../bin/src/ui_appearancesettingspage.h:289 msgid "0px" msgstr "" #: core/utilities.cpp:108 msgid "1 day" msgstr "1 天" #: playlist/playlistmanager.cpp:419 msgid "1 track" msgstr "1 歌曲" #: ../bin/src/ui_networkremotesettingspage.h:201 msgid "127.0.0.1" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:143 #: ../bin/src/ui_magnatunesettingspage.h:174 msgid "128k MP3" msgstr "128k MP3" #: ../bin/src/ui_appearancesettingspage.h:291 msgid "40%" msgstr "" #: library/library.cpp:60 msgid "50 random tracks" msgstr "50 隨機歌曲" #: ../bin/src/ui_digitallyimportedsettingspage.h:165 msgid "Upgrade to Premium now" msgstr "現在就升級至進階" #: ../bin/src/ui_ubuntuonesettingspage.h:133 msgid "" "Create a new account or reset " "your password" msgstr "" #: ../bin/src/ui_librarysettingspage.h:195 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_librarysettingspage.h:199 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:199 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/groovesharksettingspage.cpp:111 msgid "A Grooveshark Anywhere account is required." msgstr "必須為Grooveshark Anywhere會員。" #: internet/spotifysettingspage.cpp:162 msgid "A Spotify Premium account is required." msgstr "必須為 Spotify 的高級帳戶。" #: ../bin/src/ui_networkremotesettingspage.h:189 msgid "A client can connect only, if the correct code was entered." msgstr "" #: smartplaylists/wizard.cpp:78 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:153 msgid "" "A song will be included in the playlist if it matches these conditions." msgstr "一首歌曲將被包括在播放清單中,如果這些條件是符合的。" #: smartplaylists/searchterm.cpp:297 msgid "A-Z" msgstr "A-Z" #: ../bin/src/ui_transcodersettingspage.h:179 msgid "AAC" msgstr "AAC" #: ../bin/src/ui_digitallyimportedsettingspage.h:179 msgid "AAC 128k" msgstr "AAC 128k" #: ../bin/src/ui_digitallyimportedsettingspage.h:171 msgid "AAC 32k" msgstr "AAC 32k" #: ../bin/src/ui_digitallyimportedsettingspage.h:178 msgid "AAC 64k" msgstr "AAC 64k" #: core/song.cpp:336 msgid "AIFF" msgstr "AIFF" #: widgets/nowplayingwidget.cpp:119 msgid "ALL GLORY TO THE HYPNOTOAD" msgstr "所有的榮耀歸於大蟾蜍" #: ui/albumcovermanager.cpp:108 ui/albumcoversearcher.cpp:166 msgid "Abort" msgstr "" #: ui/about.cpp:32 #, qt-format msgid "About %1" msgstr "關於 %1" #: ../bin/src/ui_mainwindow.h:677 msgid "About Clementine..." msgstr "關於 Clementine..." #: ../bin/src/ui_mainwindow.h:712 msgid "About Qt..." msgstr "關於 Qt..." #: ../bin/src/ui_groovesharksettingspage.h:113 #: ../bin/src/ui_magnatunesettingspage.h:155 #: ../bin/src/ui_spotifysettingspage.h:208 #: ../bin/src/ui_lastfmsettingspage.h:151 #: ../bin/src/ui_ubuntuonesettingspage.h:129 msgid "Account details" msgstr "帳戶詳情" #: ../bin/src/ui_digitallyimportedsettingspage.h:161 msgid "Account details (Premium)" msgstr "帳戶詳情(高級)" #: ../bin/src/ui_wiimotesettingspage.h:191 msgid "Action" msgstr "功能" #: wiimotedev/wiimotesettingspage.cpp:98 msgid "Active/deactive Wiiremote" msgstr "開啟/關閉 Wii 遙控器" #: podcasts/addpodcastdialog.cpp:56 msgid "Add Podcast" msgstr "加入 Podcast" #: ../bin/src/ui_addstreamdialog.h:113 msgid "Add Stream" msgstr "加入網路串流" #: ../bin/src/ui_notificationssettingspage.h:425 msgid "Add a new line if supported by the notification type" msgstr "如果通知類型支援的話新增一欄" #: ../bin/src/ui_wiimotesettingspage.h:193 msgid "Add action" msgstr "加入功能" #: internet/savedradio.cpp:103 msgid "Add another stream..." msgstr "加入其它的網路串流" #: library/librarysettingspage.cpp:68 msgid "Add directory..." msgstr "加入目錄..." #: ui/mainwindow.cpp:1603 msgid "Add file" msgstr "加入檔案" #: ../bin/src/ui_mainwindow.h:723 msgid "Add file to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:721 msgid "Add file(s) to transcoder" msgstr "" #: ../bin/src/ui_mainwindow.h:681 msgid "Add file..." msgstr "加入檔案..." #: transcoder/transcodedialog.cpp:214 msgid "Add files to transcode" msgstr "加入檔案以轉碼" #: ui/mainwindow.cpp:1631 msgid "Add folder" msgstr "加入資料夾" #: ../bin/src/ui_mainwindow.h:698 msgid "Add folder..." msgstr "加入資料夾..." #: ../bin/src/ui_librarysettingspage.h:188 msgid "Add new folder..." msgstr "新增資料夾..." #: ../bin/src/ui_addpodcastdialog.h:179 msgid "Add podcast" msgstr "加入 Podcast" #: podcasts/podcastservice.cpp:257 ../bin/src/ui_mainwindow.h:719 msgid "Add podcast..." msgstr "加入 Podcast..." #: smartplaylists/searchtermwidget.cpp:341 msgid "Add search term" msgstr "加入搜尋字詞" #: ../bin/src/ui_notificationssettingspage.h:380 msgid "Add song album tag" msgstr "加入歌曲專輯標籤" #: ../bin/src/ui_notificationssettingspage.h:386 msgid "Add song albumartist tag" msgstr "加入歌曲專輯演出者標籤" #: ../bin/src/ui_notificationssettingspage.h:377 msgid "Add song artist tag" msgstr "加入歌曲演出者標籤" #: ../bin/src/ui_notificationssettingspage.h:422 msgid "Add song auto score" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:392 msgid "Add song composer tag" msgstr "加入歌曲作曲家標籤" #: ../bin/src/ui_notificationssettingspage.h:401 msgid "Add song disc tag" msgstr "加入歌曲光碟標籤" #: ../bin/src/ui_notificationssettingspage.h:429 msgid "Add song filename" msgstr "加入歌曲檔名" #: ../bin/src/ui_notificationssettingspage.h:407 msgid "Add song genre tag" msgstr "加入歌曲風格標籤" #: ../bin/src/ui_notificationssettingspage.h:398 msgid "Add song grouping tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:410 msgid "Add song length tag" msgstr "加入歌曲長度標籤" #: ../bin/src/ui_notificationssettingspage.h:395 msgid "Add song performer tag" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:413 msgid "Add song play count" msgstr "加入歌曲播放次數" #: ../bin/src/ui_notificationssettingspage.h:419 msgid "Add song rating" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:416 msgid "Add song skip count" msgstr "加入歌曲跳過次數" #: ../bin/src/ui_notificationssettingspage.h:383 msgid "Add song title tag" msgstr "加入歌曲標題標籤" #: ../bin/src/ui_notificationssettingspage.h:404 msgid "Add song track tag" msgstr "加入歌曲曲目標籤" #: ../bin/src/ui_notificationssettingspage.h:389 msgid "Add song year tag" msgstr "加入歌曲年份標籤" #: ../bin/src/ui_mainwindow.h:683 msgid "Add stream..." msgstr "加入網路串流..." #: internet/groovesharkservice.cpp:1087 msgid "Add to Grooveshark favorites" msgstr "加入到 Grooveshark 最愛" #: internet/groovesharkservice.cpp:1099 msgid "Add to Grooveshark playlists" msgstr "加入到 Grooveshark 播放清單" #: ui/mainwindow.cpp:1428 msgid "Add to another playlist" msgstr "加入到其他播放清單" #: ../bin/src/ui_albumcovermanager.h:218 msgid "Add to playlist" msgstr "加入播放清單" #: ../bin/src/ui_behavioursettingspage.h:220 msgid "Add to the queue" msgstr "加入到佇列中" #: ../bin/src/ui_wiimoteshortcutgrabber.h:123 msgid "Add wiimotedev action" msgstr "加入 wiimotedev 功能" #: ../bin/src/ui_transcodedialog.h:207 msgid "Add..." msgstr "加入..." #: ../bin/src/ui_libraryfilterwidget.h:95 msgid "Added this month" msgstr "本月加入" #: ../bin/src/ui_libraryfilterwidget.h:89 msgid "Added this week" msgstr "本週加入" #: ../bin/src/ui_libraryfilterwidget.h:94 msgid "Added this year" msgstr "本年加入" #: ../bin/src/ui_libraryfilterwidget.h:88 msgid "Added today" msgstr "今天加入" #: ../bin/src/ui_libraryfilterwidget.h:90 #: ../bin/src/ui_libraryfilterwidget.h:92 msgid "Added within three months" msgstr "在三個月內加入" #: internet/groovesharkservice.cpp:1394 msgid "Adding song to My Music" msgstr "" #: internet/groovesharkservice.cpp:1371 msgid "Adding song to favorites" msgstr "將歌曲新增至最愛" #: library/libraryfilterwidget.cpp:116 msgid "Advanced grouping..." msgstr "進階歸類..." #: ../bin/src/ui_podcastsettingspage.h:247 msgid "After " msgstr "" #: ../bin/src/ui_organisedialog.h:190 msgid "After copying..." msgstr "複製後 ..." #: playlist/playlist.cpp:1208 ui/organisedialog.cpp:55 #: ui/qtsystemtrayicon.cpp:252 ../bin/src/ui_groupbydialog.h:129 #: ../bin/src/ui_groupbydialog.h:142 ../bin/src/ui_groupbydialog.h:155 #: ../bin/src/ui_albumcoversearcher.h:111 #: ../bin/src/ui_albumcoversearcher.h:113 ../bin/src/ui_edittagdialog.h:686 #: ../bin/src/ui_trackselectiondialog.h:209 msgid "Album" msgstr "專輯" #: ../bin/src/ui_playbacksettingspage.h:315 msgid "Album (ideal loudness for all tracks)" msgstr "專輯 (為所有歌曲取得理想音量)" #: playlist/playlist.cpp:1214 ui/organisedialog.cpp:58 #: ../bin/src/ui_groupbydialog.h:131 ../bin/src/ui_groupbydialog.h:144 #: ../bin/src/ui_groupbydialog.h:157 ../bin/src/ui_edittagdialog.h:688 msgid "Album artist" msgstr "專輯演出者" #: ../bin/src/ui_appearancesettingspage.h:284 msgid "Album cover" msgstr "專輯封面" #: internet/jamendoservice.cpp:415 msgid "Album info on jamendo.com..." msgstr " jamendo.com上的專輯資訊..." #: ui/albumcovermanager.cpp:134 msgid "Albums with covers" msgstr "有封面的專輯" #: ui/albumcovermanager.cpp:135 msgid "Albums without covers" msgstr "無封面的專輯" #: ui/mainwindow.cpp:155 msgid "All Files (*)" msgstr "所有檔案 (*)" #: ../bin/src/ui_mainwindow.h:689 msgid "All Glory to the Hypnotoad!" msgstr "所有的榮耀歸於大蟾蜍" #: ui/albumcovermanager.cpp:133 msgid "All albums" msgstr "所有專輯" #: ui/albumcovermanager.cpp:265 msgid "All artists" msgstr "所有演出者" #: ui/albumcoverchoicecontroller.cpp:47 msgid "All files (*)" msgstr "所有檔案 (*)" #: playlistparsers/playlistparser.cpp:63 #, qt-format msgid "All playlists (%1)" msgstr "所有播放清單 (%1)" #: ui/about.cpp:74 msgid "All the translators" msgstr "所有翻譯者" #: library/library.cpp:84 msgid "All tracks" msgstr "所有曲目" #: ../bin/src/ui_networkremotesettingspage.h:194 msgid "Allow a client to download music from this computer." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:196 msgid "Allow downloads" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:140 msgid "Allow mid/side encoding" msgstr "允許 M/S (Mid/Side) 編碼技術" #: ../bin/src/ui_transcodedialog.h:215 msgid "Alongside the originals" msgstr "與原本的一起" #: ../bin/src/ui_behavioursettingspage.h:203 msgid "Always hide the main window" msgstr "總是隱藏主要視窗" #: ../bin/src/ui_behavioursettingspage.h:202 msgid "Always show the main window" msgstr "總是顯示主要視窗" #: ../bin/src/ui_behavioursettingspage.h:212 #: ../bin/src/ui_behavioursettingspage.h:226 msgid "Always start playing" msgstr "總是開始播放" #: internet/spotifyblobdownloader.cpp:60 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:61 msgid "An error occurred loading the iTunes database" msgstr "讀取 iTunes 資料時發生錯誤" #: ui/edittagdialog.cpp:663 #, qt-format msgid "An error occurred writing metadata to '%1'" msgstr "寫入目標數據至「%1」時發生錯誤" #: internet/subsonicsettingspage.cpp:103 msgid "An unspecified error occurred." msgstr "" #: ui/about.cpp:78 msgid "And:" msgstr "以及:" #: moodbar/moodbarrenderer.cpp:156 msgid "Angry" msgstr "生氣" #: ../bin/src/ui_songinfosettingspage.h:180 #: ../bin/src/ui_appearancesettingspage.h:271 msgid "Appearance" msgstr "外觀" #: core/commandlineoptions.cpp:166 msgid "Append files/URLs to the playlist" msgstr "附加檔案或網址到播放清單" #: devices/deviceview.cpp:211 globalsearch/globalsearchview.cpp:433 #: internet/internetservice.cpp:56 library/libraryview.cpp:367 #: widgets/fileviewlist.cpp:32 msgid "Append to current playlist" msgstr "附加到目前的播放清單" #: ../bin/src/ui_behavioursettingspage.h:217 msgid "Append to the playlist" msgstr "附加到播放清單" #: ../bin/src/ui_playbacksettingspage.h:318 msgid "Apply compression to prevent clipping" msgstr "使用壓縮,以防止截波失真" #: ui/equalizer.cpp:197 #, qt-format msgid "Are you sure you want to delete the \"%1\" preset?" msgstr "您確定您想要刪除預設的「%1」嗎?" #: internet/groovesharkservice.cpp:1292 msgid "Are you sure you want to delete this playlist?" msgstr "您確定要刪除這個播放清單?" #: ui/edittagdialog.cpp:769 msgid "Are you sure you want to reset this song's statistics?" msgstr "您確定要重置歌曲的統計嗎?" #: library/librarysettingspage.cpp:152 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:1207 ui/organisedialog.cpp:56 #: ui/qtsystemtrayicon.cpp:250 ../bin/src/ui_groupbydialog.h:130 #: ../bin/src/ui_groupbydialog.h:143 ../bin/src/ui_groupbydialog.h:156 #: ../bin/src/ui_albumcoversearcher.h:107 #: ../bin/src/ui_albumcoversearcher.h:109 ../bin/src/ui_edittagdialog.h:684 #: ../bin/src/ui_trackselectiondialog.h:210 #: ../bin/src/ui_lastfmstationdialog.h:96 msgid "Artist" msgstr "演出者" #: ui/mainwindow.cpp:242 msgid "Artist info" msgstr "演出者" #: internet/lastfmservice.cpp:208 msgid "Artist radio" msgstr "藝術家電台" #: songinfo/echonesttags.cpp:59 msgid "Artist tags" msgstr "演出者標籤" #: ui/organisedialog.cpp:57 msgid "Artist's initial" msgstr "演唱者簽署" #: ../bin/src/ui_transcodedialog.h:210 msgid "Audio format" msgstr "音頻格式" #: internet/digitallyimportedsettingspage.cpp:82 #: internet/magnatunesettingspage.cpp:113 internet/lastfmservice.cpp:427 #: internet/lastfmsettingspage.cpp:84 internet/ubuntuonesettingspage.cpp:75 msgid "Authentication failed" msgstr "認證失敗" #: ../bin/src/ui_podcastinfowidget.h:192 msgid "Author" msgstr "作者" #: ui/about.cpp:65 msgid "Authors" msgstr "作者" #: ../bin/src/ui_transcoderoptionsspeex.h:227 msgid "Auto" msgstr "自動" #: ../bin/src/ui_librarysettingspage.h:190 msgid "Automatic updating" msgstr "自動更新" #: ../bin/src/ui_librarysettingspage.h:208 msgid "Automatically open single categories in the library tree" msgstr "自動開啟音樂庫中的單一類型" #: widgets/freespacebar.cpp:45 msgid "Available" msgstr "可用的" #: ../bin/src/ui_transcoderoptionsspeex.h:221 msgid "Average bitrate" msgstr "平均位元率" #: covers/coversearchstatisticsdialog.cpp:70 msgid "Average image size" msgstr "平均圖片大小" #: podcasts/addpodcastdialog.cpp:80 msgid "BBC Podcasts" msgstr "BBC Podcasts" #: playlist/playlist.cpp:1225 ui/organisedialog.cpp:64 #: ../bin/src/ui_edittagdialog.h:668 msgid "BPM" msgstr "BPM" #: ../bin/src/ui_backgroundstreamssettingspage.h:56 msgid "Background Streams" msgstr "背景串流" #: ../bin/src/ui_notificationssettingspage.h:453 msgid "Background color" msgstr "背景顏色" #: ../bin/src/ui_appearancesettingspage.h:279 msgid "Background image" msgstr "背景圖片" #: ../bin/src/ui_notificationssettingspage.h:452 msgid "Background opacity" msgstr "背景不透明" #: core/database.cpp:734 msgid "Backing up database" msgstr "備份資料庫" #: ../bin/src/ui_equalizer.h:173 msgid "Balance" msgstr "" #: ../bin/src/ui_mainwindow.h:662 msgid "Ban" msgstr "禁止" #: analyzers/baranalyzer.cpp:19 msgid "Bar analyzer" msgstr "條狀分析儀" #: ../bin/src/ui_notificationssettingspage.h:456 msgid "Basic Blue" msgstr "基本的藍色" #: ../bin/src/ui_digitallyimportedsettingspage.h:167 msgid "Basic audio type" msgstr "基本音訊類型" #: ../bin/src/ui_behavioursettingspage.h:191 msgid "Behavior" msgstr "行為" #: ../bin/src/ui_transcoderoptionsflac.h:83 msgid "Best" msgstr "最佳" #: songinfo/echonestbiographies.cpp:83 #, qt-format msgid "Biography from %1" msgstr "%1的傳記" #: playlist/playlist.cpp:1226 ../bin/src/ui_edittagdialog.h:670 msgid "Bit rate" msgstr "位元率" #: ui/organisedialog.cpp:69 ../bin/src/ui_transcoderoptionsaac.h:129 #: ../bin/src/ui_transcoderoptionsmp3.h:194 #: ../bin/src/ui_transcoderoptionsopus.h:80 #: ../bin/src/ui_transcoderoptionsspeex.h:218 #: ../bin/src/ui_transcoderoptionswma.h:79 msgid "Bitrate" msgstr "位元率" #: analyzers/blockanalyzer.cpp:22 msgid "Block analyzer" msgstr "區塊分析儀" #: ../bin/src/ui_transcoderoptionsaac.h:141 msgid "Block type" msgstr "區塊型態" #: ../bin/src/ui_appearancesettingspage.h:288 msgid "Blur amount" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:449 msgid "Body" msgstr "主體" #: analyzers/boomanalyzer.cpp:8 msgid "Boom analyzer" msgstr "聲響分析儀" #: ../bin/src/ui_boxsettingspage.h:103 msgid "Box" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:146 #: ../bin/src/ui_podcastsettingspage.h:242 #: ../bin/src/ui_appearancesettingspage.h:287 msgid "Browse..." msgstr "瀏覽..." #: ../bin/src/ui_playbacksettingspage.h:327 msgid "Buffer duration" msgstr "" #: engines/gstengine.cpp:784 msgid "Buffering" msgstr "緩衝" #: ../bin/src/ui_globalsearchview.h:211 msgid "But these sources are disabled:" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:192 msgid "Buttons" msgstr "按鈕" #: core/song.cpp:339 msgid "CDDA" msgstr "CDDA" #: library/library.cpp:100 msgid "CUE sheet support" msgstr "CUE 表單支援" #: internet/spotifyblobdownloader.cpp:44 msgid "Cancel" msgstr "取消" #: ../bin/src/ui_edittagdialog.h:664 msgid "Change cover art" msgstr "更換封面圖片" #: songinfo/songinfotextview.cpp:83 msgid "Change font size..." msgstr "變更字型大小..." #: core/globalshortcuts.cpp:61 msgid "Change repeat mode" msgstr "更改重複模式" #: ../bin/src/ui_globalshortcutssettingspage.h:179 msgid "Change shortcut..." msgstr "變更快速鍵..." #: core/globalshortcuts.cpp:60 msgid "Change shuffle mode" msgstr "切換隨機模式" #: core/commandlineoptions.cpp:172 msgid "Change the language" msgstr "變更語言" #: ../bin/src/ui_playbacksettingspage.h:330 msgid "" "Changing mono playback preference will be effective for the next playing " "songs" msgstr "" #: ../bin/src/ui_podcastsettingspage.h:228 msgid "Check for new episodes" msgstr "檢查是否有新的片斷內容" #: ui/mainwindow.cpp:590 msgid "Check for updates..." msgstr "檢查更新..." #: smartplaylists/wizard.cpp:86 msgid "Choose a name for your smart playlist" msgstr "為您智慧型播放清單選擇一個名稱" #: ../bin/src/ui_playbacksettingspage.h:323 msgid "Choose automatically" msgstr "自動選擇" #: ../bin/src/ui_notificationssettingspage.h:461 msgid "Choose color..." msgstr "選擇顏色 ..." #: ../bin/src/ui_notificationssettingspage.h:462 msgid "Choose font..." msgstr "選擇字體..." #: ../bin/src/ui_visualisationselector.h:113 msgid "Choose from the list" msgstr "從清單中選擇" #: smartplaylists/querywizardplugin.cpp:155 msgid "Choose how the playlist is sorted and how many songs it will contain." msgstr "選擇此播放清單將要如何分類以及擁有多少歌曲" #: podcasts/podcastsettingspage.cpp:132 msgid "Choose podcast download directory" msgstr "選擇 podcast 下載目錄" #: ../bin/src/ui_songinfosettingspage.h:188 msgid "" "Choose the websites you want Clementine to use when searching for lyrics." msgstr "選擇您想要 Clementine 使用來搜尋歌詞的網站。" #: ui/equalizer.cpp:115 msgid "Classical" msgstr "古典" #: ../bin/src/ui_podcastsettingspage.h:243 msgid "Cleaning up" msgstr "清除" #: transcoder/transcodedialog.cpp:60 widgets/lineedit.cpp:41 #: ../bin/src/ui_queuemanager.h:139 msgid "Clear" msgstr "清除" #: ../bin/src/ui_mainwindow.h:664 ../bin/src/ui_mainwindow.h:666 msgid "Clear playlist" msgstr "清除播放清單" #: smartplaylists/searchtermwidget.cpp:329 ../bin/src/ui_mainwindow.h:647 #: visualisations/visualisationcontainer.cpp:211 #: ../bin/src/ui_visualisationoverlay.h:183 msgid "Clementine" msgstr "Clementine" #: ../bin/src/ui_errordialog.h:93 msgid "Clementine Error" msgstr "Clementine 錯誤" #: ../bin/src/ui_notificationssettingspage.h:457 msgid "Clementine Orange" msgstr "Clementine 的橘黃色" #: visualisations/visualisationcontainer.cpp:77 #: visualisations/visualisationcontainer.cpp:151 msgid "Clementine Visualization" msgstr "Clementine的視覺化效果" #: ../bin/src/ui_deviceproperties.h:376 msgid "" "Clementine can automatically convert the music you copy to this device into " "a format that it can play." msgstr "Clementine 可以自動轉換您複製到這個裝置的音樂為它可以播放的格式。" #: ../bin/src/ui_boxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Box" msgstr "" #: ../bin/src/ui_dropboxsettingspage.h:104 msgid "Clementine can play music that you have uploaded to Dropbox" msgstr "" #: ../bin/src/ui_googledrivesettingspage.h:104 msgid "Clementine can play music that you have uploaded to Google Drive" msgstr "Clementine 可以播放您已經上傳到Google 雲端硬碟的音樂" #: ../bin/src/ui_ubuntuonesettingspage.h:128 msgid "Clementine can play music that you have uploaded to Ubuntu One" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:431 msgid "Clementine can show a message when the track changes." msgstr "當曲目變更時,Clementine 可以顯示一個訊息。" #: ../bin/src/ui_podcastsettingspage.h:250 msgid "" "Clementine can synchronize your subscription list with your other computers " "and podcast applications. Create " "an account." msgstr "Clementine 可以和您的其它電腦及 podcast 應用程式同步訂閱清單。建立一個帳戶。" #: visualisations/projectmvisualisation.cpp:128 msgid "" "Clementine could not load any projectM visualisations. Check that you have " "installed Clementine properly." msgstr "Clementine 無法載入任何 ProjectM 視覺化工具。\n請檢查是否正確安裝 Clementine。" #: internet/lastfmsettingspage.cpp:110 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 "Clementine 無法擷取的訂閱情形自從連結問題出現。被播放的音軌將會被保留快取並稍後送至Last.fm。" #: widgets/prettyimage.cpp:201 msgid "Clementine image viewer" msgstr "Clementine 圖片檢視器" #: ../bin/src/ui_trackselectiondialog.h:206 msgid "Clementine was unable to find results for this file" msgstr "Clementine 無法搜尋到任何符合此檔案的結果" #: ../bin/src/ui_globalsearchview.h:210 msgid "Clementine will find music in:" msgstr "" #: library/libraryview.cpp:349 msgid "Click here to add some music" msgstr "點擊此處加入一些音樂" #: playlist/playlisttabbar.cpp:293 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:72 msgid "Click to toggle between remaining time and total time" msgstr "點擊以切換剩餘時間/全部時間" #: ../bin/src/ui_googledrivesettingspage.h:106 #: ../bin/src/ui_dropboxsettingspage.h:106 ../bin/src/ui_boxsettingspage.h:106 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:54 msgid "Close playlist" msgstr "" #: visualisations/visualisationcontainer.cpp:127 msgid "Close visualization" msgstr "關閉視覺化效果" #: internet/magnatunedownloaddialog.cpp:280 msgid "Closing this window will cancel the download." msgstr "關閉此視窗將取消下載." #: ui/albumcovermanager.cpp:216 msgid "Closing this window will stop searching for album covers." msgstr "關閉此視窗將停止搜尋專輯封面." #: ui/equalizer.cpp:116 msgid "Club" msgstr "俱樂部" #: ../bin/src/ui_appearancesettingspage.h:272 msgid "Colors" msgstr "顏色" #: core/commandlineoptions.cpp:175 msgid "Comma separated list of class:level, level is 0-3" msgstr "用逗號化分類別清單:等級為0-3" #: playlist/playlist.cpp:1235 smartplaylists/searchterm.cpp:288 #: ui/organisedialog.cpp:67 ../bin/src/ui_edittagdialog.h:694 msgid "Comment" msgstr "評論" #: ../bin/src/ui_edittagdialog.h:693 msgid "Complete tags automatically" msgstr "標籤完全自動分類" #: ../bin/src/ui_mainwindow.h:716 msgid "Complete tags automatically..." msgstr "標籤完全自動分類..." #: playlist/playlist.cpp:1215 ui/organisedialog.cpp:59 #: ../bin/src/ui_groupbydialog.h:132 ../bin/src/ui_groupbydialog.h:145 #: ../bin/src/ui_groupbydialog.h:158 ../bin/src/ui_edittagdialog.h:689 msgid "Composer" msgstr "作曲家" #: internet/searchboxwidget.cpp:42 #, qt-format msgid "Configure %1..." msgstr "" #: internet/groovesharkservice.cpp:552 msgid "Configure Grooveshark..." msgstr "設定 Grooveshark..." #: internet/lastfmservice.cpp:126 msgid "Configure Last.fm..." msgstr "設定 Last.fm..." #: internet/magnatuneservice.cpp:280 msgid "Configure Magnatune..." msgstr "設定 Magnatune ..." #: ../bin/src/ui_globalshortcutssettingspage.h:167 msgid "Configure Shortcuts" msgstr "設定快速鍵" #: internet/spotifyservice.cpp:526 internet/spotifyservice.cpp:538 msgid "Configure Spotify..." msgstr "設定 Spotify..." #: internet/subsonicservice.cpp:96 msgid "Configure Subsonic..." msgstr "" #: globalsearch/globalsearchview.cpp:140 globalsearch/globalsearchview.cpp:446 msgid "Configure global search..." msgstr "" #: ui/mainwindow.cpp:472 msgid "Configure library..." msgstr "設定音樂庫" #: podcasts/addpodcastdialog.cpp:67 podcasts/podcastservice.cpp:288 msgid "Configure podcasts..." msgstr "設定 podcasts..." #: internet/digitallyimportedservicebase.cpp:186 #: ../bin/src/ui_globalsearchsettingspage.h:150 #: internet/googledriveservice.cpp:193 msgid "Configure..." msgstr "設定..." #: ../bin/src/ui_wiimotesettingspage.h:186 msgid "Connect Wii Remotes using active/deactive action" msgstr "連結 Wii 遙控器可以使用「作用」/「取消作用」的行動" #: devices/devicemanager.cpp:323 devices/devicemanager.cpp:327 msgid "Connect device" msgstr "連接裝置" #: internet/spotifyservice.cpp:253 msgid "Connecting to Spotify" msgstr "連接到 Spotify" #: internet/subsonicsettingspage.cpp:107 msgid "" "Connection refused by server, check server URL. Example: " "http://localhost:4040/" msgstr "" #: internet/subsonicsettingspage.cpp:117 msgid "" "Connection timed out, check server URL. Example: http://localhost:4040/" msgstr "" #: ../bin/src/ui_console.h:80 ../bin/src/ui_mainwindow.h:692 msgid "Console" msgstr "" #: ../bin/src/ui_transcoderoptionsmp3.h:196 msgid "Constant bitrate" msgstr "恆定位元率" #: ../bin/src/ui_deviceproperties.h:379 msgid "Convert all music" msgstr "轉換所有音樂" #: ../bin/src/ui_deviceproperties.h:378 msgid "Convert any music that the device can't play" msgstr "轉換任何裝置無法播放的音樂" #: internet/groovesharkservice.cpp:1172 msgid "Copy to clipboard" msgstr "複製到剪貼簿" #: library/libraryview.cpp:389 ui/mainwindow.cpp:506 #: widgets/fileviewlist.cpp:44 msgid "Copy to device..." msgstr "複製到裝置..." #: devices/deviceview.cpp:218 ui/mainwindow.cpp:503 #: widgets/fileviewlist.cpp:39 msgid "Copy to library..." msgstr "複製到音樂庫" #: ../bin/src/ui_podcastinfowidget.h:194 msgid "Copyright" msgstr "著作權" #: internet/subsonicsettingspage.cpp:81 msgid "" "Could not connect to Subsonic, check server URL. Example: " "http://localhost:4040/" msgstr "" #: transcoder/transcoder.cpp:64 #, qt-format msgid "" "Could not create the GStreamer element \"%1\" - make sure you have all the " "required GStreamer plugins installed" msgstr "無法建立 GStreamer 元件「%1」- 請確認您安裝了所有需要的GStreamer外掛。" #: transcoder/transcoder.cpp:432 #, qt-format msgid "" "Couldn't find a muxer for %1, check you have the correct GStreamer plugins " "installed" msgstr "無法為%1找到混合器,請確認已正確安裝 GStreamer 外掛。" #: transcoder/transcoder.cpp:426 #, qt-format msgid "" "Couldn't find an encoder for %1, check you have the correct GStreamer " "plugins installed" msgstr "無法找到%1的解碼器,請確認已正確安裝 GStreamer 外掛。" #: internet/lastfmservice.cpp:875 msgid "Couldn't load the last.fm radio station" msgstr "無法載入 last.fm 廣播電台" #: internet/magnatunedownloaddialog.cpp:203 #, qt-format msgid "Couldn't open output file %1" msgstr "無法開啟輸出檔 %1" #: internet/cloudfileservice.cpp:88 ../bin/src/ui_albumcovermanager.h:215 #: ../bin/src/ui_albumcoversearcher.h:105 ../bin/src/ui_mainwindow.h:687 #: internet/googledriveservice.cpp:189 msgid "Cover Manager" msgstr "封面管理員" #: ui/edittagdialog.cpp:443 msgid "Cover art from embedded image" msgstr "從嵌入式影像取得封面圖片" #: ui/edittagdialog.cpp:445 #, qt-format msgid "Cover art loaded automatically from %1" msgstr "封面圖片自動從 %1 載入" #: ui/edittagdialog.cpp:438 msgid "Cover art manually unset" msgstr "手動取消設置封面圖片" #: ui/edittagdialog.cpp:447 msgid "Cover art not set" msgstr "封面圖片未設置" #: ui/edittagdialog.cpp:441 #, qt-format msgid "Cover art set from %1" msgstr "從 %1 取得封面圖片" #: covers/coversearchstatisticsdialog.cpp:60 ui/albumcoversearcher.cpp:106 #, qt-format msgid "Covers from %1" msgstr "來自 %1 的封面" #: internet/groovesharkservice.cpp:520 internet/groovesharkservice.cpp:1244 msgid "Create a new Grooveshark playlist" msgstr "建立一個新的 Grooveshark 播放清單" #: ../bin/src/ui_playbacksettingspage.h:302 msgid "Cross-fade when changing tracks automatically" msgstr "當自動改變曲目時,聲音同時淡出及淡入" #: ../bin/src/ui_playbacksettingspage.h:301 msgid "Cross-fade when changing tracks manually" msgstr "當手動改變曲目時,聲音同時淡出及淡入" #: ../bin/src/ui_mainwindow.h:659 msgid "Ctrl+Alt+V" msgstr "Ctrl+Alt+V" #: ../bin/src/ui_mainwindow.h:663 msgid "Ctrl+B" msgstr "Ctrl+B" #: ../bin/src/ui_queuemanager.h:133 msgid "Ctrl+Down" msgstr "Ctrl+Down" #: ../bin/src/ui_mainwindow.h:670 msgid "Ctrl+E" msgstr "Ctrl+E" #: ../bin/src/ui_mainwindow.h:680 msgid "Ctrl+H" msgstr "Ctrl+H" #: ../bin/src/ui_mainwindow.h:700 msgid "Ctrl+J" msgstr "Ctrl+J" #: ../bin/src/ui_queuemanager.h:141 ../bin/src/ui_mainwindow.h:668 msgid "Ctrl+K" msgstr "Ctrl+K" #: ../bin/src/ui_mainwindow.h:661 msgid "Ctrl+L" msgstr "Ctrl+L" #: ../bin/src/ui_mainwindow.h:714 msgid "Ctrl+M" msgstr "Ctrl+M" #: ../bin/src/ui_mainwindow.h:702 msgid "Ctrl+N" msgstr "Ctrl+N" #: ../bin/src/ui_mainwindow.h:684 msgid "Ctrl+O" msgstr "Ctrl+O" #: ../bin/src/ui_mainwindow.h:676 msgid "Ctrl+P" msgstr "Ctrl+P" #: ../bin/src/ui_mainwindow.h:657 msgid "Ctrl+Q" msgstr "Ctrl+Q" #: ../bin/src/ui_mainwindow.h:704 msgid "Ctrl+S" msgstr "Ctrl+S" #: ../bin/src/ui_mainwindow.h:682 msgid "Ctrl+Shift+A" msgstr "Ctrl+Shift+A" #: ../bin/src/ui_mainwindow.h:706 msgid "Ctrl+Shift+O" msgstr "Ctrl+Shift+O" #: ../bin/src/ui_mainwindow.h:725 msgid "Ctrl+Shift+T" msgstr "" #: ../bin/src/ui_mainwindow.h:717 msgid "Ctrl+T" msgstr "Ctrl+T" #: ../bin/src/ui_queuemanager.h:129 msgid "Ctrl+Up" msgstr "Ctrl+Up" #: ui/equalizer.cpp:114 ../bin/src/ui_lastfmstationdialog.h:98 msgid "Custom" msgstr "自訂" #: ../bin/src/ui_appearancesettingspage.h:286 msgid "Custom image:" msgstr "自訂圖片:" #: ../bin/src/ui_notificationssettingspage.h:444 msgid "Custom message settings" msgstr "自訂訊息設定" #: internet/lastfmservice.cpp:216 msgid "Custom radio" msgstr "自訂電台" #: ../bin/src/ui_notificationssettingspage.h:458 msgid "Custom..." msgstr "自訂..." #: devices/devicekitlister.cpp:123 msgid "DBus path" msgstr "DBus 路徑" #: ui/equalizer.cpp:117 msgid "Dance" msgstr "舞蹈" #: core/database.cpp:688 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:1233 ../bin/src/ui_edittagdialog.h:679 msgid "Date created" msgstr "創建的日期" #: playlist/playlist.cpp:1232 ../bin/src/ui_edittagdialog.h:678 msgid "Date modified" msgstr "修改的日期" #: smartplaylists/searchterm.cpp:311 msgid "Days" msgstr "天" #: ../bin/src/ui_globalshortcutssettingspage.h:177 msgid "De&fault" msgstr "預設(&F)" #: core/commandlineoptions.cpp:159 msgid "Decrease the volume by 4%" msgstr "減低音量4%" #: core/commandlineoptions.cpp:161 msgid "Decrease the volume by percent" msgstr "" #: core/globalshortcuts.cpp:53 wiimotedev/wiimotesettingspage.cpp:104 msgid "Decrease volume" msgstr "減低音量" #: ../bin/src/ui_appearancesettingspage.h:280 msgid "Default background image" msgstr "預設的背景圖片" #: ../bin/src/ui_wiimotesettingspage.h:195 msgid "Defaults" msgstr "預設" #: ../bin/src/ui_visualisationselector.h:115 msgid "Delay between visualizations" msgstr "在兩個視覺化效果間延遲切換" #: playlist/playlistlistcontainer.cpp:73 #: ../bin/src/ui_playlistlistcontainer.h:131 msgid "Delete" msgstr "" #: internet/groovesharkservice.cpp:523 internet/groovesharkservice.cpp:1291 msgid "Delete Grooveshark playlist" msgstr "刪除 Grooveshark 播放清單" #: podcasts/podcastservice.cpp:274 msgid "Delete downloaded data" msgstr "刪除下載的資料" #: devices/deviceview.cpp:388 library/libraryview.cpp:608 #: ui/mainwindow.cpp:1905 widgets/fileview.cpp:187 msgid "Delete files" msgstr "刪除檔案" #: devices/deviceview.cpp:220 msgid "Delete from device..." msgstr "從裝置中刪除..." #: library/libraryview.cpp:391 ui/mainwindow.cpp:507 #: widgets/fileviewlist.cpp:45 msgid "Delete from disk..." msgstr "從硬碟中刪除 ..." #: ../bin/src/ui_podcastsettingspage.h:244 msgid "Delete played episodes" msgstr "刪除播放過的片斷內容" #: ui/equalizer.cpp:196 ../bin/src/ui_equalizer.h:169 msgid "Delete preset" msgstr "刪除預設" #: library/libraryview.cpp:383 msgid "Delete smart playlist" msgstr "刪除智慧型播放清單" #: ../bin/src/ui_organisedialog.h:194 msgid "Delete the original files" msgstr "刪除原本的檔案" #: core/deletefiles.cpp:50 msgid "Deleting files" msgstr "檔案刪除中" #: ui/mainwindow.cpp:1363 msgid "Dequeue selected tracks" msgstr "將選取的歌曲移出佇列中" #: ui/mainwindow.cpp:1361 msgid "Dequeue track" msgstr "將歌曲移出佇列中" #: ../bin/src/ui_transcodedialog.h:212 ../bin/src/ui_organisedialog.h:189 msgid "Destination" msgstr "目的地" #: ../bin/src/ui_transcodedialog.h:218 msgid "Details..." msgstr "詳情..." #: devices/devicekitlister.cpp:126 devices/giolister.cpp:160 msgid "Device" msgstr "裝置" #: ../bin/src/ui_deviceproperties.h:368 msgid "Device Properties" msgstr "裝置屬性" #: ../bin/src/ui_podcastsettingspage.h:254 msgid "Device name" msgstr "裝置名稱" #: devices/deviceview.cpp:207 msgid "Device properties..." msgstr "裝置屬性..." #: ui/mainwindow.cpp:239 msgid "Devices" msgstr "裝置" #: widgets/didyoumean.cpp:55 msgid "Did you mean" msgstr "您的意思是" #: ../bin/src/ui_digitallyimportedsettingspage.h:160 msgid "Digitally Imported" msgstr "Digitally Imported" #: ../bin/src/ui_digitallyimportedsettingspage.h:164 msgid "Digitally Imported password" msgstr "Digitally Imported 密碼" #: ../bin/src/ui_digitallyimportedsettingspage.h:162 msgid "Digitally Imported username" msgstr "Digitally Imported 帳號" #: ../bin/src/ui_networkproxysettingspage.h:159 msgid "Direct internet connection" msgstr "直接連接到網際網路" #: ../bin/src/ui_magnatunedownloaddialog.h:145 #: ../bin/src/ui_transcodedialog.h:205 msgid "Directory" msgstr "目錄" #: ../bin/src/ui_notificationssettingspage.h:440 msgid "Disable duration" msgstr "禁用期限" #: ../bin/src/ui_appearancesettingspage.h:296 msgid "Disable moodbar generation" msgstr "" #: globalsearch/searchproviderstatuswidget.cpp:47 #: ../bin/src/ui_notificationssettingspage.h:433 msgid "Disabled" msgstr "停用" #: playlist/playlist.cpp:1211 ui/organisedialog.cpp:63 #: ../bin/src/ui_edittagdialog.h:685 msgid "Disc" msgstr "唱片" #: ../bin/src/ui_transcoderoptionsspeex.h:234 msgid "Discontinuous transmission" msgstr "不連續傳送" #: internet/icecastfilterwidget.cpp:33 internet/searchboxwidget.cpp:30 #: library/libraryfilterwidget.cpp:88 ../bin/src/ui_librarysettingspage.h:207 msgid "Display options" msgstr "顯示選項" #: core/commandlineoptions.cpp:170 msgid "Display the on-screen-display" msgstr "顯示螢幕上的顯示" #: ../bin/src/ui_mainwindow.h:715 msgid "Do a full library rescan" msgstr "做一個完整的音樂庫重新掃描" #: ../bin/src/ui_deviceproperties.h:377 msgid "Do not convert any music" msgstr "沒有轉換任何音樂" #: ../bin/src/ui_albumcoverexport.h:209 msgid "Do not overwrite" msgstr "" #: widgets/osd.cpp:286 ../bin/src/ui_playlistsequence.h:103 msgid "Don't repeat" msgstr "不要循環播放" #: library/libraryview.cpp:405 msgid "Don't show in various artists" msgstr "不要顯示不同的演出者" #: widgets/osd.cpp:273 ../bin/src/ui_playlistsequence.h:107 msgid "Don't shuffle" msgstr "不要隨機播放" #: internet/magnatunedownloaddialog.cpp:282 ui/albumcovermanager.cpp:218 msgid "Don't stop!" msgstr "不要停止!" #: internet/somafmservice.cpp:103 msgid "Donate" msgstr "" #: devices/deviceview.cpp:115 msgid "Double click to open" msgstr "雙擊打開" #: ../bin/src/ui_behavioursettingspage.h:214 msgid "Double clicking a song will..." msgstr "雙擊一首歌曲將..." #: podcasts/podcastservice.cpp:350 #, c-format msgid "Download %n episodes" msgstr "下載 %n 片斷內容" #: internet/magnatunedownloaddialog.cpp:252 msgid "Download directory" msgstr "下載目錄" #: ../bin/src/ui_podcastsettingspage.h:240 msgid "Download episodes to" msgstr "下載片斷內容到" #: ../bin/src/ui_magnatunesettingspage.h:161 msgid "Download membership" msgstr "下載會員" #: ../bin/src/ui_podcastsettingspage.h:241 msgid "Download new episodes automatically" msgstr "自動下載新的片斷內容" #: podcasts/podcastservice.cpp:187 msgid "Download queued" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:202 msgid "Download the Android app" msgstr "" #: internet/magnatuneservice.cpp:276 msgid "Download this album" msgstr "下載此專輯" #: internet/jamendoservice.cpp:417 msgid "Download this album..." msgstr "下載此專輯..." #: podcasts/podcastservice.cpp:352 msgid "Download this episode" msgstr "下載這個片斷內容" #: ../bin/src/ui_spotifysettingspage.h:215 msgid "Download..." msgstr "下載..." #: podcasts/podcastservice.cpp:195 #, qt-format msgid "Downloading (%1%)..." msgstr "" #: internet/icecastservice.cpp:101 msgid "Downloading Icecast directory" msgstr "下載 Icecast 目錄中" #: internet/jamendoservice.cpp:187 msgid "Downloading Jamendo catalogue" msgstr "下載 Jamendo 目錄中" #: internet/magnatuneservice.cpp:158 msgid "Downloading Magnatune catalogue" msgstr "下載 Magnatune 目錄中" #: internet/spotifyblobdownloader.cpp:44 msgid "Downloading Spotify plugin" msgstr "下載 Spotify 插件中" #: musicbrainz/tagfetcher.cpp:102 msgid "Downloading metadata" msgstr "下載詮釋資料中" #: ui/notificationssettingspage.cpp:37 msgid "Drag to reposition" msgstr "拖曳以重新定位" #: ../bin/src/ui_dropboxsettingspage.h:103 msgid "Dropbox" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:109 msgid "Dynamic mode is on" msgstr "動態模式開啟" #: internet/jamendoservice.cpp:113 library/library.cpp:93 msgid "Dynamic random mix" msgstr "動態隨機混合" #: library/libraryview.cpp:381 msgid "Edit smart playlist..." msgstr "編輯智慧型播放清單..." #: ui/mainwindow.cpp:1396 #, qt-format msgid "Edit tag \"%1\"..." msgstr "編輯標籤「%1」..." #: ../bin/src/ui_mainwindow.h:673 msgid "Edit tag..." msgstr "編輯標籤 ..." #: ../bin/src/ui_edittagdialog.h:695 msgid "Edit tags" msgstr "編輯標籤" #: ../bin/src/ui_edittagdialog.h:662 msgid "Edit track information" msgstr "編輯歌曲資訊" #: library/libraryview.cpp:395 widgets/fileviewlist.cpp:50 #: ../bin/src/ui_mainwindow.h:669 msgid "Edit track information..." msgstr "編輯歌曲資訊..." #: library/libraryview.cpp:397 msgid "Edit tracks information..." msgstr "編輯音軌資訊..." #: internet/savedradio.cpp:101 msgid "Edit..." msgstr "編輯..." #: ../bin/src/ui_wiimotesettingspage.h:183 msgid "Enable Wii Remote support" msgstr "啟用 Wii 遙控器的支持" #: ../bin/src/ui_equalizer.h:171 msgid "Enable equalizer" msgstr "啟用等化器" #: ../bin/src/ui_wiimotesettingspage.h:187 msgid "Enable shortcuts only when Clementine is focused" msgstr "只在 Clemetine 是處於聚焦時才啟用快捷鍵" #: ../bin/src/ui_globalsearchsettingspage.h:147 msgid "" "Enable sources below to include them in search results. Results will be " "displayed in this order." msgstr "" #: core/globalshortcuts.cpp:62 msgid "Enable/disable Last.fm scrobbling" msgstr "啟用/停用 Last.fm scrobbling" #: ../bin/src/ui_transcoderoptionsspeex.h:235 msgid "Encoding complexity" msgstr "編碼複雜度" #: ../bin/src/ui_transcoderoptionsmp3.h:197 msgid "Encoding engine quality" msgstr "編碼引擎品質" #: ../bin/src/ui_transcoderoptionsspeex.h:224 msgid "Encoding mode" msgstr "編碼模式" #: ../bin/src/ui_addpodcastbyurl.h:76 msgid "Enter a URL" msgstr "輸入網址" #: ../bin/src/ui_coverfromurldialog.h:103 msgid "Enter a URL to download a cover from the Internet:" msgstr "輸入網址,從網路中取得封面" #: ../bin/src/ui_albumcoverexport.h:205 msgid "Enter a filename for exported covers (no extension):" msgstr "" #: playlist/playlisttabbar.cpp:137 msgid "Enter a new name for this playlist" msgstr "為這個播放清單輸入新的名稱" #: ../bin/src/ui_lastfmstationdialog.h:93 msgid "" "Enter an artist or tag to start listening to Last.fm radio." msgstr "輸入一個 演出者標籤 以開始收聽 Last.fm 電台." #: ../bin/src/ui_globalsearchview.h:209 msgid "" "Enter search terms above to find music on your computer and on the internet" msgstr "" #: ../bin/src/ui_itunessearchpage.h:77 msgid "Enter search terms below to find podcasts in the iTunes Store" msgstr "" #: ../bin/src/ui_gpoddersearchpage.h:77 msgid "Enter search terms below to find podcasts on gpodder.net" msgstr "在 gpodder.net 上,輸入下面搜尋字詞以尋找 podcasts " #: ../bin/src/ui_libraryfilterwidget.h:96 #: ../bin/src/ui_albumcovermanager.h:219 msgid "Enter search terms here" msgstr "在這裡輸入搜尋字詞" #: ../bin/src/ui_addstreamdialog.h:114 msgid "Enter the URL of an internet radio stream:" msgstr "輸入網路廣播串流的網址(URL):" #: playlist/playlistlistcontainer.cpp:171 msgid "Enter the name of the folder" msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:198 msgid "Enter this IP in the App to connect to Clementine." msgstr "" #: ../bin/src/ui_libraryfilterwidget.h:87 msgid "Entire collection" msgstr "整個收藏" #: ../bin/src/ui_equalizer.h:163 ../bin/src/ui_mainwindow.h:696 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/groovesharkservice.cpp:1017 #: internet/magnatunedownloaddialog.cpp:225 library/libraryview.cpp:602 #: ui/mainwindow.cpp:1857 ui/mainwindow.cpp:1973 msgid "Error" msgstr "錯誤" #: devices/mtploader.cpp:56 msgid "Error connecting MTP device" msgstr "連接 MTP 裝置錯誤" #: ui/organiseerrordialog.cpp:55 msgid "Error copying songs" msgstr "複製歌曲錯誤" #: ui/organiseerrordialog.cpp:60 msgid "Error deleting songs" msgstr "刪除歌曲錯誤" #: internet/spotifyblobdownloader.cpp:215 msgid "Error downloading Spotify plugin" msgstr "下載 Spotify 插件出現錯誤" #: playlist/songloaderinserter.cpp:71 playlist/songloaderinserter.cpp:133 #, qt-format msgid "Error loading %1" msgstr "錯誤載入 %1" #: internet/digitallyimportedservicebase.cpp:203 #: internet/digitallyimportedurlhandler.cpp:89 msgid "Error loading di.fm playlist" msgstr "載入 di.fm 播放清單錯誤" #: transcoder/transcoder.cpp:399 #, qt-format msgid "Error processing %1: %2" msgstr "處理 %1 錯誤: %2" #: playlist/songloaderinserter.cpp:100 msgid "Error while loading audio CD" msgstr "載入音樂CD時,出現錯誤" #: library/library.cpp:63 msgid "Ever played" msgstr "曾經播放的" #: ../bin/src/ui_podcastsettingspage.h:232 msgid "Every 10 minutes" msgstr "每隔10分鐘" #: ../bin/src/ui_podcastsettingspage.h:238 msgid "Every 12 hours" msgstr "每隔12小時" #: ../bin/src/ui_podcastsettingspage.h:236 msgid "Every 2 hours" msgstr "每隔二小時" #: ../bin/src/ui_podcastsettingspage.h:233 msgid "Every 20 minutes" msgstr "每隔20分鐘" #: ../bin/src/ui_podcastsettingspage.h:234 msgid "Every 30 minutes" msgstr "每隔30分鐘" #: ../bin/src/ui_podcastsettingspage.h:237 msgid "Every 6 hours" msgstr "每隔六小時" #: ../bin/src/ui_podcastsettingspage.h:235 msgid "Every hour" msgstr "每隔一小時" #: ../bin/src/ui_playbacksettingspage.h:303 msgid "Except between tracks on the same album or in the same CUE sheet" msgstr "除非是在相同專輯或是CUE表單的歌曲之間" #: ../bin/src/ui_albumcoverexport.h:208 msgid "Existing covers" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:111 msgid "Expand" msgstr "" #: widgets/loginstatewidget.cpp:142 #, qt-format msgid "Expires on %1" msgstr "" #: ../bin/src/ui_albumcovermanager.h:226 msgid "Export Covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:203 msgid "Export covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:206 msgid "Export downloaded covers" msgstr "" #: ../bin/src/ui_albumcoverexport.h:207 msgid "Export embedded covers" msgstr "" #: ui/albumcovermanager.cpp:777 ui/albumcovermanager.cpp:801 msgid "Export finished" msgstr "" #: ui/albumcovermanager.cpp:786 #, qt-format msgid "Exported %1 covers out of %2 (%3 skipped)" msgstr "" #: ../bin/src/ui_mainwindow.h:678 msgid "F1" msgstr "F1" #: ../bin/src/ui_mainwindow.h:674 msgid "F2" msgstr "F2" #: ../bin/src/ui_mainwindow.h:649 msgid "F5" msgstr "F5" #: ../bin/src/ui_mainwindow.h:651 msgid "F6" msgstr "F6" #: ../bin/src/ui_mainwindow.h:653 msgid "F7" msgstr "F7" #: ../bin/src/ui_mainwindow.h:655 msgid "F8" msgstr "F8" #: ../bin/src/ui_magnatunedownloaddialog.h:140 #: ../bin/src/ui_magnatunesettingspage.h:171 #: ../bin/src/ui_transcodersettingspage.h:177 msgid "FLAC" msgstr "FLAC" #: ../bin/src/ui_playbacksettingspage.h:306 msgid "Fade out on pause / fade in on resume" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:300 msgid "Fade out when stopping a track" msgstr "當停播一首歌時,聲音逐漸淡出" #: ../bin/src/ui_playbacksettingspage.h:299 msgid "Fading" msgstr "淡出" #: ../bin/src/ui_playbacksettingspage.h:304 #: ../bin/src/ui_playbacksettingspage.h:307 msgid "Fading duration" msgstr "淡出持續時間" #: podcasts/gpoddertoptagspage.cpp:76 msgid "Failed to fetch directory" msgstr "" #: podcasts/gpoddersearchpage.cpp:76 podcasts/gpoddertoptagsmodel.cpp:109 #: podcasts/itunessearchpage.cpp:66 podcasts/itunessearchpage.cpp:75 #: podcasts/itunessearchpage.cpp:82 msgid "Failed to fetch podcasts" msgstr "" #: podcasts/addpodcastbyurl.cpp:70 podcasts/fixedopmlpage.cpp:54 msgid "Failed to load podcast" msgstr "無法載入 podcast" #: podcasts/podcasturlloader.cpp:167 msgid "Failed to parse the XML for this RSS feed" msgstr "" #: ../bin/src/ui_transcoderoptionsflac.h:82 #: ../bin/src/ui_transcoderoptionsmp3.h:200 msgid "Fast" msgstr "快速" #: internet/groovesharkservice.cpp:617 msgid "Favorites" msgstr "我的最愛" #: library/library.cpp:77 msgid "Favourite tracks" msgstr "最喜愛的歌曲" #: ../bin/src/ui_albumcovermanager.h:225 msgid "Fetch Missing Covers" msgstr "取得缺少的封面" #: ../bin/src/ui_albumcovermanager.h:216 msgid "Fetch automatically" msgstr "自動取得" #: ../bin/src/ui_coversearchstatisticsdialog.h:75 msgid "Fetch completed" msgstr "取得完成" #: internet/subsonicservice.cpp:241 msgid "Fetching Subsonic library" msgstr "" #: ui/coverfromurldialog.cpp:71 ui/coverfromurldialog.cpp:82 msgid "Fetching cover error" msgstr "取得封面出錯" #: ui/organisedialog.cpp:71 msgid "File extension" msgstr "副檔名" #: ../bin/src/ui_deviceproperties.h:384 msgid "File formats" msgstr "檔案格式" #: playlist/playlist.cpp:1228 ../bin/src/ui_edittagdialog.h:680 msgid "File name" msgstr "檔名" #: playlist/playlist.cpp:1229 msgid "File name (without path)" msgstr "檔名(不含路徑)" #: playlist/playlist.cpp:1230 ../bin/src/ui_edittagdialog.h:674 msgid "File size" msgstr "檔案大小" #: playlist/playlist.cpp:1231 ../bin/src/ui_groupbydialog.h:133 #: ../bin/src/ui_groupbydialog.h:146 ../bin/src/ui_groupbydialog.h:159 #: ../bin/src/ui_edittagdialog.h:676 msgid "File type" msgstr "檔案型態" #: ../bin/src/ui_transcodedialog.h:206 msgid "Filename" msgstr "檔名" #: ui/mainwindow.cpp:236 msgid "Files" msgstr "檔案" #: ../bin/src/ui_transcodedialog.h:203 msgid "Files to transcode" msgstr "要轉碼的檔案" #: smartplaylists/querywizardplugin.cpp:90 msgid "Find songs in your library that match the criteria you specify." msgstr "在您的歌曲庫裡找到符合您指定的歌曲。" #: musicbrainz/tagfetcher.cpp:55 msgid "Fingerprinting song" msgstr "指紋歌曲" #: smartplaylists/wizard.cpp:85 msgid "Finish" msgstr "完成" #: ../bin/src/ui_groupbydialog.h:125 msgid "First level" msgstr "第一層次" #: core/song.cpp:328 msgid "Flac" msgstr "Flac" #: ../bin/src/ui_songinfosettingspage.h:181 msgid "Font size" msgstr "字型大小" #: ../bin/src/ui_spotifysettingspage.h:213 msgid "For licensing reasons Spotify support is in a separate plugin." msgstr "由於許可證的原因,Spotify 支援是在一個獨立的插件中。" #: ../bin/src/ui_transcoderoptionsmp3.h:204 msgid "Force mono encoding" msgstr "強制單聲道編碼" #: devices/deviceview.cpp:204 devices/deviceview.cpp:310 #: devices/deviceview.cpp:314 msgid "Forget device" msgstr "忘記裝置" #: devices/deviceview.cpp:311 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_searchproviderstatuswidget.h:94 #: ../bin/src/ui_suggestionwidget.h:70 ../bin/src/ui_icecastfilterwidget.h:74 #: ../bin/src/ui_internetviewcontainer.h:71 ../bin/src/ui_searchboxwidget.h:62 #: ../bin/src/ui_libraryfilterwidget.h:86 #: ../bin/src/ui_libraryviewcontainer.h:59 #: ../bin/src/ui_playlistcontainer.h:143 #: ../bin/src/ui_playlistlistcontainer.h:126 #: ../bin/src/ui_podcastinfowidget.h:191 ../bin/src/ui_querysearchpage.h:112 #: ../bin/src/ui_querysortpage.h:136 ../bin/src/ui_searchpreview.h:104 #: ../bin/src/ui_searchtermwidget.h:268 ../bin/src/ui_wizardfinishpage.h:83 #: ../bin/src/ui_songkickconcertwidget.h:100 #: ../bin/src/ui_transcoderoptionsaac.h:128 #: ../bin/src/ui_transcoderoptionsflac.h:80 #: ../bin/src/ui_transcoderoptionsmp3.h:190 #: ../bin/src/ui_transcoderoptionsopus.h:79 #: ../bin/src/ui_transcoderoptionsspeex.h:216 #: ../bin/src/ui_transcoderoptionsvorbis.h:201 #: ../bin/src/ui_transcoderoptionswma.h:78 ../bin/src/ui_equalizerslider.h:82 #: ../bin/src/ui_fileview.h:107 ../bin/src/ui_loginstatewidget.h:171 #: ../bin/src/ui_trackslider.h:69 ../bin/src/ui_visualisationoverlay.h:182 msgid "Form" msgstr "表格" #: ../bin/src/ui_magnatunedownloaddialog.h:136 msgid "Format" msgstr "格式" #: analyzers/analyzercontainer.cpp:46 #: visualisations/visualisationcontainer.cpp:104 msgid "Framerate" msgstr "畫面更新率" #: ../bin/src/ui_transcoderoptionsspeex.h:236 msgid "Frames per buffer" msgstr "幀/每段緩衝" #: internet/lastfmservice.cpp:224 msgid "Friends" msgstr "好友" #: moodbar/moodbarrenderer.cpp:157 msgid "Frozen" msgstr "" #: ui/equalizer.cpp:118 msgid "Full Bass" msgstr "全部低音" #: ui/equalizer.cpp:120 msgid "Full Bass + Treble" msgstr "全部低音+高音" #: ui/equalizer.cpp:119 msgid "Full Treble" msgstr "全部高音" #: ../bin/src/ui_playbacksettingspage.h:319 msgid "GStreamer audio engine" msgstr "GStreamer 的音訊引擎" #: ui/settingsdialog.cpp:133 msgid "General" msgstr "一般" #: ../bin/src/ui_notificationssettingspage.h:437 msgid "General settings" msgstr "一般設定" #: playlist/playlist.cpp:1213 ui/organisedialog.cpp:66 #: ../bin/src/ui_groupbydialog.h:134 ../bin/src/ui_groupbydialog.h:147 #: ../bin/src/ui_groupbydialog.h:160 ../bin/src/ui_edittagdialog.h:692 msgid "Genre" msgstr "風格" #: internet/groovesharkservice.cpp:542 msgid "Get a URL to share this Grooveshark playlist" msgstr "獲取一個網址以分享這個 Grooveshark 播放清單" #: internet/groovesharkservice.cpp:539 internet/groovesharkservice.cpp:1110 msgid "Get a URL to share this Grooveshark song" msgstr "獲取一個網址以分享這個 Grooveshark 歌曲" #: internet/groovesharkservice.cpp:790 msgid "Getting Grooveshark popular songs" msgstr "獲取 Grooveshark 熱門歌曲" #: internet/somafmservice.cpp:114 msgid "Getting channels" msgstr "取得頻道" #: internet/digitallyimportedservicebase.cpp:108 msgid "Getting streams" msgstr "取得串流" #: ../bin/src/ui_addstreamdialog.h:116 msgid "Give it a name:" msgstr "給它一個名字:" #: ../bin/src/ui_addpodcastbyurl.h:78 msgid "Go" msgstr "前往" #: ../bin/src/ui_mainwindow.h:707 msgid "Go to next playlist tab" msgstr "到下一個播放清單分頁" #: ../bin/src/ui_mainwindow.h:708 msgid "Go to previous playlist tab" msgstr "到前一個播放清單分頁" #: ../bin/src/ui_googledrivesettingspage.h:103 msgid "Google Drive" msgstr "Google 雲端硬碟" #: covers/coversearchstatisticsdialog.cpp:54 ui/albumcovermanager.cpp:453 #: ../bin/src/ui_coversearchstatisticsdialog.h:76 #, qt-format msgid "Got %1 covers out of %2 (%3 failed)" msgstr "獲得 %1 涵蓋了 %2 ( %3 失敗 )" #: ../bin/src/ui_behavioursettingspage.h:206 msgid "Grey out non existent songs in my playlists" msgstr "用灰色顯示在我播放清單有,但不存在的歌曲" #: ../bin/src/ui_groovesharksettingspage.h:112 msgid "Grooveshark" msgstr "Grooveshark" #: internet/groovesharkservice.cpp:408 msgid "Grooveshark login error" msgstr "Grooveshark登入錯誤" #: internet/groovesharkservice.cpp:1162 msgid "Grooveshark playlist's URL" msgstr "Grooveshark 播放清單的網址" #: internet/groovesharkservice.cpp:603 msgid "Grooveshark radio" msgstr "Grooveshark 電台" #: internet/groovesharkservice.cpp:1140 msgid "Grooveshark song's URL" msgstr "Grooveshark 歌曲的網址" #: ../bin/src/ui_groupbydialog.h:124 msgid "Group Library by..." msgstr "歸類音樂庫依..." #: globalsearch/globalsearchview.cpp:444 library/libraryfilterwidget.cpp:82 msgid "Group by" msgstr "歸類方式" #: library/libraryfilterwidget.cpp:110 msgid "Group by Album" msgstr "依專輯歸類" #: library/libraryfilterwidget.cpp:104 msgid "Group by Artist" msgstr "依演出者歸類" #: library/libraryfilterwidget.cpp:106 msgid "Group by Artist/Album" msgstr "依演出者/專輯歸類" #: library/libraryfilterwidget.cpp:108 msgid "Group by Artist/Year - Album" msgstr "依演出者/專輯發行年度歸類" #: library/libraryfilterwidget.cpp:112 msgid "Group by Genre/Album" msgstr "依風格/專輯歸類" #: library/libraryfilterwidget.cpp:114 msgid "Group by Genre/Artist/Album" msgstr "依風格/演出者/專輯歸類" #: playlist/playlist.cpp:1217 ui/organisedialog.cpp:61 #: ../bin/src/ui_edittagdialog.h:691 msgid "Grouping" msgstr "" #: podcasts/podcasturlloader.cpp:196 msgid "HTML page did not contain any RSS feeds" msgstr "" #: internet/subsonicsettingspage.cpp:135 msgid "" "HTTP 3xx status code received without URL, verify server configuration." msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:163 msgid "HTTP proxy" msgstr "HTTP 代理" #: moodbar/moodbarrenderer.cpp:158 msgid "Happy" msgstr "快樂" #: ../bin/src/ui_deviceproperties.h:371 msgid "Hardware information" msgstr "硬體資訊" #: ../bin/src/ui_deviceproperties.h:372 msgid "Hardware information is only available while the device is connected." msgstr "硬體資訊只有當裝置是連結的時候可以取得。" #: ../bin/src/ui_transcoderoptionsmp3.h:202 msgid "High" msgstr "高級" #: analyzers/analyzercontainer.cpp:64 #: visualisations/visualisationcontainer.cpp:109 #, qt-format msgid "High (%1 fps)" msgstr "高 (%1 fps)" #: visualisations/visualisationcontainer.cpp:119 msgid "High (1024x1024)" msgstr "高 (1024x1024)" #: internet/subsonicsettingspage.cpp:112 msgid "Host not found, check server URL. Example: http://localhost:4040/" msgstr "" #: smartplaylists/searchterm.cpp:310 msgid "Hours" msgstr "小時" #: core/backgroundstreams.cpp:30 msgid "Hypnotoad" msgstr "大蟾蜍" #: ../bin/src/ui_magnatunesettingspage.h:159 msgid "I don't have a Magnatune account" msgstr "我沒有 Magnatune 帳號" #: ../bin/src/ui_deviceproperties.h:370 msgid "Icon" msgstr "圖示" #: widgets/fancytabwidget.cpp:674 msgid "Icons on top" msgstr "圖示在上面" #: musicbrainz/tagfetcher.cpp:86 msgid "Identifying song" msgstr "辨識歌曲" #: devices/devicemanager.cpp:568 devices/devicemanager.cpp:576 msgid "" "If you continue, this device will work slowly and songs copied to it may not" " work." msgstr "如果您要繼續,此裝置將會變慢且可能無法複製歌曲" #: ../bin/src/ui_addpodcastbyurl.h:77 msgid "If you know the URL of a podcast, enter it below and press Go." msgstr "如果您知道一個 podcast 的網址,在下面輸入並按下「前往」。" #: ../bin/src/ui_organisedialog.h:204 msgid "Ignore \"The\" in artist names" msgstr "忽視在演出者名字中的“The”" #: ui/albumcoverchoicecontroller.cpp:43 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:45 msgid "Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" msgstr "圖片(*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)" #: core/utilities.cpp:145 #, qt-format msgid "In %1 days" msgstr "" #: core/utilities.cpp:149 #, qt-format msgid "In %1 weeks" msgstr "" #: ../bin/src/ui_wizardfinishpage.h:86 msgid "" "In dynamic mode new tracks will be chosen and added to the playlist every " "time a song finishes." msgstr "在動態模式中當一手個播畢新的音軌會被選中且新增至播放清單" #: internet/spotifyservice.cpp:360 msgid "Inbox" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:443 msgid "Include album art in the notification" msgstr "包括封面圖片的通知" #: ../bin/src/ui_querysearchpage.h:118 msgid "Include all songs" msgstr "包括所有歌曲" #: internet/subsonicsettingspage.cpp:90 msgid "Incompatible Subsonic REST protocol version. Client must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:94 msgid "Incompatible Subsonic REST protocol version. Server must upgrade." msgstr "" #: internet/subsonicsettingspage.cpp:127 msgid "Incomplete configuration, please ensure all fields are populated." msgstr "" #: core/commandlineoptions.cpp:158 msgid "Increase the volume by 4%" msgstr "增加音量4%" #: core/commandlineoptions.cpp:160 msgid "Increase the volume by percent" msgstr "" #: core/globalshortcuts.cpp:52 wiimotedev/wiimotesettingspage.cpp:103 msgid "Increase volume" msgstr "提高音量" #: internet/cloudfileservice.cpp:136 #, qt-format msgid "Indexing %1" msgstr "" #: ../bin/src/ui_deviceproperties.h:373 wiimotedev/wiimotesettingspage.cpp:124 msgid "Information" msgstr "資訊" #: ../bin/src/ui_organisedialog.h:203 msgid "Insert..." msgstr "插入..." #: internet/spotifysettingspage.cpp:75 msgid "Installed" msgstr "已安裝" #: core/database.cpp:673 msgid "Integrity check" msgstr "" #: ui/mainwindow.cpp:238 msgid "Internet" msgstr "網路" #: ui/settingsdialog.cpp:155 msgid "Internet providers" msgstr "網際網路服務供應商" #: internet/lastfmservice.cpp:433 msgid "Invalid API key" msgstr "無效的 API key" #: internet/lastfmservice.cpp:428 msgid "Invalid format" msgstr "無效的格式" #: internet/lastfmservice.cpp:426 msgid "Invalid method" msgstr "無效的方法" #: internet/lastfmservice.cpp:429 msgid "Invalid parameters" msgstr "無效的參數" #: internet/lastfmservice.cpp:430 msgid "Invalid resource specified" msgstr "無效的資源指定" #: internet/lastfmservice.cpp:425 msgid "Invalid service" msgstr "無效的服務" #: internet/lastfmservice.cpp:432 msgid "Invalid session key" msgstr "無效對稱金鑰" #: internet/groovesharkservice.cpp:401 msgid "Invalid username and/or password" msgstr "無效使用者名稱 及/或 密碼" #: internet/jamendoservice.cpp:127 msgid "Jamendo" msgstr "Jamendo" #: internet/jamendoservice.cpp:109 msgid "Jamendo Most Listened Tracks" msgstr "Jamendo 最常聆聽音軌" #: internet/jamendoservice.cpp:107 msgid "Jamendo Top Tracks" msgstr "Jamendo 熱門曲目" #: internet/jamendoservice.cpp:103 msgid "Jamendo Top Tracks of the Month" msgstr "Jamendo 每月熱門曲目" #: internet/jamendoservice.cpp:105 msgid "Jamendo Top Tracks of the Week" msgstr "Jamendo 每週熱門曲目" #: internet/jamendoservice.cpp:171 msgid "Jamendo database" msgstr "Jamendo 資料庫" #: ../bin/src/ui_mainwindow.h:699 msgid "Jump to the currently playing track" msgstr "跳轉到目前播放的曲目" #: wiimotedev/wiimoteshortcutgrabber.cpp:72 #, qt-format msgid "Keep buttons for %1 second..." msgstr "按住按鈕 %1 秒..." #: ../bin/src/ui_wiimoteshortcutgrabber.h:127 #: wiimotedev/wiimoteshortcutgrabber.cpp:73 #: wiimotedev/wiimoteshortcutgrabber.cpp:117 #, qt-format msgid "Keep buttons for %1 seconds..." msgstr "按住按鈕 %1 秒..." #: ../bin/src/ui_behavioursettingspage.h:193 msgid "Keep running in the background when the window is closed" msgstr "當視窗關閉時,保持在背景運轉" #: ../bin/src/ui_organisedialog.h:193 msgid "Keep the original files" msgstr "保留原本的檔案" #: ../bin/src/ui_mainwindow.h:691 msgid "Kittens" msgstr "小貓" #: ../bin/src/ui_behavioursettingspage.h:195 msgid "Language" msgstr "語言" #: ui/equalizer.cpp:121 msgid "Laptop/Headphones" msgstr "筆記本電腦 /耳機" #: ui/equalizer.cpp:122 msgid "Large Hall" msgstr "大型音樂廳" #: widgets/nowplayingwidget.cpp:91 msgid "Large album cover" msgstr "大的專輯封面" #: widgets/fancytabwidget.cpp:670 msgid "Large sidebar" msgstr "大型側邊欄" #: library/library.cpp:71 playlist/playlist.cpp:1222 #: ../bin/src/ui_edittagdialog.h:671 msgid "Last played" msgstr "最近播放" #: ../bin/src/ui_lastfmsettingspage.h:150 msgid "Last.fm" msgstr "Last.fm" #: internet/lastfmservice.cpp:85 #, qt-format msgid "Last.fm Custom Radio: %1" msgstr "Last.fm 自訂頻道: %1" #: internet/lastfmservice.cpp:255 internet/lastfmservice.cpp:699 #: internet/lastfmservice.cpp:722 #, qt-format msgid "Last.fm Library - %1" msgstr "Last.fm 音樂庫 - %1" #: globalsearch/lastfmsearchprovider.cpp:77 internet/lastfmservice.cpp:257 #: internet/lastfmservice.cpp:260 #, qt-format msgid "Last.fm Mix Radio - %1" msgstr "Last.fm 混合頻道 - %1" #: globalsearch/lastfmsearchprovider.cpp:79 internet/lastfmservice.cpp:262 #: internet/lastfmservice.cpp:265 #, qt-format msgid "Last.fm Neighbor Radio - %1" msgstr "Last.fm 鄰近頻道 -%1" #: globalsearch/lastfmsearchprovider.cpp:75 internet/lastfmservice.cpp:252 #, qt-format msgid "Last.fm Radio Station - %1" msgstr "Last.fm 廣播電台 - %1" #: internet/lastfmservice.cpp:83 #, qt-format msgid "Last.fm Similar Artists to %1" msgstr "Last.fm 類似的演出者至%1" #: internet/lastfmservice.cpp:84 #, qt-format msgid "Last.fm Tag Radio: %1" msgstr "Last.fm 標籤頻道: %1" #: internet/lastfmservice.cpp:437 msgid "Last.fm is currently busy, please try again in a few minutes" msgstr "Last.fm 目前正在忙,請在幾分鐘後再試一次" #: ../bin/src/ui_lastfmsettingspage.h:154 msgid "Last.fm password" msgstr "Last.fm 密碼" #: songinfo/lastfmtrackinfoprovider.cpp:78 msgid "Last.fm play counts" msgstr "Last.fm 播放計數" #: songinfo/lastfmtrackinfoprovider.cpp:131 msgid "Last.fm tags" msgstr "Last.fm 標籤" #: ../bin/src/ui_lastfmsettingspage.h:152 msgid "Last.fm username" msgstr "Last.fm 帳號" #: songinfo/lastfmtrackinfoprovider.cpp:111 msgid "Last.fm wiki" msgstr "Last.fm 維基百科" #: library/library.cpp:87 msgid "Least favourite tracks" msgstr "最不喜歡的曲目" #: ../bin/src/ui_playbacksettingspage.h:326 msgid "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc." msgstr "如果送出空白將使用預設值。\n範例: \"/dev/dsp\",\"front\"等等。" #: ../bin/src/ui_equalizer.h:172 msgid "Left" msgstr "" #: playlist/playlist.cpp:1209 ui/organisedialog.cpp:68 #: ui/qtsystemtrayicon.cpp:255 ../bin/src/ui_edittagdialog.h:666 msgid "Length" msgstr "長度" #: ui/mainwindow.cpp:225 ui/mainwindow.cpp:235 msgid "Library" msgstr "音樂庫" #: ../bin/src/ui_groupbydialog.h:122 msgid "Library advanced grouping" msgstr "音樂庫進階的歸類" #: ui/mainwindow.cpp:2090 msgid "Library rescan notice" msgstr "音樂庫重新掃描提示" #: smartplaylists/querywizardplugin.cpp:86 msgid "Library search" msgstr "音樂庫搜尋" #: ../bin/src/ui_querysortpage.h:140 msgid "Limits" msgstr "限制" #: internet/groovesharkservice.cpp:604 msgid "" "Listen to Grooveshark songs based on what you've listened to previously" msgstr "聽取 Grooveshark 歌曲,根據您先前已經聽過的" #: ui/equalizer.cpp:123 msgid "Live" msgstr "即時" #: ../bin/src/ui_albumcovermanager.h:217 msgid "Load" msgstr "載入" #: ../bin/src/ui_coverfromurldialog.h:102 msgid "Load cover from URL" msgstr "從網址載入封面" #: ui/albumcoverchoicecontroller.cpp:61 msgid "Load cover from URL..." msgstr "從網址載入封面..." #: ui/albumcoverchoicecontroller.cpp:91 msgid "Load cover from disk" msgstr "從磁碟載入封面" #: ui/albumcoverchoicecontroller.cpp:59 msgid "Load cover from disk..." msgstr "從磁碟載入封面..." #: playlist/playlistcontainer.cpp:286 msgid "Load playlist" msgstr "載入播放清單" #: ../bin/src/ui_mainwindow.h:705 msgid "Load playlist..." msgstr "載入播放清單..." #: internet/lastfmservice.cpp:884 msgid "Loading Last.fm radio" msgstr "載入 Last.fm 電台" #: devices/mtploader.cpp:42 msgid "Loading MTP device" msgstr "載入 MTP 裝置" #: devices/gpodloader.cpp:46 msgid "Loading iPod database" msgstr "載入 iPod 資料庫" #: smartplaylists/generatorinserter.cpp:52 msgid "Loading smart playlist" msgstr "載入智慧型播放清單" #: library/librarymodel.cpp:139 msgid "Loading songs" msgstr "載入歌曲" #: internet/digitallyimportedurlhandler.cpp:67 #: internet/somafmurlhandler.cpp:58 msgid "Loading stream" msgstr "載入串流" #: playlist/songloaderinserter.cpp:79 ui/edittagdialog.cpp:233 msgid "Loading tracks" msgstr "載入曲目" #: playlist/songloaderinserter.cpp:139 msgid "Loading tracks info" msgstr "載入曲目資訊" #: library/librarymodel.cpp:134 podcasts/podcastdiscoverymodel.cpp:97 #: widgets/prettyimage.cpp:168 widgets/widgetfadehelper.cpp:99 #: ../bin/src/ui_addpodcastdialog.h:180 ../bin/src/ui_searchpreview.h:106 msgid "Loading..." msgstr "載入中..." #: core/commandlineoptions.cpp:167 msgid "Loads files/URLs, replacing current playlist" msgstr "載入檔案/網址,取代目前的播放清單" #: ../bin/src/ui_digitallyimportedsettingspage.h:163 #: ../bin/src/ui_groovesharksettingspage.h:116 #: ../bin/src/ui_magnatunesettingspage.h:164 #: ../bin/src/ui_spotifysettingspage.h:211 #: ../bin/src/ui_subsonicsettingspage.h:130 #: ../bin/src/ui_lastfmsettingspage.h:153 #: ../bin/src/ui_googledrivesettingspage.h:105 #: ../bin/src/ui_ubuntuonesettingspage.h:131 #: ../bin/src/ui_dropboxsettingspage.h:105 ../bin/src/ui_boxsettingspage.h:105 msgid "Login" msgstr "登錄" #: podcasts/podcastsettingspage.cpp:119 msgid "Login failed" msgstr "登錄失敗" #: ../bin/src/ui_transcoderoptionsaac.h:137 msgid "Long term prediction profile (LTP)" msgstr "長時期預測規格 (LTP)" #: ../bin/src/ui_mainwindow.h:660 msgid "Love" msgstr "喜愛" #: analyzers/analyzercontainer.cpp:62 #: visualisations/visualisationcontainer.cpp:107 #, qt-format msgid "Low (%1 fps)" msgstr "低 (%1 fps)" #: visualisations/visualisationcontainer.cpp:117 msgid "Low (256x256)" msgstr "低 (256x256)" #: ../bin/src/ui_transcoderoptionsaac.h:135 msgid "Low complexity profile (LC)" msgstr "低複雜度規格 (LC)" #: ../bin/src/ui_songinfosettingspage.h:187 msgid "Lyrics" msgstr "歌詞" #: songinfo/ultimatelyricsprovider.cpp:136 #, qt-format msgid "Lyrics from %1" msgstr "歌詞來自 %1" #: core/song.cpp:331 ../bin/src/ui_transcodersettingspage.h:175 msgid "MP3" msgstr "MP3" #: ../bin/src/ui_digitallyimportedsettingspage.h:177 msgid "MP3 256k" msgstr "MP3 256k" #: ../bin/src/ui_digitallyimportedsettingspage.h:170 msgid "MP3 96k" msgstr "MP3 96k" #: core/song.cpp:329 msgid "MP4 AAC" msgstr "MP4 AAC" #: core/song.cpp:330 msgid "MPC" msgstr "MPC" #: internet/magnatuneservice.cpp:103 ../bin/src/ui_magnatunesettingspage.h:154 msgid "Magnatune" msgstr "Magnatune" #: ../bin/src/ui_magnatunedownloaddialog.h:131 msgid "Magnatune Download" msgstr "Magnatune 下載" #: widgets/osd.cpp:190 msgid "Magnatune download finished" msgstr "Magnatune 下載完成" #: ../bin/src/ui_transcoderoptionsaac.h:134 msgid "Main profile (MAIN)" msgstr "主規格 (MAIN)" #: core/backgroundstreams.cpp:36 ../bin/src/ui_mainwindow.h:690 msgid "Make it so!" msgstr "使它這樣的!" #: internet/spotifyservice.cpp:533 msgid "Make playlist available offline" msgstr "使播放清單可離線使用" #: internet/lastfmservice.cpp:444 msgid "Malformed response" msgstr "格式不正確的反應" #: ../bin/src/ui_networkproxysettingspage.h:160 msgid "Manual proxy configuration" msgstr "手動代理伺服器設定" #: ../bin/src/ui_podcastsettingspage.h:231 #: ../bin/src/ui_podcastsettingspage.h:245 msgid "Manually" msgstr "手動" #: devices/deviceproperties.cpp:153 msgid "Manufacturer" msgstr "製造商" #: podcasts/podcastservice.cpp:284 msgid "Mark as listened" msgstr "標記為聽過的" #: podcasts/podcastservice.cpp:282 msgid "Mark as new" msgstr "" #: ../bin/src/ui_querysearchpage.h:116 msgid "Match every search term (AND)" msgstr "符合每個搜尋字詞(AND)" #: ../bin/src/ui_querysearchpage.h:117 msgid "Match one or more search terms (OR)" msgstr "符合一個或更多搜尋字詞(OR)" #: ../bin/src/ui_transcoderoptionsvorbis.h:209 msgid "Maximum bitrate" msgstr "最大位元率" #: analyzers/analyzercontainer.cpp:63 #: visualisations/visualisationcontainer.cpp:108 #, qt-format msgid "Medium (%1 fps)" msgstr "中 (%1 fps)" #: visualisations/visualisationcontainer.cpp:118 msgid "Medium (512x512)" msgstr "中 (512x512)" #: ../bin/src/ui_magnatunesettingspage.h:156 msgid "Membership type" msgstr "會員類型" #: ../bin/src/ui_transcoderoptionsvorbis.h:206 msgid "Minimum bitrate" msgstr "最小位元率" #: visualisations/projectmvisualisation.cpp:127 msgid "Missing projectM presets" msgstr "略過 projectM 預設" #: devices/deviceproperties.cpp:152 msgid "Model" msgstr "樣本" #: ../bin/src/ui_librarysettingspage.h:192 msgid "Monitor the library for changes" msgstr "監視音樂庫的變化" #: ../bin/src/ui_playbacksettingspage.h:332 msgid "Mono playback" msgstr "單聲道播放" #: smartplaylists/searchterm.cpp:313 msgid "Months" msgstr "月" #: playlist/playlist.cpp:1237 msgid "Mood" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:294 #: moodbar/moodbarproxystyle.cpp:342 msgid "Moodbar style" msgstr "" #: ../bin/src/ui_appearancesettingspage.h:292 msgid "Moodbars" msgstr "" #: library/library.cpp:74 msgid "Most played" msgstr "最常播放的" #: devices/giolister.cpp:159 msgid "Mount point" msgstr "掛載點" #: devices/devicekitlister.cpp:125 msgid "Mount points" msgstr "掛載點" #: ../bin/src/ui_globalsearchsettingspage.h:149 #: ../bin/src/ui_queuemanager.h:131 ../bin/src/ui_songinfosettingspage.h:190 msgid "Move down" msgstr "下移" #: ui/mainwindow.cpp:504 widgets/fileviewlist.cpp:41 msgid "Move to library..." msgstr "移到音樂庫..." #: ../bin/src/ui_globalsearchsettingspage.h:148 #: ../bin/src/ui_queuemanager.h:127 ../bin/src/ui_songinfosettingspage.h:189 msgid "Move up" msgstr "上移" #: transcoder/transcodedialog.cpp:216 ui/mainwindow.cpp:1605 msgid "Music" msgstr "音樂" #: ../bin/src/ui_librarysettingspage.h:186 msgid "Music Library" msgstr "音樂庫" #: core/globalshortcuts.cpp:54 ../bin/src/ui_mainwindow.h:713 #: wiimotedev/wiimotesettingspage.cpp:105 msgid "Mute" msgstr "静音" #: globalsearch/lastfmsearchprovider.cpp:53 internet/lastfmservice.cpp:195 msgid "My Last.fm Library" msgstr "我的 Last.fm 音樂庫" #: globalsearch/lastfmsearchprovider.cpp:55 internet/lastfmservice.cpp:200 msgid "My Last.fm Mix Radio" msgstr "我的 Last.fm 混合頻道" #: globalsearch/lastfmsearchprovider.cpp:57 internet/lastfmservice.cpp:205 msgid "My Last.fm Neighborhood" msgstr "我的 Last.fm 鄰居" #: globalsearch/lastfmsearchprovider.cpp:51 internet/lastfmservice.cpp:190 msgid "My Last.fm Recommended Radio" msgstr "我的 Last.fm 推薦頻道" #: internet/lastfmservice.cpp:197 msgid "My Mix Radio" msgstr "我的混合頻道" #: internet/groovesharkservice.cpp:608 msgid "My Music" msgstr "" #: internet/lastfmservice.cpp:202 msgid "My Neighborhood" msgstr "我的鄰居" #: internet/lastfmservice.cpp:192 msgid "My Radio Station" msgstr "我的廣播電台" #: internet/lastfmservice.cpp:187 msgid "My Recommendations" msgstr "我推薦的電台" #: internet/groovesharkservice.cpp:1245 internet/groovesharkservice.cpp:1338 #: ui/equalizer.cpp:178 ../bin/src/ui_deviceproperties.h:369 #: ../bin/src/ui_magnatunedownloaddialog.h:135 #: ../bin/src/ui_wizardfinishpage.h:84 #: ../bin/src/ui_globalshortcutssettingspage.h:174 msgid "Name" msgstr "名稱" #: ../bin/src/ui_organisedialog.h:197 msgid "Naming options" msgstr "命名選項" #: ../bin/src/ui_transcoderoptionsspeex.h:230 msgid "Narrow band (NB)" msgstr "窄頻 (NB)" #: internet/lastfmservice.cpp:229 msgid "Neighbors" msgstr "鄰居" #: ../bin/src/ui_songinfosettingspage.h:184 msgid "Network" msgstr "網路" #: ../bin/src/ui_networkproxysettingspage.h:157 msgid "Network Proxy" msgstr "網路代理伺服器" #: ../bin/src/ui_networkremotesettingspage.h:177 msgid "Network Remote" msgstr "" #: playlist/playlistdelegates.cpp:299 ui/edittagdialog.cpp:487 msgid "Never" msgstr "從未" #: library/library.cpp:67 msgid "Never played" msgstr "從未播放" #: ../bin/src/ui_behavioursettingspage.h:210 #: ../bin/src/ui_behavioursettingspage.h:224 msgid "Never start playing" msgstr "永不開始播放" #: playlist/playlistlistcontainer.cpp:72 #: playlist/playlistlistcontainer.cpp:170 #: ../bin/src/ui_playlistlistcontainer.h:128 msgid "New folder" msgstr "" #: ui/mainwindow.cpp:1445 ../bin/src/ui_mainwindow.h:701 msgid "New playlist" msgstr "新增播放清單" #: library/libraryview.cpp:379 msgid "New smart playlist..." msgstr "新增智慧型播放清單" #: widgets/freespacebar.cpp:46 msgid "New songs" msgstr "新的歌曲" #: ../bin/src/ui_dynamicplaylistcontrols.h:110 msgid "New tracks will be added automatically." msgstr "新曲目將被自動加入。" #: library/library.cpp:80 msgid "Newest tracks" msgstr "最新曲目" #: ui/edittagdialog.cpp:161 ui/trackselectiondialog.cpp:49 msgid "Next" msgstr "下一個" #: core/globalshortcuts.cpp:50 ../bin/src/ui_mainwindow.h:654 #: wiimotedev/wiimotesettingspage.cpp:99 msgid "Next track" msgstr "下一首曲目" #: core/utilities.cpp:147 msgid "Next week" msgstr "" #: analyzers/analyzercontainer.cpp:80 msgid "No analyzer" msgstr "沒有分析儀" #: ../bin/src/ui_appearancesettingspage.h:285 msgid "No background image" msgstr "沒有背景圖片" #: ui/albumcovermanager.cpp:778 msgid "No covers to export." msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:146 msgid "No long blocks" msgstr "無長區塊" #: playlist/playlistcontainer.cpp:366 msgid "" "No matches found. Clear the search box to show the whole playlist again." msgstr "沒有找到符合的.清除搜尋框,再次顯示整個播放清單" #: ../bin/src/ui_transcoderoptionsaac.h:145 msgid "No short blocks" msgstr "無短區塊" #: ../bin/src/ui_groupbydialog.h:128 ../bin/src/ui_groupbydialog.h:141 #: ../bin/src/ui_groupbydialog.h:154 msgid "None" msgstr "沒有" #: library/libraryview.cpp:603 ui/mainwindow.cpp:1858 ui/mainwindow.cpp:1974 msgid "None of the selected songs were suitable for copying to a device" msgstr "所選歌曲沒有適合複製到裝置的" #: moodbar/moodbarrenderer.cpp:155 msgid "Normal" msgstr "" #: ../bin/src/ui_transcoderoptionsaac.h:144 msgid "Normal block type" msgstr "普通區塊型態" #: playlist/playlistsequence.cpp:170 msgid "Not available while using a dynamic playlist" msgstr "不可使用,當使用一個動態播放清單" #: devices/deviceview.cpp:107 msgid "Not connected" msgstr "沒有連接" #: internet/lastfmservice.cpp:439 msgid "Not enough content" msgstr "沒有足夠的內容" #: internet/lastfmservice.cpp:441 msgid "Not enough fans" msgstr "沒有足夠的粉絲" #: internet/lastfmservice.cpp:440 msgid "Not enough members" msgstr "沒有足夠的成員" #: internet/lastfmservice.cpp:442 msgid "Not enough neighbors" msgstr "沒有足夠的鄰居" #: internet/spotifysettingspage.cpp:75 msgid "Not installed" msgstr "沒有安裝" #: globalsearch/globalsearchsettingspage.cpp:120 #: globalsearch/searchproviderstatuswidget.cpp:48 msgid "Not logged in" msgstr "沒有登錄" #: devices/deviceview.cpp:111 msgid "Not mounted - double click to mount" msgstr "未掛載 - 雙擊以掛載" #: ../bin/src/ui_notificationssettingspage.h:432 msgid "Notification type" msgstr "通知型式" #: ../bin/src/ui_notificationssettingspage.h:375 msgid "Notifications" msgstr "通知" #: ui/macsystemtrayicon.mm:64 msgid "Now Playing" msgstr "現在正播放" #: ui/notificationssettingspage.cpp:37 msgid "OSD Preview" msgstr "OSD 的預覽" #: core/song.cpp:332 msgid "Ogg Flac" msgstr "Ogg Flac" #: core/song.cpp:335 msgid "Ogg Opus" msgstr "" #: core/song.cpp:333 msgid "Ogg Speex" msgstr "Ogg Speex" #: core/song.cpp:334 ../bin/src/ui_magnatunedownloaddialog.h:139 #: ../bin/src/ui_magnatunesettingspage.h:170 msgid "Ogg Vorbis" msgstr "Ogg Vorbis" #: ../bin/src/ui_networkremotesettingspage.h:182 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:187 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:290 msgid "Opacity" msgstr "" #: internet/digitallyimportedservicebase.cpp:179 #: internet/groovesharkservice.cpp:546 internet/icecastservice.cpp:296 #: internet/jamendoservice.cpp:419 internet/magnatuneservice.cpp:278 #: internet/somafmservice.cpp:100 internet/soundcloudservice.cpp:194 #, qt-format msgid "Open %1 in browser" msgstr "在瀏覽器中開啟 %1" #: ../bin/src/ui_mainwindow.h:686 msgid "Open &audio CD..." msgstr "開啟音樂光碟(&A)..." #: podcasts/addpodcastdialog.cpp:230 msgid "Open OPML file" msgstr "" #: podcasts/addpodcastdialog.cpp:73 msgid "Open OPML file..." msgstr "" #: ../bin/src/ui_deviceproperties.h:382 msgid "Open device" msgstr "開啟裝置" #: ../bin/src/ui_mainwindow.h:685 msgid "Open file..." msgstr "開啟檔案..." #: internet/googledriveservice.cpp:184 msgid "Open in Google Drive" msgstr "" #: devices/deviceview.cpp:215 globalsearch/globalsearchview.cpp:437 #: internet/internetservice.cpp:76 library/libraryview.cpp:371 #: widgets/fileviewlist.cpp:36 ../bin/src/ui_behavioursettingspage.h:219 msgid "Open in new playlist" msgstr "開啟在新的播放清單" #: ../bin/src/ui_globalshortcutssettingspage.h:169 #: ../bin/src/ui_globalshortcutssettingspage.h:171 msgid "Open..." msgstr "開啟..." #: internet/lastfmservice.cpp:431 msgid "Operation failed" msgstr "操作失敗" #: ../bin/src/ui_transcoderoptionsmp3.h:193 msgid "Optimize for bitrate" msgstr "最佳化位元率" #: ../bin/src/ui_transcoderoptionsmp3.h:191 msgid "Optimize for quality" msgstr "最佳化品質" #: ../bin/src/ui_transcodedialog.h:211 msgid "Options..." msgstr "選擇..." #: ../bin/src/ui_transcodersettingspage.h:181 msgid "Opus" msgstr "" #: ../bin/src/ui_organisedialog.h:188 msgid "Organise Files" msgstr "組織檔案" #: library/libraryview.cpp:387 ui/mainwindow.cpp:505 msgid "Organise files..." msgstr "組織檔案..." #: core/organise.cpp:65 msgid "Organising files" msgstr "組織檔案中" #: ui/trackselectiondialog.cpp:167 msgid "Original tags" msgstr "原來的標籤" #: core/commandlineoptions.cpp:169 msgid "Other options" msgstr "其它選項" #: ../bin/src/ui_albumcoverexport.h:204 msgid "Output" msgstr "" #: ../bin/src/ui_playbacksettingspage.h:325 msgid "Output device" msgstr "" #: ../bin/src/ui_transcodedialog.h:209 msgid "Output options" msgstr "輸出選項" #: ../bin/src/ui_playbacksettingspage.h:320 msgid "Output plugin" msgstr "" #: ../bin/src/ui_albumcoverexport.h:210 msgid "Overwrite all" msgstr "" #: ../bin/src/ui_organisedialog.h:207 msgid "Overwrite existing files" msgstr "覆寫現有的檔案" #: ../bin/src/ui_albumcoverexport.h:211 msgid "Overwrite smaller ones only" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:195 msgid "Owner" msgstr "擁有者" #: internet/jamendoservice.cpp:214 msgid "Parsing Jamendo catalogue" msgstr "" #: ui/equalizer.cpp:124 msgid "Party" msgstr "派對" #: ../bin/src/ui_groovesharksettingspage.h:115 #: ../bin/src/ui_magnatunesettingspage.h:165 #: ../bin/src/ui_spotifysettingspage.h:210 #: ../bin/src/ui_subsonicsettingspage.h:128 #: ../bin/src/ui_podcastsettingspage.h:253 #: ../bin/src/ui_networkproxysettingspage.h:169 msgid "Password" msgstr "密碼" #: core/globalshortcuts.cpp:46 ui/mainwindow.cpp:854 ui/mainwindow.cpp:1286 #: ui/qtsystemtrayicon.cpp:178 wiimotedev/wiimotesettingspage.cpp:106 msgid "Pause" msgstr "暫停" #: core/commandlineoptions.cpp:153 msgid "Pause playback" msgstr "暫停播放" #: widgets/osd.cpp:156 msgid "Paused" msgstr "已暫停" #: playlist/playlist.cpp:1216 ui/organisedialog.cpp:60 #: ../bin/src/ui_edittagdialog.h:690 msgid "Performer" msgstr "" #: ../bin/src/ui_albumcoverexport.h:215 msgid "Pixel" msgstr "" #: widgets/fancytabwidget.cpp:672 msgid "Plain sidebar" msgstr "樸素的側邊欄" #: core/globalshortcuts.cpp:45 ui/mainwindow.cpp:487 ui/mainwindow.cpp:822 #: ui/mainwindow.cpp:841 ui/mainwindow.cpp:1289 ui/qtsystemtrayicon.cpp:166 #: ui/qtsystemtrayicon.cpp:192 ../bin/src/ui_mainwindow.h:650 #: wiimotedev/wiimotesettingspage.cpp:101 msgid "Play" msgstr "播放" #: ../bin/src/ui_lastfmstationdialog.h:92 msgid "Play Artist or Tag" msgstr "播放藝術家或標籤" #: internet/lastfmservice.cpp:118 msgid "Play artist radio..." msgstr "播放藝術加的頻道..." #: playlist/playlist.cpp:1220 ../bin/src/ui_edittagdialog.h:667 msgid "Play count" msgstr "播放計數" #: internet/lastfmservice.cpp:122 msgid "Play custom radio..." msgstr "播放自定義電台" #: core/commandlineoptions.cpp:152 msgid "Play if stopped, pause if playing" msgstr "停止的話就開始播放,播放中的就暫停" #: ../bin/src/ui_behavioursettingspage.h:211 #: ../bin/src/ui_behavioursettingspage.h:225 msgid "Play if there is nothing already playing" msgstr "播放如果沒有歌曲是正在播放中" #: internet/lastfmservice.cpp:120 msgid "Play tag radio..." msgstr "播放標籤的頻道..." #: core/commandlineoptions.cpp:168 msgid "Play the th track in the playlist" msgstr "播放清單中的第首歌曲" #: core/globalshortcuts.cpp:47 wiimotedev/wiimotesettingspage.cpp:107 msgid "Play/Pause" msgstr "播放/暫停" #: ../bin/src/ui_playbacksettingspage.h:297 msgid "Playback" msgstr "播放" #: core/commandlineoptions.cpp:150 msgid "Player options" msgstr "播放器選項" #: playlist/playlistcontainer.cpp:280 playlist/playlistlistcontainer.cpp:227 #: playlist/playlistmanager.cpp:84 playlist/playlistmanager.cpp:152 #: playlist/playlistmanager.cpp:497 playlist/playlisttabbar.cpp:357 msgid "Playlist" msgstr "播放清單" #: widgets/osd.cpp:173 msgid "Playlist finished" msgstr "完成的播放清單" #: core/commandlineoptions.cpp:165 msgid "Playlist options" msgstr "播放清單選擇" #: smartplaylists/wizard.cpp:77 msgid "Playlist type" msgstr "播放清單類型" #: internet/groovesharkservice.cpp:626 ui/mainwindow.cpp:237 msgid "Playlists" msgstr "播放清單" #: ../data/oauthsuccess.html:36 msgid "Please close your browser and return to Clementine." msgstr "" #: ../bin/src/ui_spotifysettingspage.h:214 msgid "Plugin status:" msgstr "插件狀態:" #: podcasts/podcastservice.cpp:110 ../bin/src/ui_podcastsettingspage.h:226 msgid "Podcasts" msgstr "Podcasts" #: ui/equalizer.cpp:125 msgid "Pop" msgstr "流行音樂" #: internet/groovesharkservice.cpp:577 msgid "Popular songs" msgstr "熱門歌曲" #: internet/groovesharkservice.cpp:580 msgid "Popular songs of the Month" msgstr "月份熱門歌曲" #: internet/groovesharkservice.cpp:587 msgid "Popular songs today" msgstr "今日熱門歌曲" #: ../bin/src/ui_notificationssettingspage.h:438 msgid "Popup duration" msgstr "彈出持續時間" #: ../bin/src/ui_networkproxysettingspage.h:166 #: ../bin/src/ui_networkremotesettingspage.h:180 msgid "Port" msgstr "連接埠" #: ui/equalizer.cpp:47 ../bin/src/ui_playbacksettingspage.h:317 msgid "Pre-amp" msgstr "前置放大" #: ../bin/src/ui_digitallyimportedsettingspage.h:166 #: ../bin/src/ui_magnatunesettingspage.h:166 #: ../bin/src/ui_spotifysettingspage.h:216 ../bin/src/ui_settingsdialog.h:116 #: ../bin/src/ui_lastfmsettingspage.h:155 msgid "Preferences" msgstr "偏好設定" #: ../bin/src/ui_mainwindow.h:675 msgid "Preferences..." msgstr "偏好設定…" #: ../bin/src/ui_librarysettingspage.h:202 msgid "Preferred album art filenames (comma separated)" msgstr "偏好專輯封面的檔名(以逗號分隔)" #: ../bin/src/ui_magnatunesettingspage.h:167 msgid "Preferred audio format" msgstr "偏好的音訊格式" #: ../bin/src/ui_spotifysettingspage.h:217 msgid "Preferred bitrate" msgstr "偏好的位元率" #: ../bin/src/ui_deviceproperties.h:380 msgid "Preferred format" msgstr "偏好的格式" #: ../bin/src/ui_digitallyimportedsettingspage.h:174 msgid "Premium audio type" msgstr "高級音訊類型" #: ../bin/src/ui_equalizer.h:164 msgid "Preset:" msgstr "預設:" #: ../bin/src/ui_wiimoteshortcutgrabber.h:124 msgid "Press a button combination to use for" msgstr "按下一組按鍵來操作" #: ../bin/src/ui_globalshortcutgrabber.h:73 msgid "Press a key" msgstr "按一個鍵" #: ui/globalshortcutgrabber.cpp:39 ../bin/src/ui_globalshortcutgrabber.h:74 #, qt-format msgid "Press a key combination to use for %1..." msgstr "按下一組按鍵來操作 %1" #: ../bin/src/ui_notificationssettingspage.h:451 msgid "Pretty OSD options" msgstr "漂亮的 OSD 選項" #: ../bin/src/ui_searchpreview.h:105 ../bin/src/ui_songinfosettingspage.h:183 #: ../bin/src/ui_notificationssettingspage.h:446 #: ../bin/src/ui_organisedialog.h:208 msgid "Preview" msgstr "預覽" #: ui/edittagdialog.cpp:160 ui/trackselectiondialog.cpp:48 msgid "Previous" msgstr "往前" #: core/globalshortcuts.cpp:51 ../bin/src/ui_mainwindow.h:648 #: wiimotedev/wiimotesettingspage.cpp:100 msgid "Previous track" msgstr "上一首歌曲" #: core/commandlineoptions.cpp:176 msgid "Print out version information" msgstr "印出版本資訊" #: ../bin/src/ui_transcoderoptionsaac.h:131 msgid "Profile" msgstr "規格" #: ../bin/src/ui_magnatunedownloaddialog.h:134 #: ../bin/src/ui_transcodedialog.h:217 msgid "Progress" msgstr "進展" #: ../bin/src/ui_wiimoteshortcutgrabber.h:125 #: wiimotedev/wiimotesettingspage.cpp:227 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:81 #: ../bin/src/ui_transcoderoptionsmp3.h:192 #: ../bin/src/ui_transcoderoptionsspeex.h:217 #: ../bin/src/ui_transcoderoptionsvorbis.h:202 #: visualisations/visualisationcontainer.cpp:114 msgid "Quality" msgstr "品質" #: ../bin/src/ui_deviceproperties.h:383 msgid "Querying device..." msgstr "查詢裝置..." #: ../bin/src/ui_queuemanager.h:125 ../bin/src/ui_mainwindow.h:711 msgid "Queue Manager" msgstr "佇列管理員" #: ui/mainwindow.cpp:1367 msgid "Queue selected tracks" msgstr "將選取的歌曲加入佇列中" #: globalsearch/globalsearchview.cpp:441 library/libraryview.cpp:375 #: ui/mainwindow.cpp:1365 msgid "Queue track" msgstr "將歌曲加入佇列中" #: ../bin/src/ui_playbacksettingspage.h:314 msgid "Radio (equal loudness for all tracks)" msgstr "廣播 (為所有歌曲取得相同音量)" #: internet/groovesharkservice.cpp:595 msgid "Radios" msgstr "" #: core/backgroundstreams.cpp:31 ../bin/src/ui_mainwindow.h:688 msgid "Rain" msgstr "下雨" #: ../bin/src/ui_visualisationselector.h:112 msgid "Random visualization" msgstr "隨機視覺化" #: core/globalshortcuts.cpp:64 msgid "Rate the current song 0 stars" msgstr "評價目前的歌曲 0 顆星" #: core/globalshortcuts.cpp:65 msgid "Rate the current song 1 star" msgstr "評價目前的歌曲 1 顆星" #: core/globalshortcuts.cpp:66 msgid "Rate the current song 2 stars" msgstr "評價目前的歌曲 2 顆星" #: core/globalshortcuts.cpp:67 msgid "Rate the current song 3 stars" msgstr "評價目前的歌曲 3 顆星" #: core/globalshortcuts.cpp:68 msgid "Rate the current song 4 stars" msgstr "評價目前的歌曲 4 顆星" #: core/globalshortcuts.cpp:69 msgid "Rate the current song 5 stars" msgstr "評價目前的歌曲 5 顆星" #: playlist/playlist.cpp:1219 ../bin/src/ui_edittagdialog.h:675 msgid "Rating" msgstr "評分" #: internet/magnatunedownloaddialog.cpp:279 ui/albumcovermanager.cpp:215 msgid "Really cancel?" msgstr "真的要取消?" #: internet/subsonicsettingspage.cpp:131 msgid "Redirect limit exceeded, verify server configuration." msgstr "" #: internet/groovesharkservice.cpp:549 msgid "Refresh" msgstr "重新整理" #: internet/jamendoservice.cpp:420 internet/magnatuneservice.cpp:279 #: internet/subsonicservice.cpp:92 msgid "Refresh catalogue" msgstr "刷新目錄" #: internet/somafmservice.cpp:106 msgid "Refresh channels" msgstr "刷新頻道" #: internet/lastfmservice.cpp:124 msgid "Refresh friends list" msgstr "重新整理朋友清單" #: internet/icecastservice.cpp:297 msgid "Refresh station list" msgstr "重新整理電台清單" #: internet/digitallyimportedservicebase.cpp:182 msgid "Refresh streams" msgstr "重新整理串流" #: ui/equalizer.cpp:126 msgid "Reggae" msgstr "雷鬼" #: ../bin/src/ui_wiimoteshortcutgrabber.h:126 msgid "Remember Wii remote swing" msgstr "記住Wii遙控器揮動" #: ../bin/src/ui_behavioursettingspage.h:204 msgid "Remember from last time" msgstr "記得上一次的狀態" #: internet/savedradio.cpp:100 ../bin/src/ui_queuemanager.h:135 #: ../bin/src/ui_transcodedialog.h:208 internet/lastfmservice.cpp:115 msgid "Remove" msgstr "移除" #: ../bin/src/ui_wiimotesettingspage.h:194 msgid "Remove action" msgstr "刪除功能" #: ../bin/src/ui_mainwindow.h:720 msgid "Remove duplicates from playlist" msgstr "從播放清單中移除重複的" #: ../bin/src/ui_librarysettingspage.h:189 msgid "Remove folder" msgstr "移除資料夾" #: internet/groovesharkservice.cpp:536 msgid "Remove from My Music" msgstr "" #: internet/groovesharkservice.cpp:533 msgid "Remove from favorites" msgstr "從我的最愛中刪除" #: internet/groovesharkservice.cpp:530 ../bin/src/ui_mainwindow.h:695 msgid "Remove from playlist" msgstr "從播放清單移除" #: playlist/playlisttabbar.cpp:174 msgid "Remove playlist" msgstr "" #: playlist/playlistlistcontainer.cpp:310 msgid "Remove playlists" msgstr "" #: internet/groovesharkservice.cpp:1539 msgid "Removing songs from My Music" msgstr "" #: internet/groovesharkservice.cpp:1489 msgid "Removing songs from favorites" msgstr "" #: internet/groovesharkservice.cpp:1337 #, qt-format msgid "Rename \"%1\" playlist" msgstr "" #: internet/groovesharkservice.cpp:526 msgid "Rename Grooveshark playlist" msgstr "重命名 Grooveshark 播放清單" #: playlist/playlisttabbar.cpp:137 msgid "Rename playlist" msgstr "變更播放清單名稱" #: playlist/playlisttabbar.cpp:55 msgid "Rename playlist..." msgstr "重新命名播放清單" #: ../bin/src/ui_mainwindow.h:671 msgid "Renumber tracks in this order..." msgstr "按此順序重新為歌曲編號..." #: playlist/playlistsequence.cpp:174 ../bin/src/ui_playlistsequence.h:112 msgid "Repeat" msgstr "循環播放" #: widgets/osd.cpp:288 ../bin/src/ui_playlistsequence.h:105 msgid "Repeat album" msgstr "循環播放專輯" #: widgets/osd.cpp:289 ../bin/src/ui_playlistsequence.h:106 msgid "Repeat playlist" msgstr "循環播放所有歌曲" #: widgets/osd.cpp:287 ../bin/src/ui_playlistsequence.h:104 msgid "Repeat track" msgstr "循環播放單曲" #: devices/deviceview.cpp:213 globalsearch/globalsearchview.cpp:435 #: internet/internetservice.cpp:66 library/libraryview.cpp:369 #: widgets/fileviewlist.cpp:34 msgid "Replace current playlist" msgstr "取代目前播放清單" #: ../bin/src/ui_behavioursettingspage.h:218 msgid "Replace the playlist" msgstr "取代播放清單" #: ../bin/src/ui_organisedialog.h:205 msgid "Replaces spaces with underscores" msgstr "用底線取代空格" #: ../bin/src/ui_playbacksettingspage.h:309 msgid "Replay Gain" msgstr "回放增益" #: ../bin/src/ui_playbacksettingspage.h:311 msgid "Replay Gain mode" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:112 msgid "Repopulate" msgstr "重新填充" #: ../bin/src/ui_networkremotesettingspage.h:191 msgid "Require authentication code" msgstr "" #: widgets/lineedit.cpp:51 msgid "Reset" msgstr "重置" #: ui/edittagdialog.cpp:768 ../bin/src/ui_edittagdialog.h:665 msgid "Reset play counts" 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:206 msgid "Restrict to ASCII characters" msgstr "限制為 ASCII 字符" #: ../bin/src/ui_behavioursettingspage.h:205 msgid "Resume playback on start" msgstr "" #: internet/groovesharkservice.cpp:758 msgid "Retrieving Grooveshark My Music songs" msgstr "" #: internet/groovesharkservice.cpp:726 msgid "Retrieving Grooveshark favorites songs" msgstr "" #: internet/groovesharkservice.cpp:663 msgid "Retrieving Grooveshark playlists" msgstr "" #: ../data/oauthsuccess.html:3 msgid "Return to Clementine" msgstr "" #: ../bin/src/ui_equalizer.h:174 msgid "Right" msgstr "" #: ui/equalizer.cpp:127 msgid "Rock" msgstr "搖滾" #: ../bin/src/ui_console.h:81 msgid "Run" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:164 msgid "SOCKS proxy" msgstr "SOCKS 代理" #: internet/subsonicsettingspage.cpp:122 msgid "" "SSL handshake error, verify server configuration. SSLv3 option below may " "workaround some issues." msgstr "" #: devices/deviceview.cpp:202 msgid "Safely remove device" msgstr "安全地移除裝置" #: ../bin/src/ui_organisedialog.h:196 msgid "Safely remove the device after copying" msgstr "在複製之後,安全的移除裝置" #: playlist/playlist.cpp:1227 ../bin/src/ui_edittagdialog.h:672 msgid "Sample rate" msgstr "取樣頻率" #: ui/organisedialog.cpp:70 msgid "Samplerate" msgstr "取樣頻率" #: ../bin/src/ui_appearancesettingspage.h:295 msgid "Save .mood files in your music library" msgstr "" #: ui/albumcoverchoicecontroller.cpp:114 msgid "Save album cover" msgstr "儲存專輯封面" #: ui/albumcoverchoicecontroller.cpp:60 msgid "Save cover to disk..." msgstr "儲存封面到磁碟..." #: widgets/prettyimage.cpp:185 widgets/prettyimage.cpp:232 msgid "Save image" msgstr "儲存圖片" #: playlist/playlistlistcontainer.cpp:74 playlist/playlistmanager.cpp:240 msgid "Save playlist" msgstr "儲存播放清單" #: playlist/playlisttabbar.cpp:56 ../bin/src/ui_mainwindow.h:703 msgid "Save playlist..." msgstr "儲存播放清單" #: ui/equalizer.cpp:178 ../bin/src/ui_equalizer.h:166 msgid "Save preset" msgstr "儲存設定" #: ../bin/src/ui_librarysettingspage.h:193 msgid "Save ratings in file tags when possible" msgstr "" #: ../bin/src/ui_librarysettingspage.h:197 msgid "Save statistics in file tags when possible" msgstr "" #: ../bin/src/ui_addstreamdialog.h:115 msgid "Save this stream in the Internet tab" msgstr "儲存這個串流網址到「網路」這個分頁標籤" #: library/library.cpp:164 msgid "Saving songs statistics into songs files" msgstr "" #: ui/edittagdialog.cpp:670 ui/trackselectiondialog.cpp:256 msgid "Saving tracks" msgstr "儲存曲目" #: ../bin/src/ui_transcoderoptionsaac.h:136 msgid "Scalable sampling rate profile (SSR)" msgstr "可變取樣率規格 (SSR)" #: ../bin/src/ui_albumcoverexport.h:213 msgid "Scale size" msgstr "" #: playlist/playlist.cpp:1223 ../bin/src/ui_edittagdialog.h:673 msgid "Score" msgstr "分數" #: ../bin/src/ui_lastfmsettingspage.h:156 msgid "Scrobble tracks that I listen to" msgstr "Scrobble 我在聽的曲目" #: ui/albumcoversearcher.cpp:173 ui/albumcoversearcher.cpp:190 #: ui/mainwindow.cpp:234 ../bin/src/ui_globalsearchsettingspage.h:145 #: ../bin/src/ui_gpoddersearchpage.h:78 ../bin/src/ui_itunessearchpage.h:78 #: ../bin/src/ui_albumcoversearcher.h:114 msgid "Search" msgstr "搜尋" #: ../bin/src/ui_icecastfilterwidget.h:78 msgid "Search Icecast stations" msgstr "搜尋 Icecast stations" #: internet/jamendoservice.cpp:426 msgid "Search Jamendo" msgstr "搜尋 Jamendo" #: internet/magnatuneservice.cpp:285 msgid "Search Magnatune" msgstr "搜尋 Magnatune" #: internet/subsonicservice.cpp:75 msgid "Search Subsonic" msgstr "" #: ui/albumcoverchoicecontroller.cpp:62 msgid "Search for album covers..." msgstr "搜尋專輯封面..." #: ../bin/src/ui_globalsearchview.h:208 msgid "Search for anything" msgstr "搜尋任何東西" #: ../bin/src/ui_gpoddersearchpage.h:76 msgid "Search gpodder.net" msgstr "搜尋 gpodder.net" #: ../bin/src/ui_itunessearchpage.h:76 msgid "Search iTunes" msgstr "搜尋 iTunes" #: ../bin/src/ui_querysearchpage.h:113 msgid "Search mode" msgstr "搜尋模式" #: smartplaylists/querywizardplugin.cpp:154 msgid "Search options" msgstr "搜尋選項" #: internet/groovesharkservice.cpp:569 internet/soundcloudservice.cpp:104 #: internet/spotifyservice.cpp:347 msgid "Search results" msgstr "搜尋結果" #: smartplaylists/querywizardplugin.cpp:152 #: ../bin/src/ui_querysearchpage.h:120 msgid "Search terms" msgstr "搜尋條件" #: internet/groovesharkservice.cpp:270 msgid "Searching on Grooveshark" msgstr "在 Grooveshark 上搜尋" #: ../bin/src/ui_groupbydialog.h:138 msgid "Second level" msgstr "第二個層次" #: core/globalshortcuts.cpp:56 wiimotedev/wiimotesettingspage.cpp:108 msgid "Seek backward" msgstr "倒帶" #: core/globalshortcuts.cpp:55 wiimotedev/wiimotesettingspage.cpp:109 msgid "Seek forward" msgstr "快轉" #: core/commandlineoptions.cpp:163 msgid "Seek the currently playing track by a relative amount" msgstr "藉由相對數字尋找現在播放的曲目" #: core/commandlineoptions.cpp:162 msgid "Seek the currently playing track to an absolute position" msgstr "藉由絕對位置尋找現在播放的曲目" #: visualisations/visualisationselector.cpp:40 msgid "Select All" msgstr "選擇全部" #: visualisations/visualisationselector.cpp:42 msgid "Select None" msgstr "不選取" #: ../bin/src/ui_appearancesettingspage.h:277 msgid "Select background color:" msgstr "選擇背景色:" #: ui/appearancesettingspage.cpp:247 msgid "Select background image" msgstr "選擇背景圖片" #: ../bin/src/ui_trackselectiondialog.h:207 msgid "Select best possible match" msgstr "選擇最佳匹配" #: ../bin/src/ui_appearancesettingspage.h:275 msgid "Select foreground color:" msgstr "選擇前景色:" #: ../bin/src/ui_visualisationselector.h:108 msgid "Select visualizations" msgstr "選取視覺化" #: visualisations/visualisationcontainer.cpp:124 msgid "Select visualizations..." msgstr "選取視覺化..." #: devices/devicekitlister.cpp:124 msgid "Serial number" msgstr "序號" #: ../bin/src/ui_subsonicsettingspage.h:126 msgid "Server URL" msgstr "" #: ../bin/src/ui_subsonicsettingspage.h:125 msgid "Server details" msgstr "" #: internet/lastfmservice.cpp:434 msgid "Service offline" msgstr "服務離線" #: ui/mainwindow.cpp:1394 #, qt-format msgid "Set %1 to \"%2\"..." msgstr "設定 %1 到「%2」..." #: core/commandlineoptions.cpp:157 msgid "Set the volume to percent" msgstr "設定音量到百分之" #: ../bin/src/ui_mainwindow.h:672 msgid "Set value for all selected tracks..." msgstr "為所有選擇的歌曲設定音量..." #: ../bin/src/ui_networkremotesettingspage.h:179 msgid "Settings" msgstr "" #: ../bin/src/ui_globalshortcutssettingspage.h:173 msgid "Shortcut" msgstr "快速鍵" #: ui/globalshortcutssettingspage.cpp:133 #: ../bin/src/ui_globalshortcutssettingspage.h:175 #, qt-format msgid "Shortcut for %1" msgstr "%1 的快速鍵" #: wiimotedev/wiimotesettingspage.cpp:124 #, qt-format msgid "Shortcut for %1 already exists" msgstr "%1 的快速鍵已經存在" #: library/libraryfilterwidget.cpp:61 msgid "Show" msgstr "顯示" #: core/globalshortcuts.cpp:58 wiimotedev/wiimotesettingspage.cpp:111 msgid "Show OSD" msgstr "顯示 OSD" #: ../bin/src/ui_playbacksettingspage.h:298 msgid "Show a glowing animation on the current track" msgstr "顯示一發光動畫在目前播放歌曲上" #: ../bin/src/ui_appearancesettingspage.h:293 msgid "Show a moodbar in the track progress bar" msgstr "" #: ../bin/src/ui_notificationssettingspage.h:434 msgid "Show a native desktop notification" msgstr "顯示一原生桌面通知" #: ../bin/src/ui_notificationssettingspage.h:442 msgid "Show a notification when I change the repeat/shuffle mode" msgstr "當我改變重複 / 隨機播放模式時,顯示一個通知" #: ../bin/src/ui_notificationssettingspage.h:441 msgid "Show a notification when I change the volume" msgstr "當我改變音量時,顯示一個通知" #: ../bin/src/ui_notificationssettingspage.h:436 msgid "Show a popup from the system tray" msgstr "從系統工作列顯示一個彈出訊息" #: ../bin/src/ui_notificationssettingspage.h:435 msgid "Show a pretty OSD" msgstr "顯示一個漂亮的螢幕顯示" #: widgets/nowplayingwidget.cpp:113 msgid "Show above status bar" msgstr "顯示在狀態欄上方" #: ui/mainwindow.cpp:460 msgid "Show all songs" msgstr "顯示所有歌曲" #: ../bin/src/ui_querysortpage.h:141 msgid "Show all the songs" msgstr "顯示所有的歌曲" #: ../bin/src/ui_librarysettingspage.h:209 msgid "Show cover art in library" msgstr "在音樂庫,顯示封面圖片" #: ../bin/src/ui_librarysettingspage.h:210 msgid "Show dividers" msgstr "顯示分隔線" #: ui/albumcoverchoicecontroller.cpp:64 widgets/prettyimage.cpp:183 msgid "Show fullsize..." msgstr "全螢幕..." #: library/libraryview.cpp:399 ui/mainwindow.cpp:508 #: widgets/fileviewlist.cpp:52 msgid "Show in file browser..." msgstr "在檔案瀏覽器顯示..." #: library/libraryview.cpp:403 msgid "Show in various artists" msgstr "顯示各演出者" #: moodbar/moodbarproxystyle.cpp:337 msgid "Show moodbar" msgstr "" #: ui/mainwindow.cpp:461 msgid "Show only duplicates" msgstr "只顯示重複的" #: ui/mainwindow.cpp:462 msgid "Show only untagged" msgstr "只顯示未標記的" #: ../bin/src/ui_globalsearchsettingspage.h:153 msgid "Show search suggestions" msgstr "" #: ../bin/src/ui_lastfmsettingspage.h:157 msgid "Show the \"love\" and \"ban\" buttons" msgstr "顯示 [喜愛] 和 [禁止] 按鈕" #: ../bin/src/ui_lastfmsettingspage.h:158 msgid "Show the scrobble button in the main window" msgstr "在主視窗顯示 scrobble 的按鈕" #: ../bin/src/ui_behavioursettingspage.h:192 msgid "Show tray icon" msgstr "顯示工作列圖示" #: ../bin/src/ui_globalsearchsettingspage.h:152 msgid "Show which sources are enabled and disabled" msgstr "" #: core/globalshortcuts.cpp:57 msgid "Show/Hide" msgstr "顯示 / 隱藏" #: playlist/playlistsequence.cpp:173 ../bin/src/ui_playlistsequence.h:115 msgid "Shuffle" msgstr "隨機播放" #: widgets/osd.cpp:276 ../bin/src/ui_playlistsequence.h:110 msgid "Shuffle albums" msgstr "隨機播放專輯" #: widgets/osd.cpp:274 ../bin/src/ui_playlistsequence.h:109 msgid "Shuffle all" msgstr "隨機播放所有歌曲" #: ../bin/src/ui_mainwindow.h:679 msgid "Shuffle playlist" msgstr "隨機排列播放清單" #: widgets/osd.cpp:275 ../bin/src/ui_playlistsequence.h:108 msgid "Shuffle tracks in this album" msgstr "隨機播放這張專輯中的曲目" #: ../bin/src/ui_podcastsettingspage.h:252 msgid "Sign in" msgstr "登錄" #: ../bin/src/ui_loginstatewidget.h:173 msgid "Sign out" msgstr "登出" #: ../bin/src/ui_loginstatewidget.h:175 msgid "Signing in..." msgstr "登錄..." #: songinfo/echonestsimilarartists.cpp:57 msgid "Similar artists" msgstr "相似的演出者" #: ../bin/src/ui_albumcoverexport.h:212 msgid "Size" msgstr "" #: ../bin/src/ui_albumcoverexport.h:214 msgid "Size:" msgstr "" #: ui/equalizer.cpp:129 msgid "Ska" msgstr "強節奏流行音樂" #: core/commandlineoptions.cpp:155 msgid "Skip backwards in playlist" msgstr "跳至播放清單開頭" #: playlist/playlist.cpp:1221 ../bin/src/ui_edittagdialog.h:669 msgid "Skip count" msgstr "略過計數" #: core/commandlineoptions.cpp:156 msgid "Skip forwards in playlist" msgstr "跳至播放清單最後頭" #: widgets/nowplayingwidget.cpp:90 msgid "Small album cover" msgstr "小的專輯封面" #: widgets/fancytabwidget.cpp:671 msgid "Small sidebar" msgstr "小型測邊欄" #: smartplaylists/wizard.cpp:68 msgid "Smart playlist" msgstr "智慧型播放清單" #: library/librarymodel.cpp:1172 msgid "Smart playlists" msgstr "智慧型播放清單" #: ui/equalizer.cpp:128 msgid "Soft" msgstr "輕柔的音樂" #: ui/equalizer.cpp:130 msgid "Soft Rock" msgstr "比較輕柔的搖滾樂" #: ../bin/src/ui_songinfosettingspage.h:179 msgid "Song Information" msgstr "歌曲資訊" #: ui/mainwindow.cpp:241 msgid "Song info" msgstr "歌曲" #: analyzers/sonogram.cpp:18 msgid "Sonogram" msgstr "" #: ../bin/src/ui_trackselectiondialog.h:205 msgid "Sorry" msgstr "不好意思" #: ../bin/src/ui_icecastfilterwidget.h:75 msgid "Sort by genre (alphabetically)" msgstr "按風格排序(按字母順序排列)" #: ../bin/src/ui_icecastfilterwidget.h:76 msgid "Sort by genre (by popularity)" msgstr "按風格排序(按熱門程度)" #: ../bin/src/ui_icecastfilterwidget.h:77 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 "分類" #: playlist/playlist.cpp:1236 msgid "Source" msgstr "來源" #: ../bin/src/ui_globalsearchsettingspage.h:146 msgid "Sources" msgstr "來源" #: ../bin/src/ui_transcodersettingspage.h:178 msgid "Speex" msgstr "Speex" #: ../bin/src/ui_spotifysettingspage.h:207 msgid "Spotify" msgstr "Spotify" #: internet/spotifyservice.cpp:184 msgid "Spotify login error" msgstr "Spotify 登錄錯誤" #: ../bin/src/ui_spotifysettingspage.h:212 msgid "Spotify plugin" msgstr "Spotify 插件" #: internet/spotifyblobdownloader.cpp:59 msgid "Spotify plugin not installed" msgstr "Spotify 插件沒有安裝" #: ../bin/src/ui_transcoderoptionsmp3.h:201 msgid "Standard" msgstr "標準" #: internet/spotifyservice.cpp:354 msgid "Starred" msgstr "已標記星號" #: core/commandlineoptions.cpp:151 msgid "Start the playlist currently playing" msgstr "開始播放目前播放清單" #: transcoder/transcodedialog.cpp:88 msgid "Start transcoding" msgstr "開始轉碼" #: internet/groovesharkservice.cpp:570 internet/soundcloudservice.cpp:105 #: internet/spotifyservice.cpp:348 msgid "" "Start typing something on the search box above to fill this search results " "list" msgstr "" #: transcoder/transcoder.cpp:405 #, qt-format msgid "Starting %1" msgstr "標記星號 %1" #: internet/magnatunedownloaddialog.cpp:120 msgid "Starting..." msgstr "開啟..." #: internet/groovesharkservice.cpp:598 msgid "Stations" msgstr "" #: core/globalshortcuts.cpp:48 ../bin/src/ui_mainwindow.h:652 #: wiimotedev/wiimotesettingspage.cpp:102 msgid "Stop" msgstr "停止" #: wiimotedev/wiimotesettingspage.cpp:110 msgid "Stop after" msgstr "在...之後停止" #: ui/mainwindow.cpp:489 ../bin/src/ui_mainwindow.h:658 msgid "Stop after this track" msgstr "在這首歌之後停止" #: core/commandlineoptions.cpp:154 msgid "Stop playback" msgstr "停止播放" #: core/globalshortcuts.cpp:49 msgid "Stop playing after current track" msgstr "在目前這首歌之後停止" #: widgets/osd.cpp:166 msgid "Stopped" msgstr "已停止" #: core/song.cpp:341 msgid "Stream" msgstr "串流" #: internet/subsonicsettingspage.cpp:30 msgid "" "Streaming from a Subsonic server requires a valid server license after the " "30-day trial period." msgstr "" #: ../bin/src/ui_magnatunesettingspage.h:160 msgid "Streaming membership" msgstr "串流成員" #: internet/groovesharkservice.cpp:629 msgid "Subscribed playlists" msgstr "" #: ../bin/src/ui_podcastinfowidget.h:196 msgid "Subscribers" msgstr "" #: internet/subsonicservice.cpp:105 ../bin/src/ui_subsonicsettingspage.h:124 msgid "Subsonic" msgstr "" #: ../data/oauthsuccess.html:34 msgid "Success!" msgstr "" #: transcoder/transcoder.cpp:200 #, qt-format msgid "Successfully written %1" msgstr "成功寫入 %1" #: ui/trackselectiondialog.cpp:171 msgid "Suggested tags" msgstr "建議標籤" #: ../bin/src/ui_edittagdialog.h:681 #: ../bin/src/ui_notificationssettingspage.h:448 msgid "Summary" msgstr "摘要" #: analyzers/analyzercontainer.cpp:65 #: visualisations/visualisationcontainer.cpp:110 #, qt-format msgid "Super high (%1 fps)" msgstr "超級高(%1 fps)" #: visualisations/visualisationcontainer.cpp:120 msgid "Super high (2048x2048)" msgstr "" #: ../bin/src/ui_deviceproperties.h:374 msgid "Supported formats" msgstr "支持格式" #: ../bin/src/ui_librarysettingspage.h:201 msgid "Synchronize statistics to files now" msgstr "" #: internet/spotifyservice.cpp:561 msgid "Syncing Spotify inbox" msgstr "同步 Spotify 的收件匣" #: internet/spotifyservice.cpp:556 msgid "Syncing Spotify playlist" msgstr "同步 Spotify 的播放清單" #: internet/spotifyservice.cpp:565 msgid "Syncing Spotify starred tracks" msgstr "同步 Spotify 的星號標記曲目" #: moodbar/moodbarrenderer.cpp:159 msgid "System colors" msgstr "系統顏色" #: widgets/fancytabwidget.cpp:673 msgid "Tabs on top" msgstr "標籤在上面" #: ../bin/src/ui_lastfmstationdialog.h:97 msgid "Tag" msgstr "標記" #: ../bin/src/ui_trackselectiondialog.h:204 msgid "Tag fetcher" msgstr "標籤擷取器" #: internet/lastfmservice.cpp:212 msgid "Tag radio" msgstr "標記電台" #: ../bin/src/ui_transcoderoptionsvorbis.h:204 msgid "Target bitrate" msgstr "目標位元率" #: ui/equalizer.cpp:131 msgid "Techno" msgstr "電子音樂" #: ../bin/src/ui_notificationssettingspage.h:460 msgid "Text options" msgstr "文字選項" #: ui/about.cpp:70 msgid "Thanks to" msgstr "感謝" #: ui/globalshortcutssettingspage.cpp:175 #, qt-format msgid "The \"%1\" command could not be started." msgstr "無法開始指令\"%1\"" #: ../bin/src/ui_appearancesettingspage.h:282 msgid "The album cover of the currently playing song" msgstr "目前播放歌曲的專輯封面" #: internet/magnatunedownloaddialog.cpp:90 #, qt-format msgid "The directory %1 is not valid" msgstr "目錄%1是無效的" #: playlist/playlistmanager.cpp:166 playlist/playlistmanager.cpp:184 #, qt-format msgid "The playlist '%1' was empty or could not be loaded." msgstr "播放清單 '%1' 為空白或無法讀取。" #: smartplaylists/searchtermwidget.cpp:330 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:82 msgid "The site you requested is not an image!" msgstr "您要求的網址不是一個圖片!" #: internet/subsonicsettingspage.cpp:98 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:2083 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:529 msgid "There are other songs in this album" msgstr "有其他歌曲在這張專輯中" #: podcasts/gpoddersearchpage.cpp:77 podcasts/gpoddertoptagsmodel.cpp:110 #: podcasts/gpoddertoptagspage.cpp:77 msgid "There was a problem communicating with gpodder.net" msgstr "與 gpodder.net 進行通信有一個問題" #: internet/magnatunedownloaddialog.cpp:158 msgid "There was a problem fetching the metadata from Magnatune" msgstr "從 Magnatune 獲取詮釋資料有一個問題" #: podcasts/itunessearchpage.cpp:76 msgid "There was a problem parsing the response from the iTunes Store" msgstr "" #: ui/organiseerrordialog.cpp:56 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:389 msgid "" "These files will be deleted from the device, are you sure you want to " "continue?" msgstr "這些檔案將從裝置上被移除,你確定你要繼續?" #: library/libraryview.cpp:609 ui/mainwindow.cpp:1906 widgets/fileview.cpp:188 msgid "" "These files will be permanently deleted from disk, are you sure you want to " "continue?" msgstr "" #: ../bin/src/ui_librarysettingspage.h:187 msgid "These folders will be scanned for music to make up your library" msgstr "這些資料夾將被掃描是否有音樂檔,以建構您的音樂庫。" #: ../bin/src/ui_transcodersettingspage.h:174 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:151 msgid "Third level" msgstr "第三個層次" #: internet/jamendoservice.cpp:171 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/magnatunedownloaddialog.cpp:175 msgid "This album is not available in the requested format" msgstr "這張專輯中不提供所要求的格式" #: ../bin/src/ui_deviceproperties.h:381 msgid "" "This device must be connected and opened before Clementine can see what file" " formats it supports." msgstr "裝置必須在 Clementine 發現可支援的檔案格式前連接並開啟。" #: ../bin/src/ui_deviceproperties.h:375 msgid "This device supports the following file formats:" msgstr "裝置支援以下檔案格式:" #: devices/devicemanager.cpp:566 devices/devicemanager.cpp:574 msgid "This device will not work properly" msgstr "裝置將無法正常運作" #: devices/devicemanager.cpp:567 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:324 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:186 msgid "This option can be changed in the \"Behavior\" preferences" msgstr "" #: internet/lastfmservice.cpp:435 msgid "This stream is for paid subscribers only" msgstr "此串流音樂是只針對付費用戶" #: devices/devicemanager.cpp:587 #, qt-format msgid "This type of device is not supported: %1" msgstr "這種裝置不被支援: %1" #: ../bin/src/ui_songinfosettingspage.h:185 msgid "Timeout" msgstr "逾時" #: playlist/playlist.cpp:1206 ui/organisedialog.cpp:54 #: ui/qtsystemtrayicon.cpp:248 ../bin/src/ui_about.h:142 #: ../bin/src/ui_edittagdialog.h:682 ../bin/src/ui_trackselectiondialog.h:211 msgid "Title" msgstr "標題" #: internet/groovesharkservice.cpp:1018 msgid "" "To start Grooveshark radio, you should first listen to a few other " "Grooveshark songs" msgstr "" #: core/utilities.cpp:125 core/utilities.cpp:141 msgid "Today" msgstr "今日" #: core/globalshortcuts.cpp:59 msgid "Toggle Pretty OSD" msgstr "" #: visualisations/visualisationcontainer.cpp:101 msgid "Toggle fullscreen" msgstr "切換全螢幕模式" #: ui/mainwindow.cpp:1369 msgid "Toggle queue status" msgstr "切換佇列狀態" #: ../bin/src/ui_mainwindow.h:718 msgid "Toggle scrobbling" msgstr "切換 scrobbling" #: core/commandlineoptions.cpp:171 msgid "Toggle visibility for the pretty on-screen-display" msgstr "" #: core/utilities.cpp:143 msgid "Tomorrow" msgstr "" #: podcasts/podcasturlloader.cpp:116 msgid "Too many redirects" msgstr "" #: internet/spotifyservice.cpp:366 msgid "Top tracks" msgstr "" #: ../bin/src/ui_albumcovermanager.h:221 msgid "Total albums:" msgstr "" #: covers/coversearchstatisticsdialog.cpp:71 msgid "Total bytes transferred" msgstr "總傳輸位元組" #: covers/coversearchstatisticsdialog.cpp:68 msgid "Total network requests made" msgstr "總發送網路請求" #: playlist/playlist.cpp:1210 ui/organisedialog.cpp:62 #: ../bin/src/ui_edittagdialog.h:683 ../bin/src/ui_trackselectiondialog.h:213 msgid "Track" msgstr "歌曲" #: ../bin/src/ui_transcodedialog.h:202 ../bin/src/ui_mainwindow.h:697 msgid "Transcode Music" msgstr "音樂轉碼" #: ../bin/src/ui_transcodelogdialog.h:63 msgid "Transcoder Log" msgstr "轉碼日誌" #: ../bin/src/ui_transcodersettingspage.h:173 msgid "Transcoding" msgstr "轉碼" #: transcoder/transcoder.cpp:312 #, qt-format msgid "Transcoding %1 files using %2 threads" msgstr "轉碼 %1 個檔案使用 %2 個進程" #: ../bin/src/ui_transcoderoptionsdialog.h:54 msgid "Transcoding options" msgstr "轉碼選項" #: core/song.cpp:338 msgid "TrueAudio" msgstr "" #: analyzers/turbine.cpp:15 msgid "Turbine" msgstr "" #: ../bin/src/ui_dynamicplaylistcontrols.h:113 msgid "Turn off" msgstr "關閉" #: devices/giolister.cpp:161 msgid "URI" msgstr "" #: core/commandlineoptions.cpp:150 msgid "URL(s)" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:127 msgid "Ubuntu One" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:132 msgid "Ubuntu One password" msgstr "" #: ../bin/src/ui_ubuntuonesettingspage.h:130 msgid "Ubuntu One username" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:228 msgid "Ultra wide band (UWB)" msgstr "超寬頻 (UWB)" #: internet/magnatunedownloaddialog.cpp:144 #, qt-format msgid "Unable to download %1 (%2)" msgstr "" #: core/song.cpp:345 library/librarymodel.cpp:308 library/librarymodel.cpp:313 #: library/librarymodel.cpp:970 playlist/playlistdelegates.cpp:309 #: playlist/playlistmanager.cpp:505 playlist/playlistmanager.cpp:508 #: ui/albumcoverchoicecontroller.cpp:110 ui/edittagdialog.cpp:424 #: ui/edittagdialog.cpp:465 msgid "Unknown" msgstr "未知的" #: podcasts/podcasturlloader.cpp:198 msgid "Unknown content-type" msgstr "未知的內容類型" #: internet/digitallyimportedclient.cpp:69 internet/lastfmservice.cpp:448 msgid "Unknown error" msgstr "不明的錯誤" #: ui/albumcoverchoicecontroller.cpp:63 msgid "Unset cover" msgstr "未設置封面" #: podcasts/addpodcastdialog.cpp:61 podcasts/podcastservice.cpp:277 msgid "Unsubscribe" msgstr "" #: songinfo/songkickconcerts.cpp:168 msgid "Upcoming Concerts" msgstr "" #: internet/groovesharkservice.cpp:1200 msgid "Update Grooveshark playlist" msgstr "更新 Grooveshark 播放清單" #: podcasts/podcastservice.cpp:260 msgid "Update all podcasts" msgstr "更新全部的 podcasts" #: ../bin/src/ui_mainwindow.h:709 msgid "Update changed library folders" msgstr "更新改變的音樂庫資料夾" #: ../bin/src/ui_librarysettingspage.h:191 msgid "Update the library when Clementine starts" msgstr "當啟動 Clementine 時,更新音樂庫" #: podcasts/podcastservice.cpp:268 msgid "Update this podcast" msgstr "更新這個 podcast" #: ../bin/src/ui_podcastsettingspage.h:227 msgid "Updating" msgstr "更新" #: library/librarywatcher.cpp:92 #, qt-format msgid "Updating %1" msgstr "更新 %1" #: devices/deviceview.cpp:103 #, qt-format msgid "Updating %1%..." msgstr "更新 %1%..." #: library/librarywatcher.cpp:90 msgid "Updating library" msgstr "正在更新音樂庫" #: core/commandlineoptions.cpp:150 msgid "Usage" msgstr "使用" #: ../bin/src/ui_lastfmsettingspage.h:159 msgid "Use Album Artist tag when available" msgstr "當有可以用時,使用專輯演出者標籤" #: ../bin/src/ui_globalshortcutssettingspage.h:168 msgid "Use Gnome's shortcut keys" msgstr "使用 Gnome 的快速鍵" #: ../bin/src/ui_playbacksettingspage.h:310 msgid "Use Replay Gain metadata if it is available" msgstr "使用回放增益元數據,如果它是可獲得的" #: ../bin/src/ui_subsonicsettingspage.h:129 msgid "Use SSLv3" msgstr "" #: ../bin/src/ui_wiimotesettingspage.h:189 msgid "Use Wii Remote" msgstr "使用 Wii 遙控器" #: ../bin/src/ui_appearancesettingspage.h:274 msgid "Use a custom color set" msgstr "使用自訂顏色組合" #: ../bin/src/ui_notificationssettingspage.h:445 msgid "Use a custom message for notifications" msgstr "使用自訂訊息的通知" #: ../bin/src/ui_networkremotesettingspage.h:178 msgid "Use a network remote control" msgstr "" #: ../bin/src/ui_networkproxysettingspage.h:167 msgid "Use authentication" msgstr "使用認證" #: ../bin/src/ui_transcoderoptionsvorbis.h:203 msgid "Use bitrate management engine" msgstr "使用位元率管理引擎" #: ../bin/src/ui_wizardfinishpage.h:85 msgid "Use dynamic mode" msgstr "使用動態模式" #: ../bin/src/ui_wiimotesettingspage.h:188 msgid "Use notifications to report Wii Remote status" msgstr "使用通知信息以報告 Wii 遙控器的狀態" #: ../bin/src/ui_transcoderoptionsaac.h:139 msgid "Use temporal noise shaping" msgstr "使用時域雜訊重整" #: ../bin/src/ui_behavioursettingspage.h:198 msgid "Use the system default" msgstr "使用系統預設" #: ../bin/src/ui_appearancesettingspage.h:273 msgid "Use the system default color set" msgstr "使用系統預設的顏色組合" #: ../bin/src/ui_networkproxysettingspage.h:158 msgid "Use the system proxy settings" msgstr "使用系統代理設置" #: ../bin/src/ui_spotifysettingspage.h:218 msgid "Use volume normalisation" msgstr "使用音量正常化" #: widgets/freespacebar.cpp:47 msgid "Used" msgstr "已用" #: internet/groovesharkservice.cpp:404 #, qt-format msgid "User %1 doesn't have a Grooveshark Anywhere account" msgstr "" #: ui/settingsdialog.cpp:147 msgid "User interface" msgstr "使用者介面" #: ../bin/src/ui_groovesharksettingspage.h:114 #: ../bin/src/ui_magnatunesettingspage.h:163 #: ../bin/src/ui_spotifysettingspage.h:209 #: ../bin/src/ui_subsonicsettingspage.h:127 #: ../bin/src/ui_podcastsettingspage.h:251 #: ../bin/src/ui_networkproxysettingspage.h:168 msgid "Username" msgstr "使用者名稱" #: ../bin/src/ui_behavioursettingspage.h:207 msgid "Using the menu to add a song will..." msgstr "使用選單加入的歌曲將..." #: ../bin/src/ui_magnatunedownloaddialog.h:142 #: ../bin/src/ui_magnatunesettingspage.h:173 msgid "VBR MP3" msgstr "VBR MP3" #: ../bin/src/ui_transcoderoptionsspeex.h:232 msgid "Variable bit rate" msgstr "可變位元率" #: globalsearch/globalsearchmodel.cpp:104 library/librarymodel.cpp:241 #: playlist/playlistmanager.cpp:520 ui/albumcovermanager.cpp:266 msgid "Various artists" msgstr "各種演出者" #: ui/about.cpp:34 #, qt-format msgid "Version %1" msgstr "版本 %1" #: ../bin/src/ui_albumcovermanager.h:220 msgid "View" msgstr "檢視" #: ../bin/src/ui_visualisationselector.h:109 msgid "Visualization mode" msgstr "視覺化模式" #: ../bin/src/ui_mainwindow.h:710 ui/dbusscreensaver.cpp:35 msgid "Visualizations" msgstr "視覺化" #: ../bin/src/ui_visualisationoverlay.h:185 msgid "Visualizations Settings" msgstr "視覺化設定" #: ../bin/src/ui_transcoderoptionsspeex.h:233 msgid "Voice activity detection" msgstr "語音活動偵測" #: widgets/osd.cpp:180 #, qt-format msgid "Volume %1%" msgstr "音量 %1%" #: ../bin/src/ui_transcodersettingspage.h:176 msgid "Vorbis" msgstr "" #: ../bin/src/ui_magnatunedownloaddialog.h:141 #: ../bin/src/ui_magnatunesettingspage.h:172 msgid "WAV" msgstr "WAV" #: ../bin/src/ui_transcodersettingspage.h:180 msgid "WMA" msgstr "WMA" #: playlist/playlisttabbar.cpp:182 ../bin/src/ui_behavioursettingspage.h:194 msgid "Warn me when closing a playlist tab" msgstr "" #: core/song.cpp:337 msgid "Wav" msgstr "Wav" #: ../bin/src/ui_podcastinfowidget.h:193 msgid "Website" msgstr "網站" #: smartplaylists/searchterm.cpp:312 msgid "Weeks" msgstr "星期" #: ../bin/src/ui_behavioursettingspage.h:201 msgid "When Clementine starts" msgstr "當 Clementine 啟動" #: ../bin/src/ui_librarysettingspage.h:204 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_globalsearchsettingspage.h:151 msgid "When the list is empty..." msgstr "" #: ../bin/src/ui_globalsearchview.h:212 msgid "Why not try..." msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:229 msgid "Wide band (WB)" msgstr "寬頻 (WB)" #: widgets/osd.cpp:239 #, qt-format msgid "Wii Remote %1: actived" msgstr "Wii 遙控器 %1 :起作用的" #: widgets/osd.cpp:249 #, qt-format msgid "Wii Remote %1: connected" msgstr "Wii Remote %1: 連接的" #: widgets/osd.cpp:264 #, qt-format msgid "Wii Remote %1: critical battery (%2%) " msgstr "Wii Remote %1: 電池電量嚴重不足 (%2%) " #: widgets/osd.cpp:244 #, qt-format msgid "Wii Remote %1: disactived" msgstr "Wii Remote %1: 沒作用的" #: widgets/osd.cpp:254 #, qt-format msgid "Wii Remote %1: disconnected" msgstr "Wii Remote %1: 未連接的" #: widgets/osd.cpp:259 #, qt-format msgid "Wii Remote %1: low battery (%2%)" msgstr "Wii Remote %1: 電池電量不足 (%2%)" #: ../bin/src/ui_wiimotesettingspage.h:182 msgid "Wiimotedev" msgstr "Wii 遙控裝置" #: ../bin/src/ui_digitallyimportedsettingspage.h:181 msgid "Windows Media 128k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:172 msgid "Windows Media 40k" msgstr "" #: ../bin/src/ui_digitallyimportedsettingspage.h:180 msgid "Windows Media 64k" msgstr "" #: core/song.cpp:327 msgid "Windows Media audio" msgstr "" #: ../bin/src/ui_albumcovermanager.h:222 msgid "Without cover:" msgstr "" #: library/libraryview.cpp:530 msgid "" "Would you like to move the other songs in this album to Various Artists as " "well?" msgstr "" #: ui/mainwindow.cpp:2088 msgid "Would you like to run a full rescan right now?" msgstr "" #: library/librarysettingspage.cpp:151 msgid "Write all songs statistics into songs' files" msgstr "" #: internet/subsonicsettingspage.cpp:86 msgid "Wrong username or password." msgstr "" #: playlist/playlist.cpp:1212 ui/organisedialog.cpp:65 #: ../bin/src/ui_groupbydialog.h:135 ../bin/src/ui_groupbydialog.h:148 #: ../bin/src/ui_groupbydialog.h:161 ../bin/src/ui_edittagdialog.h:687 #: ../bin/src/ui_trackselectiondialog.h:212 msgid "Year" msgstr "年份" #: ../bin/src/ui_groupbydialog.h:136 ../bin/src/ui_groupbydialog.h:149 #: ../bin/src/ui_groupbydialog.h:162 msgid "Year - Album" msgstr "年份 - 專輯" #: smartplaylists/searchterm.cpp:314 msgid "Years" msgstr "年" #: core/utilities.cpp:127 msgid "Yesterday" msgstr "昨天" #: ../bin/src/ui_magnatunedownloaddialog.h:132 msgid "You are about to download the following albums" msgstr "您將要下載以下專輯" #: playlist/playlistlistcontainer.cpp:311 #, qt-format msgid "" "You are about to remove %1 playlists from your favorites, are you sure?" msgstr "" #: playlist/playlisttabbar.cpp:177 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:172 msgid "You are not signed in." msgstr "您還沒有登錄。" #: widgets/loginstatewidget.cpp:75 #, qt-format msgid "You are signed in as %1." msgstr "您是登錄為 %1。" #: widgets/loginstatewidget.cpp:73 msgid "You are signed in." msgstr "您已登錄。" #: ../bin/src/ui_groupbydialog.h:123 msgid "You can change the way the songs in the library are organised." msgstr "您可以改變音樂庫中歌曲的組織方式。" #: internet/digitallyimportedsettingspage.cpp:46 msgid "" "You can listen for free without an account, but Premium members can listen " "to higher quality streams without advertisements." msgstr "您可以收聽免費的而不需要帳號,但高級會員可以收聽沒有廣告且更高品質的串流。" #: internet/magnatunesettingspage.cpp:53 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:57 msgid "You can listen to background streams at the same time as other music." msgstr "您可以在同一時間聽「背景串流」和其他音樂。" #: internet/lastfmsettingspage.cpp:148 msgid "" "You can scrobble tracks for free, but only paid subscribers can stream Last.fm radio from " "Clementine." msgstr "您可以免費 scrobble 曲目,但只有 付費用戶 可以透過 Clementine 串流 Last.fm 電台。" #: ../bin/src/ui_wiimotesettingspage.h:184 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/groovesharksettingspage.cpp:103 msgid "You do not have a Grooveshark Anywhere account." msgstr "" #: internet/spotifysettingspage.cpp:149 msgid "You do not have a Spotify Premium account." msgstr "您沒有 Spotify 的高級帳戶。" #: internet/digitallyimportedclient.cpp:89 msgid "You do not have an active subscription" msgstr "" #: internet/spotifyservice.cpp:170 msgid "" "You have been logged out of Spotify, please re-enter your password in the " "Settings dialog." msgstr "您已經登出 Spotify,請重新在設置對話框中輸入您的密碼。" #: internet/spotifysettingspage.cpp:158 msgid "You have been logged out of Spotify, please re-enter your password." msgstr "您已經登出Spotify,請重新輸入您的密碼。" #: songinfo/lastfmtrackinfoprovider.cpp:87 msgid "You love this track" msgstr "您愛這首歌曲" #: ../bin/src/ui_globalshortcutssettingspage.h:170 msgid "" "You need to launch System Preferences and turn on \"Enable access for assistive devices\" to use global " "shortcuts in Clementine." msgstr "" #: ../bin/src/ui_behavioursettingspage.h:200 msgid "You will need to restart Clementine if you change the language." msgstr "您將需要重新啟動 Clementine ,如果您變更了本程式使用者介面所用的語言。" #: internet/lastfmsettingspage.cpp:114 msgid "" "You will not be able to play Last.fm radio stations as you are not a Last.fm" " subscriber." msgstr "" #: ../bin/src/ui_networkremotesettingspage.h:200 msgid "Your IP address:" msgstr "" #: internet/lastfmsettingspage.cpp:80 msgid "Your Last.fm credentials were incorrect" msgstr "" #: internet/magnatunesettingspage.cpp:113 msgid "Your Magnatune credentials were incorrect" msgstr "您的 Magnatune 的憑證是不正確的" #: library/libraryview.cpp:343 msgid "Your library is empty!" msgstr "您的音樂庫是空的!" #: globalsearch/savedradiosearchprovider.cpp:28 internet/savedradio.cpp:49 msgid "Your radio streams" msgstr "您的電台" #: songinfo/lastfmtrackinfoprovider.cpp:88 #, qt-format msgid "Your scrobbles: %1" msgstr "" #: visualisations/visualisationcontainer.cpp:152 msgid "Your system is missing OpenGL support, visualizations are unavailable." msgstr "" #: internet/groovesharksettingspage.cpp:107 #: internet/spotifysettingspage.cpp:154 internet/ubuntuonesettingspage.cpp:76 msgid "Your username or password was incorrect." msgstr "" #: smartplaylists/searchterm.cpp:297 msgid "Z-A" msgstr "" #: ui/equalizer.cpp:132 msgid "Zero" msgstr "" #: playlist/playlistundocommands.cpp:37 #, c-format msgid "add %n songs" msgstr "加入 %n 歌" #: smartplaylists/searchterm.cpp:205 msgid "after" msgstr "" #: ../bin/src/ui_searchtermwidget.h:270 msgid "ago" msgstr "" #: ../bin/src/ui_searchtermwidget.h:269 msgid "and" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:219 msgid "automatic" msgstr "自動" #: smartplaylists/searchterm.cpp:206 msgid "before" msgstr "" #: smartplaylists/searchterm.cpp:211 msgid "between" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "biggest first" msgstr "" #: playlist/playlistview.cpp:204 ui/edittagdialog.cpp:458 msgid "bpm" msgstr "bpm" #: smartplaylists/searchterm.cpp:217 msgid "contains" msgstr "" #: ../bin/src/ui_transcoderoptionsspeex.h:222 #: ../bin/src/ui_transcoderoptionsvorbis.h:207 #: ../bin/src/ui_transcoderoptionsvorbis.h:210 msgid "disabled" msgstr "禁用" #: widgets/osd.cpp:114 #, qt-format msgid "disc %1" msgstr "光碟%1" #: smartplaylists/searchterm.cpp:218 msgid "does not contain" msgstr "不包含" #: smartplaylists/searchterm.cpp:220 msgid "ends with" msgstr "" #: smartplaylists/searchterm.cpp:223 msgid "equals" msgstr "相等" #: ../bin/src/ui_podcastsettingspage.h:249 msgid "gpodder.net" msgstr "gpodder.net" #: podcasts/gpoddertoptagspage.cpp:34 msgid "gpodder.net directory" msgstr "gpodder.net 目錄" #: smartplaylists/searchterm.cpp:221 msgid "greater than" msgstr "" #: smartplaylists/searchterm.cpp:209 msgid "in the last" msgstr "" #: playlist/playlistview.cpp:206 ui/edittagdialog.cpp:460 #: internet/spotifysettingspage.cpp:60 internet/spotifysettingspage.cpp:61 #: internet/spotifysettingspage.cpp:62 msgid "kbps" msgstr "kbps" #: smartplaylists/searchterm.cpp:222 msgid "less than" msgstr "少於" #: smartplaylists/searchterm.cpp:299 msgid "longest first" msgstr "最長優先" #: playlist/playlistundocommands.cpp:99 #, c-format msgid "move %n songs" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "newest first" msgstr "最新優先" #: smartplaylists/searchterm.cpp:224 msgid "not equals" msgstr "不相等" #: smartplaylists/searchterm.cpp:210 msgid "not in the last" msgstr "" #: smartplaylists/searchterm.cpp:208 msgid "not on" msgstr "" #: smartplaylists/searchterm.cpp:298 msgid "oldest first" msgstr "最舊優先" #: smartplaylists/searchterm.cpp:207 msgid "on" msgstr "" #: core/commandlineoptions.cpp:150 msgid "options" msgstr "選項" #: ../bin/src/ui_networkremotesettingspage.h:203 msgid "or scan the QR code!" msgstr "" #: widgets/didyoumean.cpp:56 msgid "press enter" msgstr "按下Enter" #: playlist/playlistundocommands.cpp:65 playlist/playlistundocommands.cpp:88 #, c-format msgid "remove %n songs" msgstr "移除 %n 歌" #: smartplaylists/searchterm.cpp:299 msgid "shortest first" msgstr "最短優先" #: playlist/playlistundocommands.cpp:138 msgid "shuffle songs" msgstr "" #: smartplaylists/searchterm.cpp:301 msgid "smallest first" msgstr "最小優先" #: playlist/playlistundocommands.cpp:131 msgid "sort songs" msgstr "" #: smartplaylists/searchterm.cpp:219 msgid "starts with" msgstr "" #: playlist/playlistdelegates.cpp:180 msgid "stop" msgstr "停止" #: widgets/osd.cpp:116 #, qt-format msgid "track %1" msgstr "歌曲 %1" clementine-1.2.0+dfsg/src/ui/000077500000000000000000000000001223327513400157625ustar00rootroot00000000000000clementine-1.2.0+dfsg/src/ui/about.cpp000066400000000000000000000073721223327513400176110ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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"); 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")); foreach (const Person& person, authors_) ret += "
" + MakeHtml(person); ret += QString("

%3:").arg(tr("Thanks to")); foreach (const Person& person, thanks_to_) ret += "
" + MakeHtml(person); ret += QString("
" + tr("All the translators") + " <" "https://www.transifex.net/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.0+dfsg/src/ui/about.h000066400000000000000000000024631223327513400172520ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); 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.0+dfsg/src/ui/about.ui000066400000000000000000000103451223327513400174360ustar00rootroot00000000000000 About 0 0 652 470 :/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.0+dfsg/src/ui/addstreamdialog.cpp000066400000000000000000000053121223327513400216130ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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/internetmodel.h" #include "internet/savedradio.h" #include #include #include #include const char* AddStreamDialog::kSettingsGroup = "AddStreamDialog"; AddStreamDialog::AddStreamDialog(QWidget *parent) : QDialog(parent), ui_(new Ui_AddStreamDialog), saved_radio_(NULL) { 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.0+dfsg/src/ui/addstreamdialog.h000066400000000000000000000027161223327513400212650ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); ~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.0+dfsg/src/ui/addstreamdialog.ui000066400000000000000000000065351223327513400214560ustar00rootroot00000000000000 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.0+dfsg/src/ui/albumcoverchoicecontroller.cpp000066400000000000000000000220771223327513400241140ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "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 = NULL; AlbumCoverChoiceController::AlbumCoverChoiceController(QWidget* parent) : QWidget(parent), app_(NULL), cover_searcher_(NULL), cover_fetcher_(NULL), save_file_dialog_(NULL), cover_from_url_dialog_(NULL) { 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); 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_); } 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(); dialog->setWindowTitle(title_text); QLabel* label = new QLabel(dialog); label->setPixmap(AlbumCoverLoader::TryLoadPixmap( song.art_automatic(), song.art_manual(), song.url().toLocalFile())); dialog->resize(label->pixmap()->size()); dialog->show(); } 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 QCryptographicHash hash(QCryptographicHash::Sha1); hash.addData(artist.toLower().toUtf8().constData()); hash.addData(album.toLower().toUtf8().constData()); QString filename(hash.result().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) { foreach (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) { foreach (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.0+dfsg/src/ui/albumcoverchoicecontroller.h000066400000000000000000000111451223327513400235530ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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; // 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 = 0); ~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_; } // 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); // 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); 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_; }; #endif // ALBUMCOVERCHOICECONTROLLER_H clementine-1.2.0+dfsg/src/ui/albumcoverexport.cpp000066400000000000000000000067701223327513400221010ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/ui/albumcoverexport.h000066400000000000000000000033101223327513400215310ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); ~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.0+dfsg/src/ui/albumcoverexport.ui000066400000000000000000000145131223327513400217260ustar00rootroot00000000000000 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.0+dfsg/src/ui/albumcovermanager.cpp000066400000000000000000000621321223327513400221640ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_(NULL), cover_export_(NULL), 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()) { boost::scoped_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); foreach (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); foreach (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(' '); foreach (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 ; ialbums->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; foreach (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() { foreach (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 foreach (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 foreach (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; foreach (const QModelIndex& index, indexes) { ret << GetSongsInAlbum(index); } return ret; } SongMimeData* AlbumCoverManager::GetMimeDataForAlbums(const QModelIndexList& indexes) const { SongList songs = GetSongsInAlbums(indexes); if (songs.isEmpty()) return NULL; 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 ; ialbums->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.0+dfsg/src/ui/albumcovermanager.h000066400000000000000000000121761223327513400216340ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0, 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.0+dfsg/src/ui/albumcovermanager.ui000066400000000000000000000207211223327513400220150ustar00rootroot00000000000000 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.0+dfsg/src/ui/albumcovermanagerlist.cpp000066400000000000000000000042501223327513400230550ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "albumcovermanagerlist.h" #include "library/librarybackend.h" #include "playlist/songmimedata.h" #include #include #include AlbumCoverManagerList::AlbumCoverManagerList(QWidget *parent) : QListWidget(parent), manager_(NULL) { } QMimeData* AlbumCoverManagerList::mimeData(const QList items) const { // Get songs SongList songs; foreach (QListWidgetItem* item, items) { songs << manager_->GetSongsInAlbum(indexFromItem(item)); } if (songs.isEmpty()) return NULL; // Get URLs from the songs QList urls; foreach (const Song& song, songs) { urls << song.url(); } // Get the QAbstractItemModel data so the picture works boost::scoped_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.0+dfsg/src/ui/albumcovermanagerlist.h000066400000000000000000000023231223327513400225210ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); 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.0+dfsg/src/ui/albumcoversearcher.cpp000066400000000000000000000201721223327513400223440ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_(NULL), 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; foreach (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.0+dfsg/src/ui/albumcoversearcher.h000066400000000000000000000051141223327513400220100ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "covers/albumcoverfetcher.h" #include "covers/albumcoverloaderoptions.h" #include #include #include #include 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 = NULL); 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.0+dfsg/src/ui/albumcoversearcher.ui000066400000000000000000000100611223327513400221730ustar00rootroot00000000000000 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.0+dfsg/src/ui/appearancesettingspage.cpp000066400000000000000000000267221223327513400232140ustar00rootroot00000000000000/* 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 ; imoodbar_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.0+dfsg/src/ui/appearancesettingspage.h000066400000000000000000000041331223327513400226510ustar00rootroot00000000000000/* 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.0+dfsg/src/ui/appearancesettingspage.ui000066400000000000000000000231111223327513400230340ustar00rootroot00000000000000 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.0+dfsg/src/ui/backgroundstreamssettingspage.cpp000066400000000000000000000054371223327513400246330ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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")); foreach (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.0+dfsg/src/ui/backgroundstreamssettingspage.h000066400000000000000000000024511223327513400242710ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/ui/backgroundstreamssettingspage.ui000066400000000000000000000017671223327513400244700ustar00rootroot00000000000000 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.0+dfsg/src/ui/behavioursettingspage.cpp000066400000000000000000000160461223327513400230770ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "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_->menu_playmode->setItemData(0, MainWindow::PlayBehaviour_Never); ui_->menu_playmode->setItemData(1, MainWindow::PlayBehaviour_IfStopped); ui_->menu_playmode->setItemData(2, MainWindow::PlayBehaviour_Always); // 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$"); foreach (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 language_name = QLocale::languageToString(QLocale(code).language()); #if QT_VERSION >= 0x040800 QString native_name = QLocale(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_->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("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()); 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::PlayBehaviour menu_playmode = MainWindow::PlayBehaviour( ui_->menu_playmode->itemData(ui_->menu_playmode->currentIndex()).toInt()); 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("menu_playmode", menu_playmode); s.setValue("resume_playback_after_start", ui_->resume_after_start_->isChecked()); 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.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.0+dfsg/src/ui/behavioursettingspage.h000066400000000000000000000023151223327513400225360ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/ui/behavioursettingspage.ui000066400000000000000000000147471223327513400227400ustar00rootroot00000000000000 BehaviourSettingsPage 0 0 516 516 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 Using the menu to add a song will... 0 Never start playing Play if there is nothing already playing Always start playing 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 Qt::Vertical 20 5 clementine-1.2.0+dfsg/src/ui/console.cpp000066400000000000000000000020661223327513400201340ustar00rootroot00000000000000#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.0+dfsg/src/ui/console.h000066400000000000000000000004751223327513400176030ustar00rootroot00000000000000#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 = 0); private slots: void RunQuery(); private: Ui::Console ui_; Application* app_; }; #endif // CONSOLE_H clementine-1.2.0+dfsg/src/ui/console.ui000066400000000000000000000021021223327513400177560ustar00rootroot00000000000000 Console 0 0 545 347 Console Run query run output clementine-1.2.0+dfsg/src/ui/coverfromurldialog.cpp000066400000000000000000000045241223327513400224000ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/ui/coverfromurldialog.h000066400000000000000000000026441223327513400220460ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); ~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.0+dfsg/src/ui/coverfromurldialog.ui000066400000000000000000000055141223327513400222330ustar00rootroot00000000000000 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.0+dfsg/src/ui/dbusscreensaver.cpp000066400000000000000000000030151223327513400216630ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/ui/dbusscreensaver.h000066400000000000000000000021541223327513400213330ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/ui/edittagdialog.cpp000066400000000000000000000651171223327513400213010ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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. foreach (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::Dark); QPalette summary_label_palette(palette()); summary_label_palette.setColor(QPalette::WindowText, light ? color.darker(150) : color.lighter(125)); foreach (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; foreach (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 foreach (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 == "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()); if (id == "artist") current_.set_artist(value.toString()); if (id == "album") current_.set_album(value.toString()); if (id == "albumartist") current_.set_albumartist(value.toString()); if (id == "composer") current_.set_composer(value.toString()); if (id == "performer") current_.set_performer(value.toString()); if (id == "grouping") current_.set_grouping(value.toString()); if (id == "genre") current_.set_genre(value.toString()); if (id == "comment") current_.set_comment(value.toString()); if (id == "track") current_.set_track(value.toInt()); if (id == "disc") current_.set_disc(value.toInt()); if (id == "year") current_.set_year(value.toInt()); } bool EditTagDialog::DoesValueVary(const QModelIndexList& sel, const QString& id) const { QVariant value = data_[sel.first().row()].current_value(id); for (int i=1 ; i(field.editor_)) { editor->clear(); editor->clear_hint(); if (varies) { editor->set_hint(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 foreach (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 foreach (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; foreach (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 foreach (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 foreach (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 NULL; 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 ; iartist() && 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 ; iSaveFileBlocking( 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; foreach (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 ; ioriginal_.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.0+dfsg/src/ui/edittagdialog.h000066400000000000000000000106411223327513400207360ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); ~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 = NULL, QWidget* editor = NULL, 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.0+dfsg/src/ui/edittagdialog.ui000066400000000000000000000772141223327513400211350ustar00rootroot00000000000000 EditTagDialog 0 0 863 635 Edit track information :/icon.png:/icon.png Qt::Horizontal QAbstractItemView::ExtendedSelection 0 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 Edit tags Title title true false Track track 9999 false true Artist artist true false Disc disc 9999 false true Album album true false Year year 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 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.0+dfsg/src/ui/equalizer.cpp000066400000000000000000000251521223327513400204740ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 ; ienable, 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()); } 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)); 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)); 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)); 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 ; iset_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 ; ivalue(); } 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; foreach (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>(QDataStream& s, Equalizer::Params& p) { s >> p.preamp; for (int i=0 ; i> p.gain[i]; return s; } clementine-1.2.0+dfsg/src/ui/equalizer.h000066400000000000000000000047531223327513400201450ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); ~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.0+dfsg/src/ui/equalizer.ui000066400000000000000000000101021223327513400203140ustar00rootroot00000000000000 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.0+dfsg/src/ui/flowlayout.cpp000066400000000000000000000133741223327513400207030ustar00rootroot00000000000000/**************************************************************************** ** ** 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; QLayoutItem *item; foreach (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] QLayoutItem *item; foreach (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.0+dfsg/src/ui/flowlayout.h000066400000000000000000000057271223327513400203530ustar00rootroot00000000000000/**************************************************************************** ** ** 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.0+dfsg/src/ui/globalshortcutgrabber.cpp000066400000000000000000000046651223327513400230620ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/ui/globalshortcutgrabber.h000066400000000000000000000030261223327513400225150ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); ~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.0+dfsg/src/ui/globalshortcutgrabber.mm000066400000000000000000000034661223327513400227070ustar00rootroot00000000000000/* 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 #include #import "core/mac_utilities.h" class MacMonitorWrapper : boost::noncopyable { public: explicit MacMonitorWrapper(id monitor) : local_monitor_(monitor) { } ~MacMonitorWrapper() { [NSEvent removeMonitor: local_monitor_]; } private: id local_monitor_; }; 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.0+dfsg/src/ui/globalshortcutgrabber.ui000066400000000000000000000041601223327513400227030ustar00rootroot00000000000000 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.0+dfsg/src/ui/globalshortcutssettingspage.cpp000066400000000000000000000134041223327513400243250ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 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 { #ifdef Q_OS_MAC qLog(Debug) << Utilities::GetMacVersion(); if (Utilities::GetMacVersion() < 6) { // Leopard and earlier. return false; } #endif 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(); } foreach (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)); } foreach (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() { foreach (const Shortcut& s, shortcuts_.values()) { s.s.action->setShortcut(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 foreach (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.0+dfsg/src/ui/globalshortcutssettingspage.h000066400000000000000000000035061223327513400237740ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_; boost::scoped_ptr grabber_; QSettings settings_; QMap shortcuts_; QString current_id_; }; #endif // GLOBALSHORTCUTSSETTINGSPAGE_H clementine-1.2.0+dfsg/src/ui/globalshortcutssettingspage.ui000066400000000000000000000133151223327513400241610ustar00rootroot00000000000000 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 turn on "<span style=" font-style:italic;">Enable access for assistive devices</span>" to use global shortcuts in Clementine. true Open... QAbstractItemView::NoEditTriggers true false true Name 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.0+dfsg/src/ui/iconloader.cpp000066400000000000000000000027621223327513400206140ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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"); foreach (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.0+dfsg/src/ui/iconloader.h000066400000000000000000000017101223327513400202510ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/ui/macscreensaver.cpp000066400000000000000000000026101223327513400214660ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "core/utilities.h" // kIOPMAssertionTypePreventUserIdleDisplaySleep from Lion. #define kLionDisplayAssertion CFSTR("PreventUserIdleDisplaySleep") MacScreensaver::MacScreensaver() : assertion_id_(0) { } void MacScreensaver::Inhibit() { CFStringRef assertion_type = (Utilities::GetMacVersion() >= 7) ? kLionDisplayAssertion : kIOPMAssertionTypeNoDisplaySleep; IOPMAssertionCreateWithName( assertion_type, kIOPMAssertionLevelOn, CFSTR("Showing full-screen Clementine visualisations"), &assertion_id_); } void MacScreensaver::Uninhibit() { IOPMAssertionRelease(assertion_id_); } clementine-1.2.0+dfsg/src/ui/macscreensaver.h000066400000000000000000000017641223327513400211440ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/ui/macsystemtrayicon.h000066400000000000000000000031571223327513400217170ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "systemtrayicon.h" #include #include class MacSystemTrayIconPrivate; class MacSystemTrayIcon : public SystemTrayIcon, boost::noncopyable { Q_OBJECT public: MacSystemTrayIcon(QObject* parent = 0); ~MacSystemTrayIcon(); void SetupMenu(QAction* previous, QAction* play, QAction* stop, QAction* stop_after, QAction* next, QAction* mute, QAction* love, QAction* ban, 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_; boost::scoped_ptr p_; }; #endif // MACSYSTEMTRAYICON_H clementine-1.2.0+dfsg/src/ui/macsystemtrayicon.mm000066400000000000000000000141471223327513400221020ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 : boost::noncopyable { 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:NULL keyEquivalent:@""]; now_playing_artist_ = [[NSMenuItem alloc] initWithTitle:@"Nothing to see here" action:NULL keyEquivalent:@""]; now_playing_title_ = [[NSMenuItem alloc] initWithTitle:@"Nothing to see here" action:NULL 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_; }; 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* ban, 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); SetupMenuItem(ban); 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.0+dfsg/src/ui/mainwindow.cpp000066400000000000000000002573511223327513400206570ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "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 "engines/enginebase.h" #include "engines/gstengine.h" #include "globalsearch/globalsearch.h" #include "globalsearch/globalsearchview.h" #include "globalsearch/librarysearchprovider.h" #include "internet/magnatuneservice.h" #include "internet/internetmodel.h" #include "internet/internetview.h" #include "internet/internetviewcontainer.h" #include "internet/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 "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 "podcasts/podcastservice.h" #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/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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef Q_OS_WIN32 # include #endif #include #include using boost::shared_ptr; using boost::scoped_ptr; #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 (*)"); 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_(NULL), 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_(new DeviceView(this)), song_info_view_(new SongInfoView(this)), artist_info_view_(new ArtistInfoView(this)), settings_dialog_(NULL), cover_manager_(NULL), equalizer_(new Equalizer), error_dialog_(NULL), organise_dialog_(new OrganiseDialog(app_->task_manager())), queue_manager_(NULL), #ifdef ENABLE_VISUALISATIONS visualisation_(NULL), #endif #ifdef HAVE_WIIMOTEDEV wiimotedev_shortcuts_(NULL), #endif playlist_menu_(new QMenu(this)), playlist_add_to_another_(NULL), playlistitem_actions_separator_(NULL), library_sort_model_(new QSortFilterProxyModel(this)), track_position_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")); 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_, 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(1000); connect(track_position_timer_, SIGNAL(timeout()), SLOT(UpdateTrackPosition())); // 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_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")); // 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_ban, SIGNAL(triggered()), InternetModel::Service(), SLOT(Ban())); connect(ui_->action_love, SIGNAL(triggered()), SLOT(Love())); connect(ui_->action_toggle_scrobbling, SIGNAL(triggered()), InternetModel::Service(), SLOT(ToggleScrobbling())); #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_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())); 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") << QKeySequence::fromString("Ctrl+PgDown")); ui_->action_previous_playlist->setShortcuts(QList() << QKeySequence::fromString("Ctrl+Shift+Tab") << 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_->ban_button->setDefaultAction(ui_->action_ban); 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(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(PlayIndex(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(SeekTrack(int)), ui_->track_slider, SLOT(Seek(int))); connect(ui_->playlist->view(), SIGNAL(BackgroundPropertyChanged()), SLOT(RefreshStyleSheet())); connect(ui_->track_slider, SIGNAL(ValueChanged(int)), app_->player(), SLOT(SeekTo(int))); // 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_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_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); #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 LastFMService* lastfm_service = InternetModel::Service(); connect(lastfm_service, SIGNAL(ButtonVisibilityChanged(bool)), SLOT(LastFMButtonVisibilityChanged(bool))); connect(lastfm_service, SIGNAL(ScrobbleButtonVisibilityChanged(bool)), SLOT(ScrobbleButtonVisibilityChanged(bool))); connect(lastfm_service, SIGNAL(ScrobblingEnabledChanged(bool)), SLOT(ScrobblingEnabledChanged(bool))); connect(lastfm_service, 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_ban, 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 << NULL // spacer << ui_->action_love << ui_->action_ban); #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_->internet_model()->InternetModel::Service(), SLOT(ToggleScrobbling())); #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))); // 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); // 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(InternetModel::Service(), SIGNAL(ScrobbleSubmitted()), SLOT(ScrobbleSubmitted())); connect(InternetModel::Service(), SIGNAL(ScrobbleError(int)), SLOT(ScrobbleError(int))); LastFMButtonVisibilityChanged(app_->internet_model()->InternetModel::Service()->AreButtonsVisible()); ScrobbleButtonVisibilityChanged(app_->internet_model()->InternetModel::Service()->IsScrobbleButtonVisible()); ScrobblingEnabledChanged(app_->internet_model()->InternetModel::Service()->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()); 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()); 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_ban->setEnabled(false); ui_->action_love->setEnabled(false); tray_icon_->LastFMButtonLoveStateChanged(false); tray_icon_->LastFMButtonBanStateChanged(false); track_position_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(); 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 is_lastfm = (app_->player()->GetCurrentItem()->options() & PlaylistItem::LastFMControls); LastFMService* lastfm = InternetModel::Service(); bool enable_ban = lastfm->IsScrobblingEnabled() && is_lastfm; bool enable_love = lastfm->IsScrobblingEnabled(); ui_->action_ban->setEnabled(enable_ban); ui_->action_love->setEnabled(enable_love); tray_icon_->LastFMButtonBanStateChanged(enable_ban); tray_icon_->LastFMButtonLoveStateChanged(enable_love); tray_icon_->SetPlaying(enable_play_pause, enable_ban, enable_love); #else tray_icon_->SetPlaying(enable_play_pause); #endif track_position_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(InternetModel::Service()->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); } bool is_lastfm = (app_->player()->GetCurrentItem()->options() & PlaylistItem::LastFMControls); ui_->action_ban->setEnabled(value && is_lastfm); tray_icon_->LastFMButtonBanStateChanged(value && is_lastfm); ui_->action_love->setEnabled(value); tray_icon_->LastFMButtonLoveStateChanged(value); } #endif void MainWindow::LastFMButtonVisibilityChanged(bool value) { ui_->action_ban->setVisible(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_->internet_model()->InternetModel::Service()->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"; app_->player()->Play(); app_->player()->SeekTo(saved_playback_position_); if (saved_playback_state_ == Engine::Paused) { app_->player()->Pause(); } } 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::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()->current()->StopAfter(app_->playlist_manager()->current()->current_row()); } 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 = item->Metadata().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 ui_->track_slider->SetStopped(); tray_icon_->SetProgress(0); return; } #ifdef HAVE_LIBLASTFM LastFMService* lastfm_service = InternetModel::Service(); const bool last_fm_enabled = ui_->action_toggle_scrobbling->isVisible() && lastfm_service->IsScrobblingEnabled() && lastfm_service->IsAuthenticated(); #endif // Time to scrobble? if (position >= scrobble_point) { if (playlist->get_lastfm_status() == Playlist::LastFM_New) { #ifdef HAVE_LIBLASTFM if (lastfm_service->IsScrobblingEnabled() && lastfm_service->IsAuthenticated()) { qLog(Info) << "Scrobbling at" << scrobble_point; lastfm_service->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(); } } // Update the slider ui_->track_slider->SetValue(position, length); // 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 } } #ifdef HAVE_LIBLASTFM void MainWindow::ScrobbledRadioStream() { ui_->action_love->setEnabled(true); tray_icon_->LastFMButtonLoveStateChanged(true); } void MainWindow::Love() { InternetModel::Service()->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 foreach (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; foreach(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; foreach (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 ++; } 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_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 (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); } 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. foreach(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_ != NULL) { 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")); PlaylistBackend::Playlist playlist; foreach (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; foreach (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() { foreach (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(); } foreach (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(); foreach (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 ; iplaylist->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; foreach (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::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::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: 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; } switch (options.url_list_action()) { case CommandlineOptions::UrlList_Load: app_->playlist_manager()->ClearCurrent(); // fallthrough case CommandlineOptions::UrlList_Append: { MimeData* data = new MimeData; data->setUrls(options.urls()); AddToPlaylist(data); break; } } 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; foreach (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; foreach (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; foreach (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; boost::shared_ptr storage(new FilesystemMusicStorage("/")); // Get selected songs SongList selected_songs; QModelIndexList proxy_indexes = ui_->playlist->view()->selectionModel()->selectedRows(); foreach (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(); foreach (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; foreach (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::PlaylistCopyToDevice() { QModelIndexList proxy_indexes = ui_->playlist->view()->selectionModel()->selectedRows(); SongList songs; foreach (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:") + "
    "; foreach(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(); foreach (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() { foreach (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 LastFMService* lastfm_service = InternetModel::Service(); const bool last_fm_enabled = ui_->action_toggle_scrobbling->isVisible() && lastfm_service->IsScrobblingEnabled() && lastfm_service->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_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) { ui_->track_slider->Seek(-1); event->accept(); } else if(event->key() == Qt::Key_Right) { ui_->track_slider->Seek(1); event->accept(); } else { QMainWindow::keyPressEvent(event); } } clementine-1.2.0+dfsg/src/ui/mainwindow.h000066400000000000000000000225041223327513400203120ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 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 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 = 0); ~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, }; 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); 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 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 ChangeLibraryQueryMode(QAction* action); void PlayIndex(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(); //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 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_; boost::scoped_ptr edit_tag_dialog_; boost::scoped_ptr about_dialog_; GlobalShortcuts* global_shortcuts_; Remote* remote_; GlobalSearchView* global_search_view_; LibraryViewContainer* library_view_; FileView* file_view_; PlaylistListContainer* playlist_list_; InternetViewContainer* internet_view_; DeviceView* device_view_; SongInfoView* song_info_view_; ArtistInfoView* artist_info_view_; boost::scoped_ptr settings_dialog_; boost::scoped_ptr add_stream_dialog_; boost::scoped_ptr cover_manager_; boost::scoped_ptr equalizer_; boost::scoped_ptr transcode_dialog_; boost::scoped_ptr error_dialog_; boost::scoped_ptr organise_dialog_; boost::scoped_ptr queue_manager_; boost::scoped_ptr tag_fetcher_; boost::scoped_ptr track_selection_dialog_; PlaylistItemList autocomplete_tag_items_; #ifdef ENABLE_VISUALISATIONS boost::scoped_ptr visualisation_; #endif #ifdef HAVE_WIIMOTEDEV boost::scoped_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_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_add_to_another_; QList playlistitem_actions_; QAction* playlistitem_actions_separator_; QModelIndex playlist_menu_index_; QSortFilterProxyModel* library_sort_model_; QTimer* track_position_timer_; QSettings settings_; bool was_maximized_; int saved_playback_position_; Engine::State saved_playback_state_; AddBehaviour doubleclick_addmode_; PlayBehaviour doubleclick_playmode_; PlayBehaviour menu_playmode_; BackgroundStreams* background_streams_; }; #endif // MAINWINDOW_H clementine-1.2.0+dfsg/src/ui/mainwindow.ui000066400000000000000000000724101223327513400205010ustar00rootroot00000000000000 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 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 false :/last.fm/ban.png:/last.fm/ban.png Ban Ctrl+B 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 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.0+dfsg/src/ui/networkproxysettingspage.cpp000066400000000000000000000061331223327513400237020ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/ui/networkproxysettingspage.h000066400000000000000000000021661223327513400233510ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/ui/networkproxysettingspage.ui000066400000000000000000000106041223327513400235330ustar00rootroot00000000000000 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.0+dfsg/src/ui/networkremotesettingspage.cpp000066400000000000000000000076101223327513400240150ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 #include #include #include const char* NetworkRemoteSettingsPage::kPlayStoreUrl = "https://play.google.com/store/apps/details?id=de.qspool.clementineremote"; NetworkRemoteSettingsPage::NetworkRemoteSettingsPage(SettingsDialog* dialog) : SettingsPage(dialog), ui_(new Ui_NetworkRemoteSettingsPage) { ui_->setupUi(this); setWindowIcon(IconLoader::Load("ipodtouchicon")); ui_->play_store->installEventFilter(this); } 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()); s.endGroup(); // Get local ip addresses QString ip_addresses; QList addresses = QNetworkInterface::allAddresses(); foreach (const QHostAddress& address, addresses) { // TODO: Add ipv6 support to tinysvcmdns. if (address.protocol() == QAbstractSocket::IPv4Protocol && !address.isInSubnet(QHostAddress::parseSubnet("127.0.0.1/8"))) { qLog(Debug) << "IP:" << address.toString(); 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.endGroup(); if (NetworkRemoteHelper::Instance()) { NetworkRemoteHelper::Instance()->ReloadSettings(); } } clementine-1.2.0+dfsg/src/ui/networkremotesettingspage.h000066400000000000000000000023431223327513400234600ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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: static const char* kPlayStoreUrl; Ui_NetworkRemoteSettingsPage* ui_; }; #endif // NETWORKREMOTESETTINGSPAGE_H clementine-1.2.0+dfsg/src/ui/networkremotesettingspage.ui000066400000000000000000000155661223327513400236610ustar00rootroot00000000000000 NetworkRemoteSettingsPage 0 0 385 528 Network Remote Use a network remote control false Settings 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 Allow a client to download music from this computer. Allow downloads Enter this IP in the App to connect to Clementine. Your IP address: 127.0.0.1 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 clementine-1.2.0+dfsg/src/ui/notificationssettingspage.cpp000066400000000000000000000273301223327513400237620ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_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("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.0+dfsg/src/ui/notificationssettingspage.h000066400000000000000000000032631223327513400234260ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/ui/notificationssettingspage.ui000066400000000000000000000330251223327513400236130ustar00rootroot00000000000000 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 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.0+dfsg/src/ui/organisedialog.cpp000066400000000000000000000241261223327513400214620ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "organisedialog.h" #include "organiseerrordialog.h" #include "ui_organisedialog.h" #include "core/musicstorage.h" #include "core/organise.h" #include "core/tagreaderclient.h" #include #include #include #include #include #include #include #include const int OrganiseDialog::kNumberOfPreviews = 10; 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_->buttonBox->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("Track")] = "track"; tags[tr("Disc")] = "disc"; tags[tr("BPM")] = "bpm"; tags[tr("Year")] = "year"; tags[tr("Genre")] = "genre"; tags[tr("Comment")] = "comment"; tags[tr("Length")] = "length"; tags[tr("Bitrate")] = "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); foreach (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); } int OrganiseDialog::SetSongs(const SongList& songs) { total_size_ = 0; filenames_.clear(); preview_songs_.clear(); foreach (const Song& song, songs) { if (song.url().scheme() != "file") { continue; }; if (song.filesize() > 0) total_size_ += song.filesize(); filenames_ << song.url().toLocalFile(); if (preview_songs_.count() < kNumberOfPreviews) preview_songs_ << song; } ui_->free_space->set_additional_bytes(total_size_); UpdatePreviews(); return filenames_.count(); } int OrganiseDialog::SetUrls(const QList &urls, quint64 total_size) { QStringList filenames; // Only add file:// URLs foreach (const QUrl& url, urls) { if (url.scheme() != "file") continue; filenames << url.toLocalFile(); } return SetFilenames(filenames, total_size); } int OrganiseDialog::SetFilenames(const QStringList& filenames, quint64 total_size) { filenames_ = filenames; preview_songs_.clear(); // Load some of the songs to show in the preview const int n = qMin(filenames_.count(), kNumberOfPreviews); for (int i=0 ; ifree_space->set_additional_bytes(total_size); total_size_ = total_size; UpdatePreviews(); return filenames_.count(); } void OrganiseDialog::LoadPreviewSongs(const QString& filename) { if (preview_songs_.count() >= kNumberOfPreviews) return; if (QFileInfo(filename).isDir()) { QDir dir(filename); QStringList entries = dir.entryList( QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot | QDir::Readable); foreach (const QString& entry, entries) { LoadPreviewSongs(filename + "/" + entry); } return; } Song song; TagReaderClient::Instance()->ReadFileBlocking(filename, &song); if (song.is_valid()) preview_songs_ << song; } void OrganiseDialog::SetCopy(bool copy) { ui_->aftercopying->setCurrentIndex(copy ? 0 : 1); } void OrganiseDialog::InsertTag(const QString &tag) { ui_->naming->insertPlainText("%" + tag); } void OrganiseDialog::UpdatePreviews() { const QModelIndex destination = ui_->destination->model()->index( ui_->destination->currentIndex(), 0); boost::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 && !filenames_.isEmpty(); if (capacity != 0 && total_size_ > free) ok = false; ui_->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(ok); if (!format_valid) return; // Update the previews ui_->preview->clear(); ui_->preview_group->setVisible(has_local_destination); ui_->naming_group->setVisible(has_local_destination); if (has_local_destination) { foreach (const Song& song, preview_songs_) { QString filename = storage->LocalPath() + "/" + format_.GetFilenameForSong(song); 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(true); 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", true).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("destination", ui_->destination->currentText()); s.setValue("eject_after", ui_->eject_after->isChecked()); const QModelIndex destination = ui_->destination->model()->index( ui_->destination->currentIndex(), 0); boost::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(), filenames_, ui_->eject_after->isChecked()); connect(organise, SIGNAL(Finished(QStringList)), SLOT(OrganiseFinished(QStringList))); 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.0+dfsg/src/ui/organisedialog.h000066400000000000000000000042541223327513400211270ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "core/organiseformat.h" #include "core/song.h" #include class LibraryWatcher; class OrganiseErrorDialog; class TaskManager; class Ui_OrganiseDialog; class QAbstractItemModel; class OrganiseDialog : public QDialog { Q_OBJECT public: OrganiseDialog(TaskManager* task_manager, QWidget* parent = 0); ~OrganiseDialog(); static const int kNumberOfPreviews; static const char* kDefaultFormat; static const char* kSettingsGroup; QSize sizeHint() const; void SetDestinationModel(QAbstractItemModel* model, bool devices = false); int SetSongs(const SongList& songs); int SetUrls(const QList& urls, quint64 total_size = 0); int SetFilenames(const QStringList& filenames, quint64 total_size = 0); void SetCopy(bool copy); public slots: void accept(); protected: void showEvent(QShowEvent*); void resizeEvent(QResizeEvent*); private slots: void Reset(); void InsertTag(const QString& tag); void LoadPreviewSongs(const QString& filename); void UpdatePreviews(); void OrganiseFinished(const QStringList& files_with_errors); private: Ui_OrganiseDialog* ui_; TaskManager* task_manager_; OrganiseFormat format_; QStringList filenames_; SongList preview_songs_; quint64 total_size_; boost::scoped_ptr error_dialog_; bool resized_by_user_; }; #endif // ORGANISEDIALOG_H clementine-1.2.0+dfsg/src/ui/organisedialog.ui000066400000000000000000000135761223327513400213240ustar00rootroot00000000000000 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 Preview Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::Reset FreeSpaceBar QWidget
widgets/freespacebar.h
1
LineTextEdit QTextEdit
widgets/linetextedit.h
destination aftercopying eject_after naming insert replace_the replace_spaces replace_ascii overwrite preview buttonBox buttonBox accepted() OrganiseDialog accept() 257 487 157 274 buttonBox rejected() OrganiseDialog reject() 325 487 286 274
clementine-1.2.0+dfsg/src/ui/organiseerrordialog.cpp000066400000000000000000000040661223327513400225350ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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; foreach (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.0+dfsg/src/ui/organiseerrordialog.h000066400000000000000000000024011223327513400221710ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); ~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.0+dfsg/src/ui/organiseerrordialog.ui000066400000000000000000000040541223327513400223650ustar00rootroot00000000000000 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.0+dfsg/src/ui/playbacksettingspage.cpp000066400000000000000000000135641223327513400227030ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_->gst_plugin, SIGNAL(currentIndexChanged(int)), SLOT(GstPluginChanged(int))); 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()); } PlaybackSettingsPage::~PlaybackSettingsPage() { delete ui_; } void PlaybackSettingsPage::Load() { const GstEngine* engine = dialog()->gst_engine(); if (ui_->gst_plugin->count() <= 1 && engine) { GstEngine::PluginDetailsList list = engine->GetOutputsList(); ui_->gst_plugin->setItemData(0, GstEngine::kAutoSink); foreach (const GstEngine::PluginDetails& details, list) { if (details.name == "autoaudiosink") continue; ui_->gst_plugin->addItem(details.long_name, details.name); } ui_->gst_group->setEnabled(true); ui_->replaygain_group->setEnabled(true); } 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(); ui_->gst_plugin->setCurrentIndex(0); for (int i=0 ; igst_plugin->count() ; ++i) { if (ui_->gst_plugin->itemData(i).toString() == sink) { ui_->gst_plugin->setCurrentIndex(i); break; } } ui_->gst_device->setText(s.value("device").toString()); 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()); 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(); s.beginGroup(GstEngine::kSettingsGroup); s.setValue("sink", ui_->gst_plugin->itemData(ui_->gst_plugin->currentIndex()).toString()); s.setValue("device", ui_->gst_device->text()); 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.endGroup(); } void PlaybackSettingsPage::GstPluginChanged(int index) { QString name = ui_->gst_plugin->itemData(index).toString(); bool enabled = GstEngine::DoesThisSinkSupportChangingTheOutputDeviceToAUserEditableString(name); ui_->gst_device->setEnabled(enabled); ui_->gst_device_label->setEnabled(enabled); } 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::FadingOptionsChanged() { ui_->fading_options->setEnabled( ui_->fading_out->isChecked() || ui_->fading_cross->isChecked() || ui_->fading_auto->isChecked()); } clementine-1.2.0+dfsg/src/ui/playbacksettingspage.h000066400000000000000000000023141223327513400223370ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 GstPluginChanged(int index); void FadingOptionsChanged(); void RgPreampChanged(int value); private: Ui_PlaybackSettingsPage* ui_; }; #endif // PLAYBACKSETTINGSPAGE_H clementine-1.2.0+dfsg/src/ui/playbacksettingspage.ui000066400000000000000000000265611223327513400225370ustar00rootroot00000000000000 PlaybackSettingsPage 0 0 596 638 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 false 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 false GStreamer audio engine QFormLayout::AllNonFixedFieldsGrow Output plugin Choose automatically false Output device false Leave blank for the default. Examples: "/dev/dsp", "front", etc. Buffer duration ms 60000 100 Changing mono playback preference will be effective for the next playing songs Mono playback Qt::Vertical 20 114 LineEdit QLineEdit
widgets/lineedit.h
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.0+dfsg/src/ui/qt_blurimage.h000066400000000000000000000016771223327513400206210ustar00rootroot00000000000000/* 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.0+dfsg/src/ui/qtsystemtrayicon.cpp000066400000000000000000000205111223327513400221270ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_(NULL), action_stop_(NULL), action_stop_after_this_track_(NULL), action_mute_(NULL), action_love_(NULL), action_ban_(NULL) { 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* ban, 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()); action_ban_ = menu_->addAction(ban->icon(), ban->text(), ban, SLOT(trigger())); action_ban_->setVisible(ban->isVisible()); action_ban_->setEnabled(ban->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_ban, 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_ban_->setEnabled(enable_ban); 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_ban_->setEnabled(false); action_love_->setEnabled(false); #endif } void QtSystemTrayIcon::LastFMButtonVisibilityChanged(bool value) { #ifdef HAVE_LIBLASTFM action_ban_->setVisible(value); action_love_->setVisible(value); #endif } void QtSystemTrayIcon::LastFMButtonLoveStateChanged(bool value) { #ifdef HAVE_LIBLASTFM action_love_->setEnabled(value); #endif } void QtSystemTrayIcon::LastFMButtonBanStateChanged(bool value) { #ifdef HAVE_LIBLASTFM action_ban_->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 == NULL ? 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.0+dfsg/src/ui/qtsystemtrayicon.h000066400000000000000000000043241223327513400216000ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); ~QtSystemTrayIcon(); void SetupMenu(QAction* previous, QAction* play, QAction* stop, QAction* stop_after, QAction* next, QAction* mute, QAction* love, QAction* ban, 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_ban = false, bool enable_love = false); void SetStopped(); void LastFMButtonVisibilityChanged(bool value); void LastFMButtonLoveStateChanged(bool value); void LastFMButtonBanStateChanged(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_; QAction* action_ban_; QString pattern_; QPixmap orange_icon_; QPixmap grey_icon_; }; #endif // QTSYSTEMTRAYICON_H clementine-1.2.0+dfsg/src/ui/screensaver.cpp000066400000000000000000000037231223327513400210130ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/ui/screensaver.h000066400000000000000000000022661223327513400204610ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/ui/settingsdialog.cpp000066400000000000000000000232451223327513400215140ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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/digitallyimportedsettingspage.h" #include "internet/groovesharksettingspage.h" #include "internet/magnatunesettingspage.h" #include "internet/spotifysettingspage.h" #include "internet/subsonicsettingspage.h" #include "internet/ubuntuonesettingspage.h" #include "library/librarysettingspage.h" #include "playlist/playlistview.h" #include "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/lastfmsettingspage.h" #endif #ifdef HAVE_WIIMOTEDEV # include "wiimotedev/wiimotesettingspage.h" #endif #ifdef HAVE_GOOGLE_DRIVE # include "internet/googledrivesettingspage.h" #endif #ifdef HAVE_UBUNTU_ONE # include "internet/ubuntuonesettingspage.h" #endif #ifdef HAVE_DROPBOX # include "internet/dropboxsettingspage.h" #endif #ifdef HAVE_BOX # include "internet/boxsettingspage.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_(NULL), 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); // Internet providers QTreeWidgetItem* providers = AddCategory(tr("Internet providers")); #ifdef HAVE_LIBLASTFM AddPage(Page_Lastfm, new LastFMSettingsPage(this), providers); #endif AddPage(Page_Grooveshark, new GroovesharkSettingsPage(this), providers); #ifdef HAVE_GOOGLE_DRIVE AddPage(Page_GoogleDrive, new GoogleDriveSettingsPage(this), providers); #endif #ifdef HAVE_UBUNTU_ONE AddPage(Page_UbuntuOne, new UbuntuOneSettingsPage(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 AddPage(Page_Spotify, new SpotifySettingsPage(this), providers); 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); // 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() { foreach (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 foreach (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; foreach (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 foreach (const PageData& data, pages_.values()) { if (data.item_ == item) { ui_->stacked_widget->setCurrentWidget(data.scroll_area_); break; } } } clementine-1.2.0+dfsg/src/ui/settingsdialog.h000066400000000000000000000075771223327513400211730ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); ~SettingsDialog(); enum Page { Page_Playback, Page_Behaviour, Page_SongInformation, Page_GlobalShortcuts, Page_GlobalSearch, Page_Appearance, Page_NetworkRemote, Page_Notifications, Page_Library, Page_Lastfm, Page_Grooveshark, Page_Spotify, Page_Magnatune, Page_DigitallyImported, Page_BackgroundStreams, Page_Proxy, Page_Transcoding, Page_Remote, Page_Wiimotedev, Page_Subsonic, Page_Podcasts, Page_GoogleDrive, Page_UbuntuOne, Page_Dropbox, Page_Skydrive, Page_Box, }; 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 = NULL); 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.0+dfsg/src/ui/settingsdialog.ui000066400000000000000000000070751223327513400213520ustar00rootroot00000000000000 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.0+dfsg/src/ui/settingspage.cpp000066400000000000000000000015631223327513400211700ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/ui/settingspage.h000066400000000000000000000030041223327513400206250ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/ui/standarditemiconloader.cpp000066400000000000000000000062141223327513400232100ustar00rootroot00000000000000/* 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_(NULL) { 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.0+dfsg/src/ui/standarditemiconloader.h000066400000000000000000000035441223327513400226600ustar00rootroot00000000000000/* 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 = 0); 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.0+dfsg/src/ui/systemtrayicon.cpp000066400000000000000000000055701223327513400215720ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_ban, 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.0+dfsg/src/ui/systemtrayicon.h000066400000000000000000000053631223327513400212370ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); // 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* ban, 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 NULL, 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 = 0); public slots: void SetProgress(int percentage); virtual void SetPaused(); virtual void SetPlaying(bool enable_play_pause = false, bool enable_ban = false, bool enable_love = false); virtual void SetStopped(); virtual void LastFMButtonVisibilityChanged(bool value) {} virtual void LastFMButtonLoveStateChanged(bool value) {} virtual void LastFMButtonBanStateChanged(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.0+dfsg/src/ui/trackselectiondialog.cpp000066400000000000000000000223011223327513400226560ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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(); foreach (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 ; isong_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 ; isong_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; foreach (const Song& song, data.results_) { AddSong(song, song_index++, ui_->results); } // Find the item that was selected last time for (int i=0 ; iresults->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 ; iSaveFileBlocking(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(); foreach (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.0+dfsg/src/ui/trackselectiondialog.h000066400000000000000000000042611223327513400223300ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); ~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.0+dfsg/src/ui/trackselectiondialog.ui000066400000000000000000000201341223327513400225130ustar00rootroot00000000000000 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.0+dfsg/src/ui/windows7thumbbar.cpp000066400000000000000000000123731223327513400220020ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_(NULL) { } void Windows7ThumbBar::SetActions(const QList& actions) { #ifdef Q_OS_WIN32 qLog(Debug) << "Setting actions"; Q_ASSERT(actions.count() <= kMaxButtonCount); actions_ = actions; foreach (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_ = NULL; } // 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, NULL, 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_ = NULL; return; } // Add the buttons qLog(Debug) << "Initialising" << actions_.count() << "buttons"; THUMBBUTTON buttons[kMaxButtonCount]; for (int i=0 ; iiId = 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 ; iiId = 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.0+dfsg/src/ui/windows7thumbbar.h000066400000000000000000000033421223327513400214430ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 NULL 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.0+dfsg/src/version.h.in000066400000000000000000000015561223327513400176170ustar00rootroot00000000000000/* 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.0+dfsg/src/visualisations/000077500000000000000000000000001223327513400204225ustar00rootroot00000000000000clementine-1.2.0+dfsg/src/visualisations/projectmpresetmodel.cpp000066400000000000000000000073301223327513400252200ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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)); foreach (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 ; iSetSelected(paths, true); emit dataChanged(index(0, 0), index(rowCount()-1, 0)); } void ProjectMPresetModel::SelectNone() { vis_->ClearSelected(); for (int i=0 ; i Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); 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.0+dfsg/src/visualisations/projectmvisualisation.cpp000066400000000000000000000164421223327513400255730ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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), projectm_(NULL), preset_model_(NULL), mode_(Random), duration_(15), texture_size_(512) { connect(this, SIGNAL(sceneRectChanged(QRectF)), SLOT(SceneRectChanged(QRectF))); for (int i=0 ; ifileName(); // 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(); if (font_path.isNull()) { qWarning("ProjectM presets could not be found, search path was:\n %s", paths.join("\n ").toLocal8Bit().constData()); QMessageBox::warning(NULL, 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_); } void ProjectMVisualisation::ConsumeBuffer(GstBuffer* buffer, int) { const int samples_per_channel = GST_BUFFER_SIZE(buffer) / sizeof(short) / 2; const short* data = reinterpret_cast(GST_BUFFER_DATA(buffer)); if (projectm_) projectm_->pcm()->addPCM16Data(data, samples_per_channel); gst_buffer_unref(buffer); } void ProjectMVisualisation::SetSelected(const QStringList& paths, bool selected) { foreach (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 ; igetPlaylistSize() ; ++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()); projectm_->clearPlaylist(); switch (mode_) { case Random: for (int i=0 ; iall_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()); foreach (const QString& path, paths) { projectm_->addPresetURL(path.toStdString(), std::string(), default_rating_list_); preset_model_->MarkSelected(path, true); } } } } void ProjectMVisualisation::Save() { QStringList paths; foreach (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_); } 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.0+dfsg/src/visualisations/projectmvisualisation.h000066400000000000000000000043021223327513400252300ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); ~ProjectMVisualisation(); enum Mode { Random = 0, FromList = 1, }; QString preset_url() const; ProjectMPresetModel* preset_model() const { return preset_model_; } Mode mode() const { return mode_; } // 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: boost::scoped_ptr projectm_; ProjectMPresetModel* preset_model_; Mode mode_; int duration_; boost::scoped_ptr temporary_font_; std::vector default_rating_list_; int texture_size_; }; #endif // PROJECTMVISUALISATION_H clementine-1.2.0+dfsg/src/visualisations/visualisationcontainer.cpp000066400000000000000000000221031223327513400257210ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_(NULL), vis_(new ProjectMVisualisation(this)), overlay_(new VisualisationOverlay), selector_(new VisualisationSelector(this)), overlay_proxy_(NULL), 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")); 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.0+dfsg/src/visualisations/visualisationcontainer.h000066400000000000000000000053161223327513400253750ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); 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.0+dfsg/src/visualisations/visualisationoverlay.cpp000066400000000000000000000063611223327513400254300ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/visualisations/visualisationoverlay.h000066400000000000000000000032541223327513400250730ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); ~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.0+dfsg/src/visualisations/visualisationoverlay.ui000066400000000000000000000146751223327513400252720ustar00rootroot00000000000000 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.0+dfsg/src/visualisations/visualisationselector.cpp000066400000000000000000000051501223327513400255620ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_(NULL) { 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_->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.0+dfsg/src/visualisations/visualisationselector.h000066400000000000000000000026151223327513400252320ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); ~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.0+dfsg/src/visualisations/visualisationselector.ui000066400000000000000000000066441223327513400254260ustar00rootroot00000000000000 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.0+dfsg/src/widgets/000077500000000000000000000000001223327513400170135ustar00rootroot00000000000000clementine-1.2.0+dfsg/src/widgets/autoexpandingtreeview.cpp000066400000000000000000000100131223327513400241330ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 ; iindex(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.0+dfsg/src/widgets/autoexpandingtreeview.h000066400000000000000000000036611223327513400236130ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); 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.0+dfsg/src/widgets/busyindicator.cpp000066400000000000000000000035141223327513400224010ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/widgets/busyindicator.h000066400000000000000000000024661223327513400220530ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); explicit BusyIndicator(QWidget* parent = 0); ~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.0+dfsg/src/widgets/clickablelabel.cpp000066400000000000000000000016621223327513400224350ustar00rootroot00000000000000/* 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.0+dfsg/src/widgets/clickablelabel.h000066400000000000000000000017671223327513400221100ustar00rootroot00000000000000/* 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 = 0); signals: void Clicked(); protected: void mousePressEvent(QMouseEvent* event); }; #endif // CLICKABLELABEL_H clementine-1.2.0+dfsg/src/widgets/didyoumean.cpp000066400000000000000000000113151223327513400216560ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/widgets/didyoumean.h000066400000000000000000000032531223327513400213250ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/widgets/elidedlabel.cpp000066400000000000000000000020721223327513400217460ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/widgets/elidedlabel.h000066400000000000000000000020631223327513400214130ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); public slots: void SetText(const QString& text); protected: void resizeEvent(QResizeEvent* e); private: void UpdateText(); private: QString text_; }; #endif // ELIDEDLABEL_H clementine-1.2.0+dfsg/src/widgets/equalizerslider.cpp000066400000000000000000000023541223327513400227270ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/widgets/equalizerslider.h000066400000000000000000000022331223327513400223700ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); ~EqualizerSlider(); int value() const; void set_value(int value); signals: void ValueChanged(int value); private: Ui_EqualizerSlider* ui_; }; #endif // EQUALISERSLIDER_H clementine-1.2.0+dfsg/src/widgets/equalizerslider.ui000066400000000000000000000041261223327513400225610ustar00rootroot00000000000000 EqualizerSlider 0 0 33 224 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.0+dfsg/src/widgets/errordialog.cpp000066400000000000000000000033731223327513400220360ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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; foreach (const QString& message, current_messages_) { if (!html.isEmpty()) html += "
"; html += Qt::escape(message); } ui_->messages->setHtml(html); } clementine-1.2.0+dfsg/src/widgets/errordialog.h000066400000000000000000000022021223327513400214710ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); ~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.0+dfsg/src/widgets/errordialog.ui000066400000000000000000000050501223327513400216630ustar00rootroot00000000000000 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.0+dfsg/src/widgets/fancytabwidget.cpp000066400000000000000000000533661223327513400225270ustar00rootroot00000000000000/************************************************************************** ** ** 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_(NULL), stack_(new QStackedLayout), side_widget_(new QWidget), side_layout_(new QVBoxLayout), top_layout_(new QVBoxLayout), use_background_(false), menu_(NULL), 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_ = NULL; 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; foreach (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); foreach (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.0+dfsg/src/widgets/fancytabwidget.h000066400000000000000000000133431223327513400221630ustar00rootroot00000000000000/************************************************************************** ** ** 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 = 0); ~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 = 0); // 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_; boost::scoped_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.0+dfsg/src/widgets/favoritewidget.cpp000066400000000000000000000035371223327513400225520ustar00rootroot00000000000000/* 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.0+dfsg/src/widgets/favoritewidget.h000066400000000000000000000026211223327513400222100ustar00rootroot00000000000000/* 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 = 0); // 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.0+dfsg/src/widgets/fileview.cpp000066400000000000000000000164321223327513400213370ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 *.aac *.wma " "*.mp4 *.spx *.wav *.m3u *.m3u8 *.pls *.xspf " "*.asx *.asxini *.cue *.ape *.wv *.mka *.opus " "*.oga *.mka"; FileView::FileView(QWidget* parent) : QWidget(parent), ui_(new Ui_FileView), model_(NULL), undo_stack_(new QUndoStack(this)), task_manager_(NULL), 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.0+dfsg/src/widgets/fileview.h000066400000000000000000000051271223327513400210030ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); ~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_; boost::shared_ptr storage_; QString lazy_set_path_; QStringList filter_list_; }; #endif // FILEVIEW_H clementine-1.2.0+dfsg/src/widgets/fileview.ui000066400000000000000000000056501223327513400211720ustar00rootroot00000000000000 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.0+dfsg/src/widgets/fileviewlist.cpp000066400000000000000000000115441223327513400222320ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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; foreach (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; foreach (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.0+dfsg/src/widgets/fileviewlist.h000066400000000000000000000033651223327513400217010ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); 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.0+dfsg/src/widgets/forcescrollperpixel.cpp000066400000000000000000000026451223327513400236140ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/widgets/forcescrollperpixel.h000066400000000000000000000023351223327513400232550ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); protected: bool eventFilter(QObject* object, QEvent* event); private: QAbstractItemView* item_view_; }; #endif // FORCESCROLLPERPIXEL_H clementine-1.2.0+dfsg/src/widgets/freespacebar.cpp000066400000000000000000000154331223327513400221470ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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

"); // 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.0+dfsg/src/songinfo/songinfotextview.h000066400000000000000000000026671223327513400227750ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); 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.0+dfsg/src/songinfo/songinfoview.cpp000066400000000000000000000124741223327513400224200ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "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 } SongInfoView::~SongInfoView() { } void SongInfoView::UltimateLyricsParsed() { QFutureWatcher* watcher = static_cast*>(sender()); foreach (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::ResultReady(int id, const SongInfoFetcher::Result& result) { if (id != current_request_id_) return; Clear(); foreach (const CollapsibleInfoPane::Data& data, result.info_) { AddSection(new CollapsibleInfoPane(data, this)); } CollapseSections(); } 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); foreach (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; foreach (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 foreach (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 { foreach (SongInfoProvider* provider, fetcher_->providers()) { if (UltimateLyricsProvider* lyrics = qobject_cast(provider)) { if (lyrics->name() == name) return provider; } } return NULL; } 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; foreach (SongInfoProvider* provider, fetcher_->providers()) { if (UltimateLyricsProvider* lyrics = qobject_cast(provider)) { ret << lyrics; } } qSort(ret.begin(), ret.end(), CompareLyricProviders); return ret; } clementine-1.2.0+dfsg/src/songinfo/songinfoview.h000066400000000000000000000030221223327513400220520ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "songinfobase.h" #include class UltimateLyricsProvider; class UltimateLyricsReader; class SongInfoView : public SongInfoBase { Q_OBJECT public: SongInfoView(QWidget* parent = 0); ~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: void ResultReady(int id, const SongInfoFetcher::Result& result); private: SongInfoProvider* ProviderByName(const QString& name) const; private slots: void UltimateLyricsParsed(); private: boost::scoped_ptr ultimate_reader_; }; #endif // SONGINFOVIEW_H clementine-1.2.0+dfsg/src/songinfo/songkickconcerts.cpp000066400000000000000000000135241223327513400232510ustar00rootroot00000000000000/* 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 = "http://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; foreach (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); foreach (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.0+dfsg/src/songinfo/songkickconcerts.h000066400000000000000000000030011223327513400227030ustar00rootroot00000000000000/* 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/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.0+dfsg/src/songinfo/songkickconcertwidget.cpp000066400000000000000000000104671223327513400242750ustar00rootroot00000000000000/* 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 = "http://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.0+dfsg/src/songinfo/songkickconcertwidget.h000066400000000000000000000031521223327513400237330ustar00rootroot00000000000000/* 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 = 0); ~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.0+dfsg/src/songinfo/songkickconcertwidget.ui000066400000000000000000000052611223327513400241240ustar00rootroot00000000000000 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.0+dfsg/src/songinfo/songplaystats.cpp000066400000000000000000000037701223327513400226150ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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; foreach (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.0+dfsg/src/songinfo/songplaystats.h000066400000000000000000000025341223327513400222570ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); 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.0+dfsg/src/songinfo/tagwidget.cpp000066400000000000000000000075511223327513400216620ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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/lastfmservice.h" #include "internet/internetmimedata.h" #include "internet/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.0+dfsg/src/songinfo/tagwidget.h000066400000000000000000000044711223327513400213250ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); 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.0+dfsg/src/songinfo/ultimatelyricslyric.cpp000066400000000000000000000023451223327513400240140ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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

headers_; const int default_header_height_; int header_spacing_; int header_indent_; int item_indent_; QString header_text_; }; #endif // GROUPEDICONVIEW_H clementine-1.2.0+dfsg/src/widgets/lineedit.cpp000066400000000000000000000134001223327513400213120ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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) { 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.setItalic(true); 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); clear_button_->move(frame_width, (widget_->rect().height() - sz.height()) / 2); reset_button_->move(widget_->width() - frame_width - sz.width() - extra_right_padding_, (widget_->rect().height() - sz.height()) / 2); } LineEdit::LineEdit(QWidget* parent) : QLineEdit(parent), ExtendedEditor(this) { connect(reset_button_, SIGNAL(clicked()), SIGNAL(Reset())); } 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.0+dfsg/src/widgets/lineedit.h000066400000000000000000000113031223327513400207570ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_; }; 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 = 0); // 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*); 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 = 0); // 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 = 0); // 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.0+dfsg/src/widgets/linetextedit.cpp000066400000000000000000000030251223327513400222210ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/widgets/linetextedit.h000066400000000000000000000020131223327513400216620ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); QSize sizeHint() const; QSize minimumSizeHint() const; protected: void keyPressEvent(QKeyEvent* e); }; #endif // LINETEXTEDIT_H clementine-1.2.0+dfsg/src/widgets/loginstatewidget.cpp000066400000000000000000000102331223327513400230730ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 + "")); foreach (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.0+dfsg/src/widgets/loginstatewidget.h000066400000000000000000000041701223327513400225430ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); ~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.0+dfsg/src/widgets/loginstatewidget.ui000066400000000000000000000124551223327513400227360ustar00rootroot00000000000000 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.0+dfsg/src/widgets/multiloadingindicator.cpp000066400000000000000000000054471223327513400241160ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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; foreach (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.0+dfsg/src/widgets/multiloadingindicator.h000066400000000000000000000025751223327513400235620ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); 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.0+dfsg/src/widgets/nowplayingwidget.cpp000066400000000000000000000341761223327513400231250ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "ui/albumcoverchoicecontroller.h" #include "ui/iconloader.h" #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_(NULL), album_cover_choice_controller_(new AlbumCoverChoiceController(this)), mode_(SmallSongDetails), menu_(new QMenu(this)), above_statusbar_action_(NULL), visible_(false), small_ideal_height_(0), 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_(NULL), aww_(false), kittens_(NULL), pending_kitten_(0) { // Load settings QSettings s; s.beginGroup(kSettingsGroup); mode_ = Mode(s.value("mode", SmallSongDetails).toInt()); // 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); menu_->addActions(mode_group->actions()); menu_->addSeparator(); 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())); 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 UpdateHeight(); } 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: cover_loader_options_.desired_height_ = qMin(kMaxCoverSize, width()); total_height_ = kTopBorder + cover_loader_options_.desired_height_ + kBottomOffset; 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: 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; } // 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); } 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&, const QImage& image) { metadata_ = metadata; if (aww_) { pending_kitten_ = kittens_->LoadKitten(app_->current_art_loader()->options()); return; } SetImage(image); } 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_); } // 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 = 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_); } // 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; } } 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); UpdateHeight(); UpdateDetailsText(); update(); QSettings s; s.beginGroup(kSettingsGroup); s.setValue("mode", mode_); } void NowPlayingWidget::resizeEvent(QResizeEvent* e) { if (visible_ && mode_ == LargeSongDetails && e->oldSize() != e->size()) { 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::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::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))); } 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::Bask() { big_hypnotoad_.reset(new FullscreenHypnotoad); 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); } clementine-1.2.0+dfsg/src/widgets/nowplayingwidget.h000066400000000000000000000073101223327513400225600ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "core/song.h" #include "covers/albumcoverloaderoptions.h" #include #include 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 = 0); ~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, }; 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 dragEnterEvent(QDragEnterEvent* e); void dropEvent(QDropEvent* e); private slots: void SetMode(int mode); void ShowAboveStatusBar(bool above); 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 Bask(); 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(); private: Application* app_; AlbumCoverChoiceController* album_cover_choice_controller_; Mode mode_; QMenu* menu_; QAction* above_statusbar_action_; bool visible_; int small_ideal_height_; AlbumCoverLoaderOptions cover_loader_options_; int total_height_; 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_; boost::scoped_ptr hypnotoad_; boost::scoped_ptr big_hypnotoad_; bool aww_; KittenLoader* kittens_; quint64 pending_kitten_; }; #endif // NOWPLAYINGWIDGET_H clementine-1.2.0+dfsg/src/widgets/osd.cpp000066400000000000000000000273531223327513400203160ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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), 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(); 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() { 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::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; } 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 == "%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.0+dfsg/src/widgets/osd.h000066400000000000000000000075401223327513400177570ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "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 # 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 = 0); ~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 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 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 Q_OS_DARWIN class GrowlNotificationWrapper; GrowlNotificationWrapper* wrapper_; #endif // Q_OS_DARWIN #ifdef HAVE_DBUS boost::scoped_ptr interface_; uint notification_id_; QDateTime last_notification_time_; #endif }; #endif // OSD_H clementine-1.2.0+dfsg/src/widgets/osd_mac.mm000066400000000000000000000115401223327513400207540ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 #include #import #include "core/scoped_nsautorelease_pool.h" #include "core/scoped_nsobject.h" @interface GrowlInterface :NSObject { } -(void) SendGrowlAlert:(NSString*)message title:(NSString*)title image:(NSData*)image; -(void) ClickCallback; // Called when user clicks on notification. @end @implementation GrowlInterface -(id) init { if ((self = [super init])) { [GrowlApplicationBridge setGrowlDelegate:self]; } return self; } -(void) dealloc { [super dealloc]; } -(NSDictionary*) registrationDictionaryForGrowl { NSArray* array = [NSArray arrayWithObjects:@"next_track", nil]; // Valid notification names. NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt:1], @"TicketVersion", array, @"AllNotifications", array, @"DefaultNotifications", @"com.davidsansome.clementine", @"ApplicationId", nil]; return dict; } -(void) growlNotificationWasClicked:(id)clickContext { if (clickContext) { [self ClickCallback]; } return; } -(void) SendGrowlAlert:(NSString*)message title:(NSString*)title image:(NSData*)image { [GrowlApplicationBridge notifyWithTitle:title description:message notificationName:@"next_track" iconData:image priority:0 isSticky:NO clickContext:@"click_callback"]; // String sent to our callback. } -(void) ClickCallback { qDebug() << "Growl notification clicked!"; return; } @end class OSD::GrowlNotificationWrapper { public: GrowlNotificationWrapper() { growl_interface_ = [[GrowlInterface alloc] init]; } ~GrowlNotificationWrapper() { [growl_interface_ release]; } void ShowMessage(const QString& summary, const QString& message, const QImage& image) { NSString* mac_message = [[NSString alloc] initWithUTF8String:message.toUtf8().constData()]; NSString* mac_summary = [[NSString alloc] initWithUTF8String:summary.toUtf8().constData()]; NSData* image_data = nil; // Growl expects raw TIFF data. // This is nasty but it keeps the API nice. if (!image.isNull()) { QByteArray tiff_data; QBuffer tiff(&tiff_data); image.save(&tiff, "TIFF"); image_data = [NSData dataWithBytes:tiff_data.constData() length:tiff_data.size()]; } [growl_interface_ SendGrowlAlert:mac_message title:mac_summary image:image_data]; [mac_message release]; [mac_summary release]; } private: GrowlInterface* growl_interface_; ScopedNSAutoreleasePool pool_; }; void OSD::Init() { wrapper_ = new GrowlNotificationWrapper; } bool OSD::SupportsNativeNotifications() { return true; } bool OSD::SupportsTrayPopups() { return false; } namespace { bool NotificationCenterSupported() { return NSClassFromString(@"NSUserNotificationCenter"); } void SendNotificationCenterMessage(NSString* title, NSString* subtitle) { Class clazz = NSClassFromString(@"NSUserNotificationCenter"); id notification_center = [clazz defaultUserNotificationCenter]; Class user_notification_class = NSClassFromString(@"NSUserNotification"); id notification = [[user_notification_class alloc] init]; [notification setTitle: title]; [notification setSubtitle: subtitle]; [notification_center deliverNotification: notification]; } } void OSD::ShowMessageNative(const QString& summary, const QString& message, const QString& icon, const QImage& image) { Q_UNUSED(icon); if (NotificationCenterSupported()) { 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()); } else { wrapper_->ShowMessage(summary, message, image); } } clementine-1.2.0+dfsg/src/widgets/osd_win.cpp000066400000000000000000000021031223327513400211550ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/widgets/osd_x11.cpp000066400000000000000000000105731223327513400210030ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "osd.h" #include "core/logging.h" #include #ifdef HAVE_DBUS #include "dbus/notification.h" #include #include using boost::scoped_ptr; 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) { scoped_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.0+dfsg/src/widgets/osdpretty.cpp000066400000000000000000000321211223327513400215530ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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(); move(qBound(0, x, geometry.right() - width()), qBound(0, y, geometry.bottom() - height())); // 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.0+dfsg/src/widgets/osdpretty.h000066400000000000000000000076441223327513400212340ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); ~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.0+dfsg/src/widgets/osdpretty.ui000066400000000000000000000045021223327513400214100ustar00rootroot00000000000000 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.0+dfsg/src/widgets/prettyimage.cpp000066400000000000000000000157271223327513400220650ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_(NULL) { 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.0+dfsg/src/widgets/prettyimage.h000066400000000000000000000035401223327513400215200ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); 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.0+dfsg/src/widgets/prettyimageview.cpp000066400000000000000000000117651223327513400227560ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_indexcount() - 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.0+dfsg/src/widgets/prettyimageview.h000066400000000000000000000032751223327513400224200ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); 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.0+dfsg/src/widgets/progressitemdelegate.cpp000066400000000000000000000026501223327513400237400ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/widgets/progressitemdelegate.h000066400000000000000000000021001223327513400233730ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; }; #endif // PROGRESSITEMDELEGATE_H clementine-1.2.0+dfsg/src/widgets/ratingwidget.cpp000066400000000000000000000106351223327513400222140ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 ; idrawPixmap(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.0+dfsg/src/widgets/ratingwidget.h000066400000000000000000000033011223327513400216510ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); 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.0+dfsg/src/widgets/renametablineedit.cpp000066400000000000000000000023761223327513400232030ustar00rootroot00000000000000/* 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.0+dfsg/src/widgets/renametablineedit.h000066400000000000000000000021011223327513400226320ustar00rootroot00000000000000/* 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 = 0); signals: void EditingCanceled(); public slots: protected: void focusOutEvent(QFocusEvent* e); void keyPressEvent(QKeyEvent* e); }; #endif // RENAMETABLINEEDIT_H clementine-1.2.0+dfsg/src/widgets/sliderwidget.cpp000066400000000000000000000243031223327513400222070ustar00rootroot00000000000000/*************************************************************************** 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( ":volumeslider-inset.png" )) { setFocusPolicy( Qt::NoFocus ); // BEGIN Calculate handle animation pixmaps for mouse-over effect QImage pixmapHandle ( ":volumeslider-handle.png" ); QImage pixmapHandleGlow( ":volumeslider-handle_glow.png" ); float opacity = 0.0; const float step = 1.0 / ANIM_MAX; QImage dst; for ( int i = 0; i < ANIM_MAX; ++i ) { dst = pixmapHandle.copy(); QPainter p(&dst); p.setOpacity(opacity); p.drawImage(0, 0, pixmapHandleGlow); p.end(); m_handlePixmaps.append( QPixmap::fromImage( dst ) ); opacity += step; } // END 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() ); 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 p.setPen( palette().color( QPalette::Disabled, QPalette::Text ).dark() ); QFont font; font.setPixelSize( 9 ); p.setFont( 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(); } clementine-1.2.0+dfsg/src/widgets/sliderwidget.h000066400000000000000000000111121223327513400216460ustar00rootroot00000000000000/*************************************************************************** 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(); 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; QList m_handlePixmaps; }; } #endif clementine-1.2.0+dfsg/src/widgets/stickyslider.cpp000066400000000000000000000022261223327513400222320ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/widgets/stickyslider.h000066400000000000000000000026601223327513400217010ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); 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.0+dfsg/src/widgets/stretchheaderview.cpp000066400000000000000000000177611223327513400232530ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 10; 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))); } 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& sections) { if (!stretch_enabled_) return; ColumnWidthType total_w = 0.0; for (int i=0 ; i 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); AssertMinimalColumnWidth(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 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 logical_sections_to_resize; for (int i=0 ; 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 other_columns; for (int i=0 ; i> 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 pixel_widths; QList visual_indices; for (int i=0 ; i Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); 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: // If the width of the given column is less than a sensible threshold, resize // it to make it bigger. Workaround for a QHeaderView oddity that means a // column can be visible but with a width of 0. void AssertMinimalColumnWidth(int logical); // 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.0+dfsg/src/widgets/stylehelper.cpp000066400000000000000000000174231223327513400220660ustar00rootroot00000000000000/************************************************************************** ** ** 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; foreach (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; ydrawPixmap(targetRect.topLeft() - offset, cache); } } // namespace Utils clementine-1.2.0+dfsg/src/widgets/stylehelper.h000066400000000000000000000057211223327513400215310ustar00rootroot00000000000000/************************************************************************** ** ** 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.0+dfsg/src/widgets/trackslider.cpp000066400000000000000000000111201223327513400220210ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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/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_(NULL), setting_value_(false), show_remaining_time_(true), slider_maximum_value_(0) { ui_->setupUi(this); QFont font("Courier"); ui_->elapsed->setFont(font); ui_->remaining->setFont(font); 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_->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); ui_->slider->setValue(elapsed); setting_value_ = false; UpdateTimes(elapsed); } 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() - elapsed)); } else { //check if slider maximum value is changed before updating if (slider_maximum_value_ != ui_->slider->maximum()) { slider_maximum_value_ = ui_->slider->maximum(); ui_->remaining->setText(Utilities::PrettyTime(ui_->slider->maximum())); } } 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); } void TrackSlider::ValueMaybeChanged(int value) { if (setting_value_) return; UpdateTimes(value); emit ValueChanged(value); } 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()); //save this setting QSettings s; s.beginGroup(kSettingsGroup); s.setValue("show_remaining_time", show_remaining_time_); } clementine-1.2.0+dfsg/src/widgets/trackslider.h000066400000000000000000000034541223327513400215010ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); ~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); 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.0+dfsg/src/widgets/trackslider.ui000066400000000000000000000032701223327513400216630ustar00rootroot00000000000000 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.0+dfsg/src/widgets/tracksliderpopup.cpp000066400000000000000000000134231223327513400231150ustar00rootroot00000000000000/* 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.0+dfsg/src/widgets/tracksliderpopup.h000066400000000000000000000031171223327513400225610ustar00rootroot00000000000000/* 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.0+dfsg/src/widgets/tracksliderslider.cpp000066400000000000000000000064031223327513400232340ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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/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(), maximum(), 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::UpdateDeltaTime() { if (popup_->isVisible()) { int delta_seconds = mouse_hover_seconds_ - value(); popup_->SetSmallText(Utilities::PrettyTimeDelta(delta_seconds)); } } clementine-1.2.0+dfsg/src/widgets/tracksliderslider.h000066400000000000000000000024471223327513400227050ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); protected: void mousePressEvent(QMouseEvent* e); void mouseReleaseEvent(QMouseEvent* e); void mouseMoveEvent(QMouseEvent* e); void enterEvent(QEvent*); void leaveEvent(QEvent*); private slots: void UpdateDeltaTime(); private: TrackSliderPopup* popup_; int mouse_hover_seconds_; }; #endif // TRACKSLIDERSLIDER_H clementine-1.2.0+dfsg/src/widgets/widgetfadehelper.cpp000066400000000000000000000116061223327513400230260ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/widgets/widgetfadehelper.h000066400000000000000000000026111223327513400224670ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/wiimotedev/000077500000000000000000000000001223327513400175215ustar00rootroot00000000000000clementine-1.2.0+dfsg/src/wiimotedev/consts.h000066400000000000000000000264651223327513400212200ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/wiimotedev/shortcuts.cpp000066400000000000000000000147651223327513400223000ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_iface_(NULL), 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; foreach (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.0+dfsg/src/wiimotedev/shortcuts.h000066400000000000000000000047311223327513400217350ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = 0); 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_; boost::scoped_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.0+dfsg/src/wiimotedev/wiimotesettingspage.cpp000066400000000000000000000254601223327513400243270ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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) { foreach (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; foreach (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(""); foreach (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.0+dfsg/src/wiimotedev/wiimotesettingspage.h000066400000000000000000000033161223327513400237700ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/src/wiimotedev/wiimotesettingspage.ui000066400000000000000000000144131223327513400241560ustar00rootroot00000000000000 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.0+dfsg/src/wiimotedev/wiimoteshortcutgrabber.cpp000066400000000000000000000100431223327513400250210ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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))); } foreach (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.0+dfsg/src/wiimotedev/wiimoteshortcutgrabber.h000066400000000000000000000033301223327513400244670ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_; boost::scoped_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.0+dfsg/src/wiimotedev/wiimoteshortcutgrabber.ui000066400000000000000000000063221223327513400246610ustar00rootroot00000000000000 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.0+dfsg/tests/000077500000000000000000000000001223327513400157205ustar00rootroot00000000000000clementine-1.2.0+dfsg/tests/CMakeLists.txt000066400000000000000000000121711223327513400204620ustar00rootroot00000000000000cmake_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=0) 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(organiseformat_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) #if(LINUX AND HAVE_DBUS) # add_test_file(mpris1_test.cpp true) #endif(LINUX AND HAVE_DBUS) clementine-1.2.0+dfsg/tests/albumcoverfetcher_test.cpp000066400000000000000000000051531223327513400231670ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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(NULL, 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_, NULL); 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.0+dfsg/tests/albumcovermanager_test.cpp000066400000000000000000000047241223327513400231640ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_(NULL, &cover_providers_, NULL, &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.0+dfsg/tests/asxiniparser_test.cpp000066400000000000000000000040061223327513400221730ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_(NULL) {} 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.0+dfsg/tests/asxparser_test.cpp000066400000000000000000000103601223327513400214730ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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(NULL); 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(NULL); 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(NULL); 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(NULL); 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(NULL); 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.0+dfsg/tests/closure_test.cpp000066400000000000000000000064701223327513400211460ustar00rootroot00000000000000#include "gtest/gtest.h" #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; boost::scoped_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::tr1::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); } #ifdef HAVE_LAMBDAS TEST(ClosureTest, ClosureCallsLambda) { TestQObject sender; bool called = false; NewClosure( &sender, SIGNAL(Emitted()), [&called] () { called = true; }); EXPECT_FALSE(called); sender.Emit(); EXPECT_TRUE(called); } #endif // HAVE_LAMBDAS clementine-1.2.0+dfsg/tests/concurrentrun_test.cpp000066400000000000000000000076051223327513400224020ustar00rootroot00000000000000#include "gtest/gtest.h" #include #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::tr1::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.0+dfsg/tests/cueparser_test.cpp000066400000000000000000000264771223327513400214740ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_(NULL) { } // 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.0+dfsg/tests/data/000077500000000000000000000000001223327513400166315ustar00rootroot00000000000000clementine-1.2.0+dfsg/tests/data/beep.flac000066400000000000000000000250001223327513400203700ustar00rootroot00000000000000fLaC" @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.0+dfsg/tests/data/beep.m4a000066400000000000000000000062511223327513400201530ustar00rootroot00000000000000ftypisomisomiso2mp41freemdat6libfaac 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.0+dfsg/tests/data/beep.mp3000066400000000000000000000147261223327513400201770ustar00rootroot00000000000000ID3TIT2 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.0+dfsg/tests/data/beep.wav000066400000000000000000003000541223327513400202650ustar00rootroot00000000000000RIFF$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.0+dfsg/tests/data/brokensong.cue000066400000000000000000000004041223327513400214740ustar00rootroot00000000000000PERFORMER "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.0+dfsg/tests/data/fmpsplaycount.mp3000066400000000000000000000147261223327513400221700ustar00rootroot00000000000000ID3TIT2 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 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.0+dfsg/tests/data/secretagent.pls000066400000000000000000000014601223327513400216560ustar00rootroot00000000000000[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.0+dfsg/tests/data/test.asx000066400000000000000000000002751223327513400203310ustar00rootroot00000000000000foobar Foo Bar mumble mumble clementine-1.2.0+dfsg/tests/data/test.asxini000066400000000000000000000001621223327513400210240ustar00rootroot00000000000000[Reference] Ref1=http://195.245.168.21/antena3?MSWMExt=.asf Ref2=http://195.245.168.21:80/antena3?MSWMExt=.asf clementine-1.2.0+dfsg/tests/data/test.m3u000066400000000000000000001161571223327513400202510ustar00rootroot00000000000000#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.0+dfsg/tests/data/test.xspf000066400000000000000000000004441223327513400205140ustar00rootroot00000000000000 http://example.com/foo.mp3 Foo Bar Baz 60000 http://example.com/albumcover.jpg http://example.com clementine-1.2.0+dfsg/tests/data/testdata.qrc000066400000000000000000000021341223327513400211510ustar00rootroot00000000000000 beep.flac beep.mp3 beep.ogg beep.spx beep.wav beep.wma beep.m4a brokensong.cue 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 secretagent.asx secretagent.pls test.m3u test.xspf test.asx test.asxini twosongs.cue withdatafiles.cue clementine-1.2.0+dfsg/tests/data/twosongs.cue000066400000000000000000000003251223327513400212120ustar00rootroot00000000000000PERFORMER "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.0+dfsg/tests/data/withdatafiles.cue000066400000000000000000000007621223327513400221640ustar00rootroot00000000000000FILE 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.0+dfsg/tests/database_test.cpp000066400000000000000000000122431223327513400212310ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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/database.h" #include #include #include #include class DatabaseTest : public ::testing::Test { protected: virtual void SetUp() { database_.reset(new MemoryDatabase); } boost::scoped_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 = NULL; Database::FTSOpen(NULL, "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 = NULL; Database::FTSOpen(NULL, "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 = NULL; Database::FTSOpen(NULL, "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 = NULL; const char* query = "Снег"; Database::FTSOpen(NULL, 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 = NULL; Database::FTSOpen(NULL, "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.0+dfsg/tests/fileformats_test.cpp000066400000000000000000000045411223327513400220020ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 = NULL; } 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 = NULL; 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.0+dfsg/tests/fmpsparser_test.cpp000066400000000000000000000171131223327513400216500ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/tests/librarybackend_test.cpp000066400000000000000000000234331223327513400224440ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "library/librarybackend.h" #include "library/library.h" #include "core/song.h" #include "core/database.h" #include #include #include #include #include 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; } boost::shared_ptr database_; boost::scoped_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.0+dfsg/tests/librarymodel_test.cpp000066400000000000000000000254401223327513400221550ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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/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(), NULL)); 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); } boost::shared_ptr database_; boost::scoped_ptr backend_; boost::scoped_ptr model_; boost::scoped_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.0+dfsg/tests/logging_env.h000066400000000000000000000017461223327513400203770ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/tests/m3uparser_test.cpp000066400000000000000000000127201223327513400214060ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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_(NULL) { } 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(NULL); 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(NULL); 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(NULL); 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(NULL); 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(NULL); 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(NULL); 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.0+dfsg/tests/main.cpp000066400000000000000000000024511223327513400173520ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/tests/mergedproxymodel_test.cpp000066400000000000000000000127761223327513400230660ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/tests/metatypes_env.h000066400000000000000000000026311223327513400207560ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/tests/mock_backgroundthread.h000066400000000000000000000031571223327513400224170ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/tests/mock_engine.h000066400000000000000000000030311223327513400203440ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/tests/mock_librarybackend.h000066400000000000000000000046471223327513400220710ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/tests/mock_networkaccessmanager.cpp000066400000000000000000000071561223327513400236540ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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), NULL)). WillOnce(Return(reply)); return reply; } MockNetworkReply::MockNetworkReply() : data_(NULL) { } 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.0+dfsg/tests/mock_networkaccessmanager.h000066400000000000000000000043241223327513400233130ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/tests/mock_player.h000066400000000000000000000040361223327513400204010ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/tests/mock_playlistitem.cpp000066400000000000000000000015611223327513400221600ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/tests/mock_playlistitem.h000066400000000000000000000027071223327513400216300ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/tests/mock_playlistmanager.h000066400000000000000000000063641223327513400223070ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/tests/mock_settingsprovider.h000066400000000000000000000035131223327513400225170ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/tests/mock_sqldriver.h000066400000000000000000000055211223327513400211200ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/tests/mpris1_test.cpp000066400000000000000000000164301223327513400207020ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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/encoding.h" #include "core/mpris1.h" #include "core/song.h" #include "playlist/playlistmanager.h" #include "playlist/playlistsequence.h" #ifdef HAVE_LIBLASTFM #include "internet/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_; boost::scoped_ptr sequence_; }; TEST_F(Mpris1BasicTest, CreatesDBusService) { EXPECT_FALSE(QDBusConnection::sessionBus().interface()-> isServiceRegistered(service_name())); boost::scoped_ptr mpris( new mpris::Mpris1(&player_, NULL, NULL, 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_, NULL, NULL, service_name())); } boost::scoped_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.0+dfsg/tests/organiseformat_test.cpp000066400000000000000000000112021223327513400224770ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/tests/playlist_test.cpp000066400000000000000000000407311223327513400213310ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "library/libraryplaylistitem.h" #include "playlist/playlist.h" #include "mock_settingsprovider.h" #include "mock_playlistitem.h" #include #include using boost::shared_ptr; using ::testing::Return; namespace { class PlaylistTest : public ::testing::Test { protected: PlaylistTest() : playlist_(NULL, NULL, NULL, 1), sequence_(NULL, 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.0+dfsg/tests/plsparser_test.cpp000066400000000000000000000106451223327513400215040ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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/timeconstants.h" #include "playlistparsers/plsparser.h" #include #include #include #include #include #include using boost::shared_ptr; class PLSParserTest : public ::testing::Test { protected: PLSParserTest() : parser_(NULL) {} 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.0+dfsg/tests/resources_env.h000066400000000000000000000020221223327513400207470ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/tests/scopedtransaction_test.cpp000066400000000000000000000046331223327513400232140ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/tests/song_test.cpp000066400000000000000000000177771223327513400204540ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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/lastfmcompat.h" #endif #include "gmock/gmock.h" #include "gtest/gtest.h" #include "test_utils.h" #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, 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, 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()); } #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.0+dfsg/tests/songloader_test.cpp000066400000000000000000000254141223327513400216260ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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 "mock_librarybackend.h" #include "core/songloader.h" #include "engines/gstengine.h" #include #include #include #include #include #include #include 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 = NULL; } protected: void SetUp() { library_.reset(new MockLibraryBackend); loader_.reset(new SongLoader(library_.get())); 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; boost::scoped_ptr loader_; boost::scoped_ptr library_; }; const char* SongLoaderTest::kRemoteUrl = "http://remotetestdata.clementine-player.org"; GstEngine* SongLoaderTest::sGstEngine = NULL; 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.0+dfsg/tests/songplaylistitem_test.cpp000066400000000000000000000037451223327513400231030ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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/songplaylistitem.h" #include "test_utils.h" #include #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_; boost::scoped_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.0+dfsg/tests/test_utils.cpp000066400000000000000000000041051223327513400206230ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/tests/test_utils.h000066400000000000000000000043121223327513400202700ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/tests/testobjectdecorators.cpp000066400000000000000000000017021223327513400226600ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 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.0+dfsg/tests/testobjectdecorators.h000066400000000000000000000020321223327513400223220ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/tests/translations_test.cpp000066400000000000000000000023111223327513400222010ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/tests/utilities_test.cpp000066400000000000000000000027271223327513400215060ustar00rootroot00000000000000 /* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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); } clementine-1.2.0+dfsg/tests/xspfparser_test.cpp000066400000000000000000000110631223327513400216610ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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(NULL); 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(NULL); 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(NULL); 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(NULL); 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(NULL); 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.0+dfsg/tests/zeroconf_test.cpp000066400000000000000000000020611223327513400213070ustar00rootroot00000000000000#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.0+dfsg/tools/000077500000000000000000000000001223327513400157165ustar00rootroot00000000000000clementine-1.2.0+dfsg/tools/ultimate_lyrics_parser/000077500000000000000000000000001223327513400225035ustar00rootroot00000000000000clementine-1.2.0+dfsg/tools/ultimate_lyrics_parser/CMakeLists.txt000066400000000000000000000004501223327513400252420ustar00rootroot00000000000000cmake_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.0+dfsg/tools/ultimate_lyrics_parser/main.cpp000066400000000000000000000122261223327513400241360ustar00rootroot00000000000000/* This file is part of Clementine. Copyright 2010, David Sansome Clementine is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Clementine is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 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.0+dfsg/tools/ultimate_lyrics_parser/sites.js000066400000000000000000000437561223327513400242070ustar00rootroot00000000000000/* 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: '